Timesheaf: time tracking and invoicing for a small design agency

Timesheaf: time tracking and invoicing for a small design agency

00 Markdown

Live timers, a week view of hours per project, billable reports by client and person, and invoices clients pay by card.

Agent specs

Agent
Claude Code, Opus 5.5 Medium
Time
25 min
Cost
$8.73*

Agents work faster and more accurately on Elements.

* Cost at API rates, September 2026.

Run it yourself

Paste this prompt into your AI agent. You get the finished app on your own machine, ready to change however you like.

Agent Chat
Install elements:
curl -fsSL 'https://install.elements.dev?os=darwin' | sh && export PATH=~/elements/bin:$PATH

Create an Elements app from the elementscode/demo-timesheaf scaffold:
cd ~/elements/projects
elements create timesheaf -scaffold=elementscode/demo-timesheaf
cd timesheaf

Start the app.

Need an AI agent?

In AI desktop apps, paste into the Code tab, not the general chat.

How it's built

Timesheaf needed timers the team can see running, a week of hours per person, invoices built from tracked time, and a way for clients to pay those invoices by card. Each of those is a part of Elements, so the agent spent its 25 minutes on the agency's workflow itself.

What Elements gave the app

  • Live timers. Time entries are a LiveTable opened per person for the week view and as one team-wide view of running timers. Stopping a timer folds the elapsed time in on the server's clock, and every teammate's screen shows it stop.
  • Invoices from time. @rpc functions gather a client's unbilled entries into a draft and email the client a link to view and pay it. Invoices are a LiveTable, so the invoices list shows a payment the moment it lands.
  • Card payments. Checkout is priced from the invoice's own stored lines. The return page and the webhook share one fulfillment function, so each payment is recorded once, whichever arrives first. Without a Stripe key, the pay button opens a test checkout inside the app that records the payment through that same function, and in production the app registers its own webhook the first time a client starts a checkout.
  • Reports from SQL. The reports page totals billable hours by client and by person straight from the entries table.
  • Data from SQL files. Three migrations define the schema and the invoice builder, and seed four teammates, four clients, a month of tracked weekdays, two timers running right now, and invoices in every status.
  • Sessions and roles. Invoicing is for admins, and each time entry checks that it belongs to the signed-in person.

What the project server gave the agent

The project server runs alongside the agent and answers as soon as a file is saved: it type-checks the templates, TypeScript and SQL, applies migrations and reruns the tests, so every question came back right away and the agent kept building.

What shipped

The app type-checks with zero errors and all 21 tests pass. Every page works on desktop and phone, and live updates arrive across tabs, such as a teammate's timer starting or stopping. A real sandbox payment went through Stripe end to end.

The code

Build it from scratch

To watch your agent build this app from an empty project, use the prompt we used instead. It takes longer than starting from the finished app above.

Agent Chat
Install elements:
curl -fsSL 'https://install.elements.dev?os=darwin' | sh && export PATH=~/elements/bin:$PATH

Create an Elements app:
cd ~/elements/projects
elements create timesheaf
cd timesheaf

Start the app, then build this:

Build a time tracking and invoicing app named timesheaf for a small design agency.

Two kinds of accounts: admin and team member.

- Clients, and projects under them with an hourly rate.
- A running timer: pick a project, start, stop. Or add an entry by hand.
- Week view of a person's hours per project per day.
- Reports: hours and billable amount per client, per project and per person,
  for a date range.
- Invoices: an admin picks a client and a date range, the app gathers the
  unbilled entries into line items, and the admin sends it. The client gets an
  email with a link to view and pay the invoice by card. Invoice status: draft,
  sent, paid.

Payments by Stripe.

Seed one admin, three team members, four clients, six projects, a month of
time entries, and invoices in each status. Show the seeded logins on the
sign-in page.

Running timers, new entries and invoice payments update in real time.

The weekly digest

New lessons, demos and posts from elements.dev, in one email a week.

Comments· 0