個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證The digital family calendar for screens you already own — a TV, an old tablet, or a Raspberry Pi. Claude writes it fresh every morning.
翻譯準備中
正在載入完整 README。 以下為已儲存的摘錄。
The digital family calendar for screens you already own — a TV, an old tablet, or a Raspberry Pi.
DinkyDash merges your calendars into one agenda, works out whose turn each chore is, counts down to the next birthday, and once a day asks Claude for a headline. Then it puts the lot on a screen at home — light or dark, sized to read from across the kitchen.
Self-hosted (this repo). Free, MIT-licensed, runs on your own hardware with your own Anthropic API key. Setup takes an afternoon and some comfort with a terminal.檢視完整 README ↗The digital family calendar for screens you already own — a TV, an old tablet, or a Raspberry Pi.
Website: dinkydash.co
DinkyDash merges your calendars into one agenda, works out whose turn each chore is, counts down to the next birthday, and once a day asks Claude for a headline. Then it puts the lot on a screen at home — light or dark, sized to read from across the kitchen.
Self-hosted (this repo). Free, MIT-licensed, runs on your own hardware with your own Anthropic API key. Setup takes an afternoon and some comfort with a terminal.
Self-hosting is community-supported. Issues and pull requests are welcome, but there's no support commitment — if you need it to just work, use the hosted version.
Hosted. Start a free 14-day trial. No card required. After that it's $39 a year or $6 a month, and nothing is charged unless you choose to subscribe. Built from this same repo, in cloud mode — see Two modes, always.
Configure all of it from your phone at /settings, or by editing config.yaml directly — they are
the same file, and the UI keeps your comments.
[cron every 5m] → generate.py --tick → every hour by default: re-fetches every iCal feed
→ once a day at a time you set, 06:00 by default
(and at once on the first run): calls Claude
→ saves dashboard_data.json
[browser] → web/routes/board.py → recomputes chores, countdowns and today's agenda
→ renders the dashboard
Only the headline comes from the model. Ages, countdowns, chore turns and the agenda are recomputed on every render, so if a day's run fails the times and turns on the wall are still today's — the headline is one worked out from the day, and the dashboard says so.
You can see the real dashboard in about two minutes, with no API key and nothing to pay for.
git clone https://github.com/caspii/dinkydash.git
cd dinkydash
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp config.example.yaml config.yaml # edit by hand, or from /settings once it runs
python sample_board.py # a dashboard for today; calls no API, costs nothing
python app.py
The chore turns, ages and countdowns are computed from the config.yaml you just made, so
editing it and reloading shows your own family. Only the headline is canned until
you add an Anthropic API key.
Then follow the getting started guide — it has the API key step, where to find your calendar's iCal link for Google, iCloud and Outlook, and the whole Raspberry Pi build with systemd, kiosk mode and the screen schedule.
There is no login. The dashboard and the settings UI are both served without authentication, so anyone who can reach the port can read your family's agenda and rewrite
config.yaml— names, birthdays, and every calendar link in it.That is deliberate rather than unfinished: DinkyDash is a config file with a web form on it, and the file has no login either. It assumes it is on your home network, the same as a printer.
So keep the port off the public internet. Do not forward port 5000 on your router. If you need it from outside the house, reach it over a VPN such as Tailscale or WireGuard, or put a reverse proxy with basic auth in front of it.
Hosted mode is a different matter — it authenticates every request and is scoped per family. See Hosted mode raises the stakes.
| What you want | Where it is |
|---|---|
| Install it, and put it on a Raspberry Pi | dinkydash.co/getting-started |
| Every config key, with comments | config.example.yaml |
| Living with it: the daily cycle, the two buttons, what to check when something looks wrong | doc/running-it.md |
| Coming from an older version | doc/upgrading.md |
| Working on the code, and how the hosted build shares it | CLAUDE.md |
| Product terms and UI wording | doc/terminology.md |
The install and Pi guides live on the website rather than here, so there is one copy of each to keep right.
Conductor's dev run action starts the hosted dashboard and marketing website
together. The same command outside Conductor is venv/bin/python dev.py.
See local development for the required development database
and session key, ports, sign-in, and how Conductor picks up the run configuration.
The self-hosted quickstart above is unchanged.
pip install -r requirements-dev.txt # adds pytest and the website build; not needed on the Pi
python -m pytest tests/ -q
The suite runs in seconds. It covers leap years, timezone conversion, event ordering, chore rotation, the stale-dashboard logic, the config round-trip, and the settings routes that write it.
GitHub Actions runs the same command on every push and pull request, on Python 3.11
(.github/workflows/test.yml), alongside a gitleaks scan of
the full history. Every requirements file is pinned with ==, so a clean pip install gets the
versions CI passed on. A pull request that fails either check shows a red X.
| Path | Purpose |
|---|---|
dinkydash/ | The engine. Pure functions plus the model call — no clock, no file reads |
dinkydash/context.py | Ages, birthdays, countdowns, chore rotation |
dinkydash/calendars.py | iCal fetch, parse, recurrence, merging feeds |
dinkydash/board.py | Turns config + payload into what the dashboard renders |
dinkydash/runner.py | The two halves of the cycle: refresh_calendars and write_brief |
dinkydash/schedule.py | due() — which of the two the clock and the config owe right now |
dinkydash/store.py | Where the config, the dashboard and the note history are kept |
migrations/ | The hosted schema, plain SQL. Self-hosting needs none of it |
web/ | Flask app — dashboard, settings UI, templates |
web/templates/board.html | The dashboard itself, light and dark, all screen sizes |
generate.py | Command-line skin over dinkydash.runner — this is what cron calls |
app.py | Flask entry point |
config.yaml | All configuration. The settings UI writes this same file |
config.example.yaml | Template config, documenting every key |
tests/ | The test suite. Run it before committing |
doc/ | Running it day to day, and upgrading from an older version |
design/ | Mockups for the dashboard and settings UI, with the reasoning |
.env | ANTHROPIC_API_KEY (not in git) |
.env.example | The template for it — copy to .env |
.github/workflows/test.yml | CI: pytest and gitleaks, on every push and pull request |
Pull requests are welcome. The codebase is one monorepo serving both the self-hosted and the hosted build, so a change has to work in both modes — read CLAUDE.md before starting anything structural, and open an issue first for larger changes.
Known rough edges are listed under "Known issues" in CLAUDE.md.
MIT — see LICENSE.
.gitleaks.toml| Secret-scanning rules, including one for iCal secret addresses |
dashboard_data.json | The generated payload (not in git) |
content_history.json | A rolling record of the last 30 days' runs (not in git) |