Skip to main content
Everything the GitHub workflows do lives in the repo, so any machine that runs Docker can do it. Each routine clones the repo, does one thing, commits what it wrote and exits. The container keeps nothing between runs, and nothing listens on a port: it only calls out to GitHub, Appeeky, the stores and, when you set their keys, Claude and fal.

Images

Each release also publishes :<version> and :<version>-agent. To build it yourself from the repo: docker build -f docker/Dockerfile -t appeeky-spec . (--build-arg AGENT=1 for the agent).

Routines

Pick one as the container command or with MODE=<routine>.

On your own server

Put docker/docker-compose.yml and a .env filled from docker/.env.example in one folder:
The first log lines show the schedule and where push starts following main. Any Linux VM works; the routines run for a minute and exit, so the smallest plan is enough. Give the weekly review a little more memory. For more than one app, copy the service and give each its own env file.

.env

What each own key does and costs: On your own keys.

How push works

push remembers the last commit it handled as the appeeky-spec/pushed tag in the repo. Replace the machine and it carries on from there.
  • The first run only sets the tag. Whatever is on main today is never pushed; only merges after that are.
  • When a merge adds social drafts or UGC briefs, it sends the posts and makes the clips (--local when FAL_KEY is set), then commits.
  • When a merge changes appeeky/store/ or appeeky.spec.yaml, it runs push --yes with the commit subject as the note, and commits the release.
  • A change the store cannot take yet (a new name or subtitle without a new App Store version) keeps the tag where it was, so the next run tries again once the version exists. A failed run also leaves the tag.

Railway and Fly.io

Deploy the same image as a worker with no public port, set the variables from the .env file as service variables, and use schedule as the start command. It behaves exactly like the VM. Render and other container hosts work the same way.

With a scheduler you already have

Cron, Cloud Run Jobs, a Kubernetes CronJob, Railway cron: run one routine per job.

A safe first week