Do less tracking,
do more doing.

Farmer reads your calendar and your Git history and fills in the timesheet for you. You check the day, fix what's off, and get back to work. Open source, on your own server.

Most of your day is already written down.

Meetings live in the calendar. Code lives in Git. Farmer reads both, adds the things that happen every day, and proposes a timesheet. You only correct it.

Google Calendar meetings
Accepted meetings become time entries. No typing.
GitHub commits and pull requests
Grouped into work-time blocks on the right project.
Recurring blocks
The daily stand-up fills itself in.
Filing rules
A recurring meeting goes to the same project every time.
24 hours, no more
A day can't hold more than 24 hours. Automation respects that.

A timesheet you review, not write.

Day, week and month views. Every entry is a date and a duration under client, project and task, in 15-minute steps. Rows that automation made stay locked in the week; you adjust them in the day view.

Stopwatch in web and CLITime off is just another entry

Vacation, sick leave and paid leave are ordinary entries against built-in tasks, so absence reports come from the same data as work.

Month-end is a CSV away.

Time by client, project or teammate. Overtime. Tracking, which is logged time against the month's target. Absence. Pick a week, month, quarter, year or any range, then export.

Time
Overtime
Tracking
Absence

Hours, people, projects and the reminders.

Hours

A monthly hour fund, public holidays for your country, and working hours per person.

People

Employees, students and contractors. Billable, overhead or hourly. Admins, Team Leads, PMs and per-project roles.

Projects

A page per project with its hours, team and settings. Emoji or your own icon.

Reminders

Slack DMs, a month-end nudge and an admin digest. Web push if you prefer the browser.

Integrations

A GitHub App per organization, Google Calendar per person, Slack per organization, and outbound webhooks.

Moving from Harvest

Drop your Harvest CSV exports in Settings. Importing the same files twice changes nothing, and the last run can be undone.

Your timesheet, from the terminal.

A CLI, a REST API, an MCP server and an assistant, all acting as you and nothing more. Each can be switched off per deployment.

CLIzsh
$ curl -fsSL https://farmer.profi.co/cli | sh
$ farmer login
  Open farmer.profi.co/device and enter WDJB-MJHT
  ✓ Signed in as person@example.com · Profico
$ farmer start "Code review" -p harbor-app
  ● Timer running · Harbor App › Development
$ farmer today
  Design review    Acme Rebrand › Meetings    1:00
  Auth refactor    Harbor App › Development   2:30
  Sprint planning  Internal › Planning        1:30
                                       total  5:00

MCP server

/api/mcp/<org-slug>

The same tools for Claude Code or any MCP client.

> log 2h yesterday on Harbor App, code review
⏺ farmer.create_time_entry(date: "2026-07-08", durationSeconds: 7200)
  Logged 2:00 · Tue, Jul 8

Assistant

How much went into Acme Rebrand in June?
142.50 across 6 people. Design 61.00, development 43.00, meetings 38.50.

Runs on your organization's OpenRouter key. It can do only what the person asking can do.

REST APIPOST /api/v1/orgs/acme/time-entriesEverything the CLI does. Read the API docs

Built in the open. Yours to run.

One Docker image. Postgres is the only dependency. Three environment variables to start, and an administrator sets up the rest from inside the app.

AGPLv3
Free to use, change and self-host. Changes to a hosted version must stay open.
docker
docker run -d -p 3000:3000 \
  -e DATABASE_URL=postgres://… \
  -e BETTER_AUTH_SECRET=… \
  -e BETTER_AUTH_URL=https://time.example.com \
  ghcr.io/profico/farmer
Required
3 env vars
Depends on
Postgres
Sign-in
Google or any OIDC

Single-organization mode gives you one invite-only workspace with your own logo on the sign-in page. Light and dark themes, a custom accent and high contrast come built in.

Rather not run a server?

We're preparing a hosted Farmer, run by Profico. There are no plans or prices yet. Join the list and we'll write when there's something to try.