Slate
Client and project management for freelance agencies — and the software Dockyard runs itself on.
- Surfaces
- Platform, agency, client
- Billing
- Time and materials, milestone, fixed price, retainer
- Isolation
- Enforced in the query layer, on the page and on the socket
- Hosting
- One image: web, worker, live board
- Dogfood
- Dockyard runs its own agency on it

Slate covers the whole shape of agency work: projects, a task board, time tracking, quotes, milestones, approvals, invoicing, payments, and a client portal the client actually logs into.
Three tiers, three surfaces
The platform vendor, the agency, and the agency’s own clients each get their own surface, and tenant isolation is enforced in the query layer rather than trusted to the caller.
Not serverless
It runs self-hosted on a VPS in long-lived Docker containers. That is a deliberate choice, not a limitation: the workloads are long-running and the cost curve is flat.
One image runs three processes. The web app serves the three surfaces. A worker takes the jobs that outlive a request: mail, PDFs, invoice reminders, the overdue sweep, and reconciling a payment. A third process keeps the board and its comments live. The tenant check on that socket is the same check as on the page.
How a job is billed
The dashboard above is the agency surface: what is outstanding, what was tracked, and what is still waiting on a client.
Every project is billed one of four ways — time and materials, milestones, a fixed price, or a retainer — and the invoice is generated from that choice.
A quote can mix units on a single document: days at a day rate, hours, a counted item, and a fixed sum that is not a number of days at all. A task can be tied to the quote line it was sold under, so logged time sits next to what was promised.
An invoice is a record
Issuing an invoice writes the lines and the total down once. Changing the hours on a task the following week, or editing the quote, does not rewrite an invoice that has already gone out. It is a record of what was charged, not a live report of the work.
A deposit and the balance can both come off the same quote. A milestone can be the billing trigger: approving it is what makes that part of the job billable.
Collecting the money is a seam. The deployment can take payment through Stripe, through GoCardless, or by recording that it was paid by hand. The invoice does not know which.
Sign-off is not a comment
A message that says “looks good” is not an approval. An approval is its own row: who was asked, who decided, and when. Pending can become approved, rejected, or sent back for changes, and that decision stands. Asking again opens a new row, so the earlier sign-off is still there when it is disputed later.
The client actually logs in
The client does not get a seat on the agency’s board. They sign in to their own surface, and each contact is granted only the actions they should have — comment, approve, upload a file, start a conversation. Those grants are per person. One contact can approve a quote and message the team. Another can comment and upload, and cannot open a conversation at all.
The dashboard below is that surface.
