Publishing Your App
Third-party apps are submitted and deployed via GitHub. This gives code review, CI/CD, and audit trails for free.
How it works
- You build your app in your own private GitHub repo
- You grant read access to the Saaslivery GitHub org
- You submit via
apps.saaslivery.com/developers - Automated CI validates your app
- The platform team reviews your code
- Approved apps deploy to staging, then production
Repository structure
Your app lives in its own repo. On the platform side, it's mounted as a git submodule:
microcessor/ (platform — private)
├── apps/ (core apps)
├── plugins/ (third-party apps)
│ ├── acme-invoices/ ← submodule → your private repo
│ ├── bob-timetrack/ ← submodule → bob's private repo
│ └── ...
Developers never see each other's source code. Each developer owns their private repo.
Pre-submission checklist
Before submitting, verify your app meets all platform requirements:
- [ ]
manifest.pyhas all required fields (name,slug,publisher,version,description,plugin) - [ ] Slug follows naming rules (lowercase, alphanumeric + hyphens, starts with a letter, max 30 chars)
- [ ]
plugin.pyusesApp(debug=False) - [ ]
plugin.pydoes NOT registerASSETS(), CORS, or sessions - [ ] UI routes are on the wildcard subdomain under the
/app/{slug}/prefix, never a named subdomain - [ ] All handlers are type-annotated:
(req: Request, res: Response, ctx: Context) - [ ] All status codes use
HTTPStatusconstants - [ ] Templates are flat in
templates/, namespaced viaapp.TEMPLATES(..., prefix="{slug}") - [ ] Protected routes have entries in
authz.py, and handlers read pre-loaded resources fromctx.authz - [ ] Maximum 10 tables in
migrations/, all migrations idempotent - [ ] All tables include a
workspace_idcolumn, and every raw query filters on it - [ ] All emitted events are declared in the manifest
- [ ] Event names use
ext.{publisher}.{app}.*namespace - [ ] All event handlers are idempotent
- [ ] No direct imports from other apps
- [ ] No JavaScript build step
- [ ] HTMX for server interactions, Alpine.js only for client-side logic
- [ ] API routes namespaced under
/{slug}/* - [ ] Tests pass via Earth test client
Submission flow
1. Build your app
Follow the project structure and the manifest spec.
2. Register as a developer
Create a developer account at apps.saaslivery.com/developers. Choose your publisher ID — this is globally unique and permanent.
3. Grant repo access
Add the Saaslivery GitHub bot (or org) as a read-only collaborator on your repo.
4. Submit
Fill out the submission form at apps.saaslivery.com/developer/apps/new:
- Repo URL
- Long description (Markdown, max 5000 chars)
- Up to 5 screenshots
- Category and tags
5. Automated CI runs
The platform validates:
| Check | What it verifies |
|---|---|
| Manifest validation | Required fields, slug format, event naming |
| Table count | Max 10 tables in migrations/ |
| Debug mode | App(debug=False) in plugin.py |
| Slug collision | No conflict with reserved subdomains or existing apps |
| Event namespace | Events use ext.{publisher}.* |
| Forbidden imports | No cross-app imports |
| Type annotations | Handlers are properly annotated |
| Platform overrides | No ASSETS/CORS/sessions registration |
6. Code review
The platform team reviews your code for security, quality, and compliance.
7. Staging deployment
Approved apps are added as a submodule and auto-deployed to staging for QA.
8. Production deployment
After QA passes, the submodule ref is updated on the main branch and auto-deployed to production. Your app appears on the marketplace.
Updates
- Push updates to your repo
- Open an "update request" via the developer dashboard (or webhook)
- CI re-validates the new code
- Platform team reviews (automated-only for patch versions)
- Approved updates deploy through the same staging → production pipeline
Revenue
For paid apps, the revenue split is:
| Party | Share |
|---|---|
| You (developer) | 80% |
| Saaslivery | 20% |
Payouts are monthly, 30 days after the billing period closes. Minimum payout: $50 (rolls over).
Track your revenue at apps.saaslivery.com/developer/revenue:
- Total revenue across all published apps
- Per-app breakdown by pricing dimension
- Install counts and active workspaces
- Payout history