Apps, Postgres, secrets, and email in one cloud

The platform for your apps, your data, and your agents.

It starts with a Postgres database — and deepens from there. Branch it like code, fork a whole environment for every pull request, deploy the app that runs on it, and hand the work to an agent. One platform, from the database up.

A full environment per pull request Tickets your agents work from
feature-cart pr-241 nightly main
flicker
$ flicker branch ensure --ref pr-241 --ttl 2h
 forking Postgres from maindone
 resolving env preview/pr-24112 secrets
 rewiring DATABASE_URL · MEILI_URL · S3_ENDPOINT
 deploying app … running
Environment "pr-241" live → https://foodfeed-pr-241.flickercloud.com
  reaps in 2h00m

01 · Managed Postgres

It starts with a real database.

Every project begins with stock, isolated PostgreSQL on dedicated compute — not a fork, not a rewrite. Your extensions, real psql, and real pg_dump just work. Continuous backups give you point-in-time recovery, proven by an automated weekly restore drill.

flicker
$ flicker database create app
 provisioning Postgres … ready
$ flicker ext enable vector
 extension enabled · connect with a standard string
$ psql "$DATABASE_URL" -c '\dx'

02 · Copy-on-write branching

Branch it like code.

Fork a database with copy-on-write: a branch shares its parent's blocks until you change them, so even a large database forks quickly and stores only the diff — no logical dump, nothing copied up front. Reset re-forks from the parent, and you can fork from any branch, not just main. Idle branches scale to zero, so a spare branch costs almost nothing.

Time to fork a database
Under a minute
Storage for an untouched fork
≈ 0 bytes
Added storage as it diverges
Just the diff
main 14.2 GB
shares blocks, copies on write
feature +8 MB
preview +2 MB

03 · Branch a whole environment

Branching isn't just the database.

Describe your stack once. From then on, one call in CI forks the whole thing for a pull request — a copy-on-write Postgres branch, the deployed app, its own scoped secrets, and every dependent service — rewired to point at each other. Live in about a minute, and it tears itself down when the PR closes.

Isolated

Its own database, app, secrets, and services. Break it, seed it, drop a table — nothing else is touched, and prod's secrets never reach it.

Automatic

One idempotent command per GitHub event. Re-runs converge instead of duplicating, so a retried job never makes a mess.

Ephemeral

Every environment carries a TTL and reaps itself. Even if CI crashes, you never leak a preview database, a secret bundle, or its cost.

Read the docs: how an environment is wired and rewired

04 · What's in an environment

Config that can't leak into the wrong place.

An environment holds more than data — it holds your secrets, in named scopes that inherit. Set a key once on a parent; override it on one child and only that child diverges. A preview or dev environment may never inherit from production — refused at write time. Restricted secrets are write-only, and every deploy seals an immutable bundle, so you always know exactly what config shipped.

Inheritance

production root · STRIPE_KEY, DATABASE_URL
dev inherits production-safe defaults
dev/giovanni overrides FEATURE_X only
preview/pr-42 scoped bundle · can't inherit production
SecretBundle · deploy #284 immutable

12 keys resolved · sealed at cutover · audit of record

05 · Apps

Push an app; its database is already wired.

An app and a database in the same project auto-wire DATABASE_URL — you never set it. Cutover is a rolling update: the new version only takes traffic once it's up, so a failed release leaves the current one serving. Every deploy stamps its exact image in an immutable history you can roll back to. No nginx, no deploy YAML.

Read the docs: deploy lifecycle & rollback
Deploy #284 a1f29c · main

Building

Dockerfile · build secrets

done

Release

release_command · migrations

done

Running

rolling cutover · new version up

done

Succeeded

https://foodfeed.app — live

live
Roll back to any prior image one click

Add a backing service. Get the env vars for free.

Deploy a search engine, cache, or object store from a curated catalog. Flicker generates the credentials, provisions a persistent volume, and injects a canonical set of connection keys into your app — no URL to copy, no secret to paste. And they re-fork with every branch.

Meilisearch

MEILI_URL · MEILI_MASTER_KEY

ClickHouse

CLICKHOUSE_URL · USER · PASSWORD

Qdrant

QDRANT_URL · QDRANT_API_KEY

RabbitMQ

AMQP · management

MongoDB

persistent volume

MariaDB

MYSQL_URL · USER

Grafana

dashboards · volume

…and more

17 in the catalog

06 · Tickets

Track the work in the same system that runs it.

Flicker Tickets are recursive work items — four states, named transitions — carrying append-only documents (contracts, review, release) and searchable memory across every ticket. So a person or an agent picks work up from the system of record instead of reconstructing it from chat.

Read the docs: the Tickets model
flicker
$ flicker ticket create "Implement checkout"
 created ticket #42 in backlog
$ flicker ticket document write 42 task_contract
 wrote task_contract v1
$ flicker memory search "checkout conflict" --json
 source_class: current_document

07 · Skills & automated workflows

Hand the whole task to an agent.

First-party skills for Claude Code, Pi, and Codex run the delivery loop as automated workflows — plan, implement, test, release. Each step lands on a ticket as a versioned document, every decision searchable in memory, so the next run picks up from the record. /flicker-ship runs the whole loop autonomously within safety rails.

View the public skills on GitHub

plan

contract

implement

branch · PR

test

review

release

merge

/flicker-ship runs every stage — danger zones escalate to you.

claude code
 /flicker-ship 128
  branch → PR #41 → review clean → tests green
  merged → deployed

08 · Email

It sends your product's mail, too.

Verify a sending domain with DKIM and SPF, then POST /mail/send from any app — no separate email provider to bolt on. Every message and its delivery state lands in one searchable log.

flicker
$ curl -s .../api/v1/mail/send \
    -d from=noreply@acme.com -d to=jo@acme.com \
    -d subject=Welcome -d text=Welcome
 from noreply@acme.com (DKIM ok)
 queued msg_8f3a1csent

09 · Volumes & the assistant

Persistent storage — and an assistant that knows your data.

Give any service a volume that survives every deploy and re-forks with a branch. Then point the assistant at your buckets, a git repo, or your project's tickets — Flicker embeds them into a private knowledge base and answers with hybrid retrieval (pgvector semantic search fused with Postgres full-text via Reciprocal Rank Fusion), grounded in your own content, not the model's guess.

Read the docs: the assistant & retrieval
assistant
 How does branch reset keep the connection string working?
  hybrid search buckets · repo · tickets … 5 passages · RRF

Reset re-forks the branch from its parent and rotates its
endpoint credentials, so the same connection string keeps
working — no app change needed.
  grounded in branch.ex · env-secrets-and-connectivity.md

10 · One CLI

One binary drives all of it.

A single static binary runs the same commands on your laptop and in CI — branch a full environment with a TTL, deploy, set versioned secrets, toggle extensions. Idempotent, and a failed step exits non-zero, so a pipeline never leaks a preview or hides a failure.

Full CLI reference & getting started
.github/workflows/preview.yml
on: pull_request

steps:
  # full env for this PR — app + data + secrets, auto-expires
  - run: flicker branch ensure --ref pr-$PR --ttl 2h -y
  - run: ./test.sh # test against the branch
  - run: flicker deploy --from-local
  - run: flicker branch destroy --ref pr-$PR -y

Run your whole stack on Flicker.

Start with a database, branch a full environment for every pull request, deploy the app on it, and track the work in Tickets. One CLI or the dashboard.