A neutral look at one design choice
Supabase, and a small always-on worker beside it
What the worker is good for, and the places where you do not need one.
Written for a team that already runs on Supabase and a native Mac app. No sales pitch. Each slide stands on its own.
The question
Two views, and each is right about something
"Supabase can run everything."
True for data, sign-in, live updates, and short jobs that run on a schedule or when a row changes. It is hosted, always on, and looked after for you.
"A small always-on worker is also needed."
True when work has to happen while nobody has the app open, or needs a fixed address, one home for secrets, or a job that runs for a long time.
Which view fits depends on what your app does when nobody is looking at it. The next slides walk through that, one situation at a time.
Quick glossary
Six words used in this deck
Credit where it is due
What Supabase already does for you
Data
A proper database for clients, walls, drafts and the "Needs you" queue.
Sign-in
Accounts and logins for the whole team and for client portal users.
Row-level security
Rules for who can see which rows, so one client never sees another's.
Realtime
Changes appear live in every open Mac app.
Scheduled jobs
pg_cron runs a task at set times inside the database.
Database webhooks
Triggers react when a row is added or changed.
Edge Functions
Small pieces of server code that run on request.
Storage
Files such as documents and images, with the same access rules.
Side by side
The Mac app alone, or the Mac app plus a worker
Works while people are using it
- Chat with Archie, the AI teammate
- Archie drafts on request
- Humans approve in "Needs you"
- Simple, fewer moving parts
Each agent run happens on the laptop of whoever asked.
Also works when nobody is there
- Overnight and weekend work continues
- One address for Slack, email and the portal
- One home for keys, rules and run records
- One more small server to look after
Neither is "better". They fit different amounts of automatic, unattended work.
The shape
One small worker sits beside Supabase and does the unattended work
Macs talk to Supabase as before. The worker is one more client of Supabase that never sleeps.
An example day
While the laptops sleep, the work still gets done
Illustrative day. Times are examples, not measurements.
Situation 1 of 13 · Scheduled tasks
Some work has to start at a set time
Think of a morning client summary, a weekly report, or a nightly tidy-up. A cron job is an alarm clock for software. It needs something awake to hear it.
Situation 2 of 13 · Incoming messages
Messages from outside need an address that is always there
A webhook is a message that another service pushes to a web address. A laptop has no steady address and may be asleep when the message lands.
Situation 3 of 13 · Sleeping laptops
Laptops close. The work should not stop.
An agent that lives on one person's Mac stops when the lid shuts, the Wi-Fi drops, or the system updates.
Situation 4 of 13 · Secrets
Keys live in one place, not on every laptop
Tip: this picture scrolls sideways on a phone.
A gateway is one doorway that holds the keys and makes the outside calls for everyone. Change a key once, not on every machine.
Situation 5 of 13 · One owner per job
Two laptops should never act on the same event
Tip: this picture scrolls sideways on a phone.
If a job fails, it goes back in line and is tried again, up to a set number of tries. Nothing is sent twice.
Situation 6 of 13 · Long jobs
Some agent jobs take longer than a short function allows
Tip: this picture scrolls sideways on a phone.
Research, large reports, multi-step work. Archie can keep going on a worker and save progress along the way.
Situation 7 of 13 · Audit trail
The server writes the record, not whichever laptop ran it
A record kept on a laptop can be missing, edited, or lost with the machine. A record written by the server is complete and in one place.
Situation 8 of 13 · Testing on every push
Tests run on every push, with the same result for everyone
A git runner is a machine that checks the code each time it changes. "It works on my Mac" stops being the end of the discussion.
Situation 9 of 13 · Agents in branches
Agents work on their own copy, away from your files
Tip: this picture scrolls sideways on a phone.
A branch is a separate copy of the work. Agents try changes there, and a person approves before anything joins the main version.
Situation 10 of 13 · Shared service agents
Some helpers should always be on duty
Email inbox agent
Reads new mail, sorts it, drafts replies for a human to approve.
Slack reply agent
Answers team questions in the channel at any hour.
Client portal agent
Handles requests that clients make through their portal.
API and integration agents
Keep outside systems in step with your data.
Research and report jobs
Gather facts in the background and have a report ready.
Situation 11 of 13 · Support triage
A request at 2am should still reach a person who can act
An agent sorts requests, answers the simple ones, and alerts the person on call for emergencies. If nobody acknowledges, it moves to the next person.
Situation 12 of 13 · Same rules for all
The same rules apply to every person and every agent
Tip: this picture scrolls sideways on a phone.
A harness is the setup around an AI model. Kept in one place, its rules apply the same way to automatic work as to work a person starts.
Situation 13 of 13 · Health checks
Someone should notice when something stops
The same check can watch for jobs stuck in the queue and for runs that keep failing.
Another option
Hosted agent services versus a small worker
Claude hosted runs, OpenAI hosted runs, Supabase Edge Functions and cron
Good at:
- Quickest way to start
- Nothing to maintain or patch
- The vendor runs and scales it
Trade-offs:
- Tied to one vendor and its sandbox
- Time limits, no persistent file system (Edge Functions)
- Keys and rules sit with each vendor
One small server you control
Good at:
- Mix Claude, GPT and local models per job
- Rules and keys kept in one place
- Can still call hosted agents where they are good enough
Trade-offs:
- Someone looks after it
- You set up the health check yourself
These are not rivals. A worker can hand a job to a hosted agent when that is the simplest fit.
Being honest
Where you do not need a worker
The app only reacts while someone has it open
Chat, a draft on request, the approve queue. Everything starts with a person.
No scheduled or event-driven work
Nothing needs to start by itself at a set time or when something arrives.
Jobs are short
They fit an Edge Function or pg_cron and finish quickly.
Nothing comes in from outside
No Slack, email or portal events that need a steady address.
If this describes how you work today, Supabase on its own is a sound choice.
The short version
When you need a worker, and when you can skip it
- Work must run while laptops are closed
- Outside services must reach you at a fixed address
- Jobs run longer than a short function allows
- You want one home for keys, rules and run records
- On-call alerts must not depend on a laptop
- The app is only used live, by people
- All jobs are short and fit Supabase
- No outside events need handling yet
- You would rather not own another server
- Hosted agents already cover what you need
It is also fine to start without one and add it when a real need shows up.
If you do add one
A suggested minimal starting setup
- Supabase stays the source of truth.Data, sign-in and the queue stay where they are.
- The Mac app stays a client.Nothing changes for people using it.
- One small worker.It picks up jobs from a Supabase table, runs the agent, and writes results and run records back.
- Secrets only on the worker.None on the Macs.
- A simple health ping and an alert.So a person hears if it stops.
- Add pieces only when a real need shows up.
In one line
Same data, same app. One question decides it.
Does any work need to happen when nobody has the app open?
No
Supabase plus the Mac app is complete. Keep it simple.
Yes
Add one small worker beside Supabase, and let it do only that work.
Not sure
Start without one. The setup on the previous slide can be added later without redoing anything.