Know where your 24 hours actually go.
Daylog is a nightly time-audit app. Once a day, you sit down for five minutes and type out where your hours went — in plain language, keyboard only. Daylog turns that into a timeline, a category breakdown, and a weekly picture of your life.
It is not a tracker that runs in the background, and it is not a to-do list. It is a journal for time, written honestly, after the fact.
office 9-6
> deep work 9-11 #deep
> scrolling 3-3:30 #dis
gym 6:30-7:30 #per
sleep 11pm-7am
That's the whole input. Five lines, about forty seconds.
Most time trackers ask you to start a timer, and most people stop within a week. Daylog inverts it: log nothing during the day, reconstruct the day at night. Reconstruction is imperfect — but an imperfect record you actually keep beats a perfect one you abandon on day four.
The nesting matters too. office 9-6 is one block; the four hours of real work
and the ninety minutes of scrolling live inside it. Most tools make you choose
between the honest outer shape and the honest inner truth. Daylog keeps both, and
attributes every minute to the deepest activity that claims it.
| Type, don't click | office 9-6, > deep work 9-11 #deep. Times parse as you type, with a live preview. 9-6 means 9am to 6pm — it figures out am/pm from context. |
| Nested activities | Log the container and what happened inside it. Two levels deep, validated server-side so a child can never escape its parent. |
| The day spine | An SVG timeline of your day — parent blocks full width, children inset, unaccounted time hatched so you can see the gaps you didn't log. |
| Honest analytics | Category donut, context-switch count, longest unbroken focus block, and unaccounted time. Every minute is attributed exactly once. |
| Week view | A 7-day skyline, where the hours went, switches per day, and the activities that keep coming back. |
| Overnight ranges | sleep 11pm-7am splits at midnight and carries into tomorrow's draft automatically. |
| Your data is yours | One-click JSON export of everything. Self-hosted by default. |
Live demo: not deployed yet — see deployment to host your own.
email demo@daylog.app
password demo@123
That password is public on purpose, and it doesn't unlock a shared account. Logging in with it hands you a fresh sandbox of your own — seeded with five sample days so the Review and Week views have something to show, with tonight left blank for you to log. Nobody else can see it or change it, and it deletes itself after 24 hours.
So go ahead and break things. Delete every entry, rename the categories, export the JSON. You're the only person affected, and the next visitor gets a clean one.
You'll need Node 20+ and Docker (Docker is only for the local Postgres — any Postgres 14+ works).
git clone https://github.com/Harshpratapcodes/daylog.git
cd daylog
npm install
# 1 — start Postgres
docker compose up -d
# 2 — configure the server
cp server/.env.example server/.env # then set JWT_SECRET to any long random string
npm run migrate
# 3 — run both halves (two terminals)
npm run dev --workspace server # API → http://localhost:3001
npm run dev --workspace client # app → http://localhost:5173Open http://localhost:5173, register with any email and a password of 8+
characters, and you'll land on tonight's blank log with nine starter categories
ready to go. Type office 9-6, hit Enter, and watch the spine draw itself.
Run the test suite with npm test --workspace server.
Heads up:
server/.envholds real credentials and is gitignored. Never commit it, and keepserver/.env.examplefree of anything real.
Everything is reachable from the keyboard, because a ritual that needs a mouse is a ritual you'll skip.
| Key | Does |
|---|---|
Enter |
Commit the line in the command bar |
> prefix |
Nest this entry inside the one above it |
#tag |
Assign a category by prefix — #dis → Wasted / distracted |
Tab |
Accept the autocomplete suggestion |
↑ ↓ |
Select an entry |
E / ⌫ |
Edit / delete the selected entry |
Ctrl+D |
Copy yesterday's top-level structure |
Ctrl+Enter |
Write one reflection line and finalize the day |
Three tabs: Tonight (the ritual), Review (any past day, read-only), and Week (the skyline). Plus Settings for categories and export.
TypeScript end to end. React + Vite on the front, Fastify + PostgreSQL on
the back, vitest for tests, and a small shared/ package holding the types
and the time parser used by both sides.
No framework magic, no ORM, no state-management library. About 5k lines total.
| Doc | What's in it |
|---|---|
| Architecture | Repo layout, data model, validation rules, how analytics attributes minutes |
| API reference | Every endpoint, with curl examples |
| Time parser | The command-bar grammar and its am/pm disambiguation rules |
| Deployment | Deploying to Render + Neon, or anywhere else |
| Roadmap | What's built, what's next, and the dogfood protocol that decides |
Phase 1 is complete and in daily use by its author. Phase 2 — planning your intended day and comparing it against the actual one — gets built only if two weeks of real nightly logging show that this produces honest data at sustainable friction. See the roadmap for how that's being measured.
Issues and PRs are welcome. If you try it and it doesn't survive your first week, that's the most useful bug report there is — please open an issue and say why.
Not yet licensed. Until a LICENSE file lands, treat this as source-available
for reading and personal use; open an issue if you'd like it under something
specific.