Skip to content
@calycode/cli docs
GitHub Discord

Git Workflow for Xano Projects

This guide covers version control best practices for Xano projects using Xano Tools.

Table of Contents

Overview

Xano Tools enables Git-based version control for your Xano backend by:

  • Exporting workspace schema - Database structure, API definitions
  • Extracting XanoScript - Human-readable function code
  • Generating documentation - OpenAPI specs, API docs
  • Supporting automation - CI/CD pipelines

Initial Setup

1. Install and Initialize CLI

Bash
# Install globally
npm install -g @calycode/cli

# Initialize with your Xano instance
caly-xano init

# Follow prompts to configure:
# - Instance name
# - Xano URL
# - Metadata API token
# - Output directory

2. Generate Initial Repository

Bash
# Generate complete repository structure
caly-xano generate repo \
  --instance production \
  --workspace main \
  --branch live

# Initialize Git
cd your-project-directory
git init
git add .
git commit -m "Initial Xano workspace export"

3. Set Up Remote

Bash
# Add remote repository
git remote add origin https://github.com/your-org/xano-backend.git
git push -u origin main

Repository Generation

The generate repo Command

Bash
caly-xano generate repo [options]

Options:

OptionDescription
--instance <name>Xano instance name
--workspace <name>Workspace name
--branch <name>Xano branch
--output <dir>Output directory
--fetchForce fresh fetch from Xano
--print-output-dirPrint output path

Generated Structure

Code
project/
├── schema/
│   └── workspace-schema.json    # Full workspace schema
├── xanoscript/
│   ├── functions/               # Function stacks
│   ├── apis/                    # API groups and endpoints
│   ├── tables/                  # Table definitions
│   ├── addons/                  # Addons
│   ├── tasks/                   # Scheduled tasks
│   ├── middleware/              # Middleware
│   └── triggers/                # Triggers
├── openapi/
│   └── spec.json                # OpenAPI specification
└── docs/
    └── api-docs.html            # Generated documentation

XanoScript Extraction

For just XanoScript (lighter weight):

Bash
caly-xano generate xanoscript \
  --instance production \
  --workspace main \
  --branch live

Branching Strategy

Recommended Model

Code
main (production)
│
├── staging (pre-production)
│
├── develop (integration)
│   ├── feature/user-auth
│   ├── feature/api-v2
│   └── feature/payment
│
└── hotfix/critical-fix

Branch Mapping

Map Git branches to Xano branches:

Git BranchXano BranchPurpose
mainliveProduction
stagingstagingPre-production testing
developdevelopIntegration
feature/*dev or feature branchesDevelopment

Creating Feature Branches

Bash
# Create Git branch
git checkout -b feature/new-api

# Work in corresponding Xano branch
# (Use Calycode Extension for branch management)

# Export changes
caly-xano generate xanoscript --branch dev

# Commit
git add .
git commit -m "Add new API endpoints"

Daily Workflow

Morning Sync

Bash
# Pull latest changes
git pull origin develop

# Check for updates from Xano
caly-xano generate xanoscript --branch develop

# Review changes
git status
git diff

After Making Changes in Xano

Bash
# Export your changes
caly-xano generate repo --branch develop

# Review what changed
git status
git diff

# Commit with descriptive message
git add .
git commit -m "feat: add user profile endpoint

- Added GET /users/profile endpoint
- Added update profile functionality
- Added validation for profile fields"

# Push to remote
git push origin feature/user-profile

Before Merging

Bash
# Run tests
caly-xano test run -c ./tests/config.json --branch develop --ci

# Generate fresh docs
caly-xano generate docs

# Final export
caly-xano generate repo --branch develop

# Commit any doc changes
git add .
git commit -m "docs: update API documentation"

CI/CD Integration

GitHub Actions Example

YAML
# .github/workflows/xano-sync.yml
name: Xano Sync

on:
   schedule:
      - cron: '0 */6 * * *' # Every 6 hours
   workflow_dispatch: # Manual trigger

jobs:
   sync:
      runs-on: ubuntu-latest
      steps:
         - uses: actions/checkout@v4

         - name: Setup Node.js
           uses: actions/setup-node@v4
           with:
              node-version: '20'

         - name: Install Xano CLI
           run: npm install -g @calycode/cli

         - name: Generate Repository
           env:
              XANO_TOKEN_PRODUCTION: ${{ secrets.XANO_TOKEN }}
           run: |
              caly-xano generate repo \
                --instance production \
                --workspace main \
                --branch live \
                --fetch

         - name: Check for Changes
           id: changes
           run: |
              if [[ -n $(git status --porcelain) ]]; then
                echo "has_changes=true" >> $GITHUB_OUTPUT
              fi

         - name: Commit Changes
           if: steps.changes.outputs.has_changes == 'true'
           run: |
              git config user.name "GitHub Actions"
              git config user.email "[email protected]"
              git add .
              git commit -m "sync: update from Xano production"
              git push

Test on Pull Request

YAML
# .github/workflows/test.yml
name: API Tests

on:
   pull_request:
      branches: [main, develop]

jobs:
   test:
      runs-on: ubuntu-latest
      steps:
         - uses: actions/checkout@v4

         - uses: actions/setup-node@v4
           with:
              node-version: '20'

         - name: Install Xano CLI
           run: npm install -g @calycode/cli

         - name: Run Tests
           env:
              XANO_TOKEN_STAGING: ${{ secrets.XANO_TOKEN_STAGING }}
              XANO_TEST_EMAIL: ${{ secrets.TEST_EMAIL }}
              XANO_TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
           run: |
              caly-xano test run \
                -c ./tests/config.json \
                --instance staging \
                --workspace main \
                --branch staging \
                --all \
                --ci

Documentation Deployment

YAML
# .github/workflows/docs.yml
name: Deploy Docs

on:
   push:
      branches: [main]

jobs:
   deploy:
      runs-on: ubuntu-latest
      steps:
         - uses: actions/checkout@v4

         - uses: actions/setup-node@v4
           with:
              node-version: '20'

         - name: Install Xano CLI
           run: npm install -g @calycode/cli

         - name: Generate Documentation
           env:
              XANO_TOKEN_PRODUCTION: ${{ secrets.XANO_TOKEN }}
           run: caly-xano generate docs

         - name: Deploy to GitHub Pages
           uses: peaceiris/actions-gh-pages@v3
           with:
              github_token: ${{ secrets.GITHUB_TOKEN }}
              publish_dir: ./docs

Best Practices

Commit Messages

Follow conventional commits:

Code
type(scope): description

Types:
- feat: New feature
- fix: Bug fix
- docs: Documentation
- refactor: Code refactoring
- test: Tests
- sync: Xano sync

Examples:
- feat(api): add user authentication endpoints
- fix(auth): correct token expiration handling
- docs: update API documentation
- sync: update from Xano production

What to Commit

Do commit:

  • XanoScript files (.xs)
  • Schema exports (JSON)
  • OpenAPI specifications
  • Documentation
  • Test configurations
  • CI/CD workflows

Don't commit:

  • Secrets or API tokens
  • Environment-specific configurations
  • Temporary files
  • Build artifacts

.gitignore

gitignore
# Environment
.env
.env.*

# Secrets
**/secrets/
*.secret

# Build
node_modules/
dist/

# Temporary
*.tmp
*.log

# IDE
.vscode/
.idea/

Environment Variables

Store tokens securely:

Bash
# Local development (.env - not committed)
XANO_TOKEN_PRODUCTION=your-token-here
XANO_TOKEN_STAGING=your-staging-token

# CI/CD - use secrets management
# GitHub: Settings > Secrets > Actions
# GitLab: Settings > CI/CD > Variables

Code Review Checklist

Before merging:

  • XanoScript exported and committed
  • Tests pass (caly-xano test run --ci)
  • Documentation updated
  • No secrets in code
  • Follows naming conventions
  • Dependencies documented

Troubleshooting

Common Issues

IssueSolution
"Instance not found"Run caly-xano init to configure
"Authentication failed"Check XANO_TOKEN_* env vars
Merge conflicts in JSONRegenerate from Xano, resolve manually
Missing XanoScriptEnsure Xano 2.0+ for XanoScript support

Regenerating After Conflicts

Bash
# Discard local changes
git checkout -- .

# Fresh export from Xano
caly-xano generate repo --fetch

# Review and commit
git add .
git commit -m "sync: regenerate from Xano"

Resources