Skip to content

App Registries

App registries allow you to deploy and distribute Flows apps within your organization or publicly. A registry is simply a collection of JSON files hosted on a web server that describe available apps and their versions.

App registries provide:

  • Centralized distribution: Host apps on any web server (S3, GitHub Pages, etc.)
  • Version management: Support multiple versions of each app with semantic versioning
  • Automatic updates: Flows periodically checks registries for new versions
  • Checksum verification: Ensures artifact integrity with SHA-256 checksums

Organizations automatically subscribe to the official Core and Community registries, but you can create and subscribe to custom registries for internal or third-party apps.

A registry consists of two types of JSON files:

  1. Registry manifest - The main index file listing all apps
  2. App metadata files - Individual files for each app containing version information

The registry manifest is a JSON file at the root URL of your registry:

{
"apps": {
"my-app": {
"name": "My App",
"description": "A custom app for internal workflows",
"blockStyle": {
"iconUrl": "https://my-registry.example.com/apps/my-app/icon.png",
"color": "#3B82F6"
},
"appMetadataUrl": "https://my-registry.example.com/apps/my-app/versions.json"
},
"another-app": {
"name": "Another App",
"description": "Another useful app",
"blockStyle": {
"iconUrl": "https://my-registry.example.com/apps/another-app/icon.svg",
"color": "#10B981"
},
"appMetadataUrl": "https://my-registry.example.com/apps/another-app/versions.json"
}
}
}

Fields:

  • apps: Object mapping app keys to app information
    • App key: Unique identifier for the app (used in URLs, must be URL-safe)
    • name: Display name shown in the UI
    • description: Brief description of the app’s functionality
    • blockStyle: Visual styling for the app’s blocks
      • iconUrl: URL to the app icon (PNG or SVG)
      • color: Hex color code for the block background
    • appMetadataUrl: URL to the app’s version metadata file

Each app has a metadata file listing its available versions:

{
"versions": [
{
"version": "1.0.0",
"artifactUrl": "https://my-registry.example.com/apps/my-app/1.0.0.tar.gz",
"artifactChecksum": "sha256:a1b2c3d4e5f6..."
},
{
"version": "1.1.0",
"artifactUrl": "https://my-registry.example.com/apps/my-app/1.1.0.tar.gz",
"artifactChecksum": "sha256:f6e5d4c3b2a1..."
}
]
}

Fields:

  • versions: Array of version objects (order doesn’t matter)
    • version: Semantic version string (e.g., “1.2.3”)
    • artifactUrl: URL to download the .tar.gz artifact
    • artifactChecksum: SHA-256 checksum in the format sha256:HEX_STRING

You can host your registry on any static file server:

  • Amazon S3: Simple, scalable storage with CloudFront CDN
  • GitHub Pages: Free hosting for public registries
  • Azure Blob Storage: Enterprise-grade storage with CDN
  • Your own web server: Any HTTP server can serve JSON files

Build your app artifacts using flowctl:

Terminal window
# Create a tarball of your app
flowctl version bundle -e main.ts -o my-app-1.0.0.tar.gz

This creates a .tar.gz file containing your app code.

Generate SHA-256 checksums for your artifacts:

Terminal window
# macOS/Linux
shasum -a 256 my-app-1.0.0.tar.gz
# Output: a1b2c3d4e5f6... my-app-1.0.0.tar.gz

Format the checksum as sha256:HEX_STRING for the metadata file.

Create the app metadata file (versions.json):

{
"versions": [
{
"version": "1.0.0",
"artifactUrl": "https://my-registry.example.com/apps/my-app/1.0.0.tar.gz",
"artifactChecksum": "sha256:a1b2c3d4e5f6..."
}
]
}

Create the main registry manifest file:

{
"apps": {
"my-app": {
"name": "My App",
"description": "Description of my app",
"blockStyle": {
"iconUrl": "https://my-registry.example.com/apps/my-app/icon.png",
"color": "#3B82F6"
},
"appMetadataUrl": "https://my-registry.example.com/apps/my-app/versions.json"
}
}
}

Upload all files to your hosting service:

my-registry.example.com/
├── registry.json # Main manifest
└── apps/
└── my-app/
├── icon.png # App icon
├── versions.json # App metadata
└── 1.0.0.tar.gz # App artifact

If hosting on S3 or another origin, configure CORS headers to allow Flows to fetch the files:

{
"CORSRules": [
{
"AllowedOrigins": ["*"],
"AllowedMethods": ["GET", "HEAD"],
"AllowedHeaders": ["*"]
}
]
}

Here’s a complete example using GitHub Pages:

my-flows-registry/
├── index.json # Main manifest (served as root)
└── apps/
└── my-app/
├── icon.svg
├── versions.json
├── 1.0.0.tar.gz
└── 1.1.0.tar.gz
{
"apps": {
"my-app": {
"name": "My App",
"description": "Internal workflow automation app",
"blockStyle": {
"iconUrl": "https://myorg.github.io/my-flows-registry/apps/my-app/icon.svg",
"color": "#6366F1"
},
"appMetadataUrl": "https://myorg.github.io/my-flows-registry/apps/my-app/versions.json"
}
}
}
{
"versions": [
{
"version": "1.0.0",
"artifactUrl": "https://myorg.github.io/my-flows-registry/apps/my-app/1.0.0.tar.gz",
"artifactChecksum": "sha256:abc123..."
},
{
"version": "1.1.0",
"artifactUrl": "https://myorg.github.io/my-flows-registry/apps/my-app/1.1.0.tar.gz",
"artifactChecksum": "sha256:def456..."
}
]
}
  1. Create a repository with your registry files
  2. Enable GitHub Pages in repository settings
  3. Set source to the main branch
  4. Access your registry at https://myorg.github.io/my-flows-registry/index.json

Once your registry is set up, subscribe your organization to it through the Flows UI or API.

  1. Navigate to SettingsApp Registries
  2. Click Subscribe to Registry
  3. Enter your registry URL (e.g., https://my-registry.example.com/registry.json)
  4. Provide a name for the registry
  5. Click Subscribe

Flows will automatically refresh the registry and make apps available for installation.

Terminal window
curl -X POST https://flows.example.com/api/registries/subscribe \
-H "Content-Type: application/json" \
-d '{
"url": "https://my-registry.example.com/registry.json",
"name": "My Internal Registry"
}'

To publish a new version of an app:

  1. Build the artifact:

    Terminal window
    flowctl version bundle -e main.ts -o my-app-1.2.0.tar.gz
  2. Calculate checksum:

    Terminal window
    shasum -a 256 my-app-1.2.0.tar.gz
  3. Update versions.json:

    {
    "versions": [
    {
    "version": "1.2.0",
    "artifactUrl": "https://my-registry.example.com/apps/my-app/1.2.0.tar.gz",
    "artifactChecksum": "sha256:NEW_CHECKSUM"
    }
    ]
    }
  4. Upload files: Upload the new artifact and updated versions.json

Flows automatically checks for updates hourly and will discover the new version.

  • Always use HTTPS: Protect artifacts and metadata in transit
  • Verify checksums: Flows automatically verifies checksums to prevent tampering
  • Access control: Use signed URLs or authentication if hosting sensitive apps
  • CORS configuration: Only allow necessary origins if possible
  • Semantic versioning: Follow SemVer for predictable version management
  • Immutable artifacts: Never modify published artifacts; publish new versions instead
  • Directory structure: Keep a clean, organized structure for maintainability
  • Documentation: Include a README in your registry repository
  • Use a CDN: CloudFront, Fastly, or similar for faster global access
  • Compress artifacts: Use gzip compression for artifacts (already done by tar.gz)
  • Cache headers: Set appropriate cache headers for JSON files (e.g., Cache-Control: public, max-age=300)
  • Keep all versions: Don’t delete old versions users may depend on
  • Document breaking changes: Note major version changes in descriptions
  • Test before publishing: Validate artifacts work before adding to registry
  • Gradual rollout: Test new versions in development before promoting

Flows includes two official registries:

  • Core Registry (https://registry.useflows.com/core): Official apps maintained by Spacelift
  • Community Registry (https://registry.useflows.com/community): Community-contributed apps

All organizations are automatically subscribed to these registries upon creation.

  • Check that your registry URL is accessible via HTTPS
  • Verify CORS headers are configured correctly
  • Ensure JSON files are valid (use a JSON validator)
  • Check Flows logs for specific error messages
  • Verify you’re using SHA-256 (not SHA-1 or MD5)
  • Ensure the format is exactly sha256:HEX_STRING (all lowercase)
  • Check that the artifact file wasn’t modified after checksum calculation
  • Recalculate the checksum and update the metadata
  • Verify the icon URL is accessible via HTTPS
  • Check that CORS headers allow the Flows domain
  • Ensure the image format is PNG or SVG
  • Keep icon files under 1MB for best performance
  • Verify the app key is URL-safe (alphanumeric, hyphens, underscores)
  • Check that appMetadataUrl is correct and accessible
  • Ensure at least one valid version exists in the versions array
  • Validate all version strings follow semantic versioning