TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
A quiet workspace for projects, tasks, and daily habits. npx @baselhusam/daily-hub
ProductivityJavaScript · TypeScriptGitHub @baselhusamOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
A personal command center for projects, tasks, and daily habits. Self-hosted, single-user, Next.js + SQLite.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A personal command center for people who juggle more than one project at a time — founders, consultants, indie builders, anyone with client work, side projects, and a few non-negotiable daily habits.
DailyHub is not a replacement for Linear, Jira, or Notion. It is the morning surface: what is open, what belongs where, what must happen today, and what you already finished.
Your browser does not support the video element.Read the full README ↗A personal command center for people who juggle more than one project at a time: founders, consultants, indie builders, anyone with client work, side projects, and a few daily habits they refuse to skip.
npx @baselhusam/daily-hub
One command, no account, no cloud. Your data stays in a SQLite file on your own machine.
DailyHub does not replace Linear, Jira, or Notion. It is the morning surface that sits above them and answers four questions in one screen:
It is built for one person. There are no teams, permissions, or notifications, and that is on purpose.
Plan the day
Track the work
Run it your way
Requires Node.js 22+.
npx @baselhusam/daily-hub
It opens http://127.0.0.1:9999. The first download is about 80 MB because the package ships the full Next.js app. Later runs start straight away.
Want sample data to look around first?
npx @baselhusam/daily-hub --seed
| Option | What it does |
|---|---|
--port <number> | Use a different port (default 9999) |
--data-dir <path> | Store data somewhere other than ~/.daily-hub |
--seed | Add sample data on first start |
--no-open | Don’t open the browser |
--no-mcp | Turn off the local MCP endpoint |
--detach | Run in the background and return to the shell |
--update | Fetch and run the latest published version |
| Command | What it does |
|---|---|
start | Start DailyHub (the default) |
seed | Add sample data and exit |
status / logs / stop | Manage an instance started with --detach |
mcp | Print MCP connection details for a running instance |
update | Same as --update |
install-app | Install DailyHub.app on macOS |
Options combine freely, so npx @baselhusam/daily-hub --update --port 3000 updates and starts on port 3000.
npx @baselhusam/daily-hub --detach
DailyHub opens once it is ready, and you can close the terminal. Manage it later with:
npx @baselhusam/daily-hub status
npx @baselhusam/daily-hub logs
npx @baselhusam/daily-hub stop
If you use a custom --data-dir, pass the same one to these commands. A detached instance runs until you stop it or restart the computer. For automatic restarts, use Docker or a system service.
npx @baselhusam/daily-hub install-app
This writes DailyHub.app into ~/Applications, so DailyHub gets a Dock icon and a Spotlight entry. Opening it starts DailyHub in the background and opens it in your browser. Add --app-mode to get a chromeless Chrome window instead of a tab, or --app-dir <path> to install somewhere else.
The app is a launcher, not a bundled runtime, so Node.js 22+ still needs to be installed. Closing the browser leaves the server running; npx @baselhusam/daily-hub stop ends it.
docker run -d --name dailyhub -p 127.0.0.1:9999:9999 \
-e TZ=Europe/Berlin \
-v dailyhub_data:/app/data \
baselhusam/daily-hub:latest
Set TZ to your own timezone: the server decides when a day starts, and the container defaults to UTC. Open http://localhost:9999. The 127.0.0.1: prefix keeps it on this machine; drop it to reach DailyHub from other devices, but only on a network you trust. If you open it by a hostname other than localhost, an IP address, or a local name such as nas.local, add it to -e DAILYHUB_ALLOWED_HOSTS=tasks.example.com (see Your data). Data persists in the dailyhub_data volume, and migrations run automatically on start. Images are built for linux/amd64 and linux/arm64. Pin a release with baselhusam/daily-hub:X.Y.Z (it matches the npm version). The same tags are on GHCR as ghcr.io/baselhusam/daily-hub.
docker exec dailyhub npm run db:seed # optional sample data
From a clone, docker compose up -d pulls the same image and docker compose up -d --build builds from source. Reverse proxies, env vars, and troubleshooting are covered in docs/DEPLOYMENT.md.
DailyHub includes a local Model Context Protocol server, so an AI assistant can work with your projects, tasks, and habits directly. For example, you can ask it to “add a task to the website project for Friday”, “what’s still open in my inbox?”, or “mark today’s workout as done”.
It is on by default at /mcp on the app’s port. With DailyHub running, print the connection details:
npx @baselhusam/daily-hub mcp
That prints a URL and a bearer token in the shape most clients accept:
{
"url": "http://127.0.0.1:9999/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
For Claude Code, the same details go in one command:
claude mcp add --transport http dailyhub http://127.0.0.1:9999/mcp --header "Authorization: Bearer <token>"
| Area | Tools |
|---|---|
| Projects | list_projects, create_project, update_project |
| Tasks | list_tasks, create_task, update_task, set_task_completion |
| Inbox | list_inbox, create_inbox_item |
| Habits | list_habits, create_habit, update_habit, set_habit_completion |
| Stats | get_stats |
With the npx CLI, the endpoint only listens on 127.0.0.1 and rejects requests without the token. The token is stored with owner-only permissions in ~/.daily-hub/daily-hub-mcp.json. To turn the endpoint off, start DailyHub with --no-mcp.
Under Docker there is no generated token, so /mcp rejects every request until you set one: add -e DAILYHUB_MCP_TOKEN=$(openssl rand -hex 32) to docker run, then use http://localhost:9999/mcp with that token as the bearer. -e DAILYHUB_MCP_ENABLED=false turns it off entirely.
~/.daily-hub/, which holds data.db (SQLite) and uploads/ (project logos). Use --data-dir to move it. Under Docker it is the /app/data volume.npx @baselhusam/daily-hub --update, or pull a newer Docker image. Database migrations apply on start, and the release notes say when a release includes one.localhost, IP addresses, and local names (single-label, .local, .lan, .internal, .home.arpa). List any other hostname, comma-separated, in DAILYHUB_ALLOWED_HOSTS.Next.js 15 (App Router), TypeScript, SQLite with Prisma, Tailwind CSS v4, shadcn/ui, Motion, and Recharts. There is no separate API server: reads go through Server Components and writes go through Server Actions.
Bug reports, ideas, and pull requests are welcome. Start with CONTRIBUTING.md for setup and checks. The short version:
git clone https://github.com/baselhusam/daily-hub.git
cd daily-hub
npm install
npm run dev
This runs on port 9999 with a separate database in ./.data/, so it never touches your real ~/.daily-hub/ data.