A source-available to-do, reminder and notes app you can host on your own server β with alarms that ring through Silent mode and tasks that live in your Google Calendar, both ways.
Check it in two minutes: make a task repeat monthly on the 31st. Google Calendar skips February; AllisWell puts it on the 28th, and shows you the next five dates before you save. (How)
π Open the web app Β Β·Β π€ Google Play Β Β·Β π App Store Β Β·Β π³ Self-host in one command Β Β·Β π§ Add to Claude or ChatGPT (MCP)
One Flutter codebase for iOS, Android, the web, macOS, Windows and Linux Β· moving from Todoist or TickTick Β· how it compares, honestly
| Status | ||
|---|---|---|
| π Web app | Live now | alliswell.space/app β sign up and use it on every device. Nothing to install. |
| π€ Google Play | Live now | Get it on Google Play β the Android app, on the store. |
| π App Store | Live now | Download on the App Store β the iPhone app, on the store. |
| π³ Self-host | Live now | One docker compose up β guide below. |
| π» Windows Β· Linux | Download | Windows (.zip) Β· Linux (.tar.gz) β attached to every release. Unsigned: SmartScreen asks once (More info βΊ Run anyway). macOS builds from source. |
| π§ Claude / ChatGPT | Live now | MCP connector at https://api.alliswell.space/mcp β setup below. |
Desktop downloads. Unzip (Windows 10/11, 64-bit) or extract (Linux, 64-bit) and run
alliswell.exe / ./alliswell β nothing to install. On Linux the app needs GTK 3,
libsecret with a running keyring (GNOME Keyring or KWallet, where your session is stored)
and GStreamer for the alarm sound; on Debian/Ubuntu that is
libgtk-3-0 libsecret-1-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good. The app talks
to alliswell.space by default; point it at your own server from the sign-in screen.
Project status β
v1.18.0, live. Everything on this page is built, tested (1,200+ app tests Β· 700+ backend unit Β· 70+ integration, green) and deployed to alliswell.space. Track what's next in ROADMAP.md and docs/STATE.md. β Star the repo to follow along.
AllisWell is a remote MCP server. Add it to the Claude or ChatGPT account you already pay for, sign in once, and ask about your day from inside the assistant.
| You use⦠| Connector URL |
|---|---|
| alliswell.space | https://api.alliswell.space/mcp |
| Your own server | <API_PUBLIC_URL>/mcp, e.g. https://api.your-domain.example/mcp |
The URL is on the API host β alliswell.space/mcp is the website.
- Claude (Free / Pro / Max): Settings β Connectors β Add custom connector β paste the URL β Connect β sign in with your AllisWell email and password.
- Claude Team / Enterprise: an Owner adds it once under Organization settings β Connectors (any OAuth option works, no client ID or secret); each member presses Connect under Settings β Connectors.
- ChatGPT (Plus / Pro / Business): Settings β Apps & Connectors β Advanced settings β Developer mode β create a connector with the URL.
- Claude Code:
claude mcp add --transport http alliswell https://api.alliswell.space/mcp
Twenty-five tools over tasks, checklists, reminders, notes, projects, tags and search. Every write asks for your approval, every AI change is logged, and there is no delete tool. OAuth 2.1 with PKCE; dynamic client registration and client ID metadata documents are both supported. Full guide, tool list and troubleshooting: alliswell.space/docs/mcp (docs/MCP.md).
Everything else here is table stakes. These five are why people move β and each one is something the alternatives either cannot do or make you leave the app for.
A task is not a line in a list. It belongs to a project, carries its own description, tags, checklists, colour and attachments, and shows up wherever that project does β the project's Overview, its Files tab, its own board column. The project badge follows the task everywhere, so "what is this for?" never needs a second click.
Not a text box that happens to accept #. AllisWell renders GitHub-flavoured
markdown properly β tables with their alignment, task lists, footnotes,
callouts, real mathematics, syntax-coloured code with a copy button, and
Mermaid diagrams drawn as diagrams, with no browser engine involved.
You get three ways to look at one document: Reading, the rich editor, and
the markdown source β with a live preview beside it on a wide screen. Lists
continue themselves, /table-style commands work everywhere, βK opens a command
palette, and an outline of every heading follows you as you scroll.
And it is not limited to notes that were born here: open a .md file from
your own computer, edit it, and save it back to that file. The document is
permanently marked as external, it is never autosaved behind your back, and if
something else changed it while you were editing you are asked what happens to
your version β reload, save a copy, or overwrite. If AllisWell cannot write the
file safely, it says so and does not offer to.
A reminder that arrives with a chime is a suggestion. AllisWell's urgent tasks
ring with a real alarm sound, through Silent mode and through Focus (iOS 26
AlarmKit; Android's USAGE_ALARM insistent channel), keep re-alerting until
you acknowledge them, and offer snooze presets that each tell you the exact
time they will ring again. When the OS gets in the way β a battery manager, a
revoked permission β the app writes a log entry explaining itself, so
"it didn't ring" is a question with an answer.
The photo of the whiteboard, the contract PDF, the screenshot β they live with the task or the project they belong to, not in a chat scroll or a downloads folder. Attach from Photos, the camera, or Files; images open in a real pinch-and-zoom viewer with a swipe between the others; and everything in a project is listed in its Files tab, in folders you control.
Ask for the 31st and RFC 5545 β which is what Google Calendar follows β simply skips every month without one. Your rent does not skip February.
| Rule: every month on day 31 | Google Calendar | AllisWell |
|---|---|---|
| December | 31 Dec | 31 Dec |
| January | 31 Jan | 31 Jan |
| February | β skipped β | 28 Feb |
| March | 31 Mar | 31 Mar |
| April | β skipped β | 30 Apr |
Also: every day / weekday / week / month / year, the last day of the month, the 2nd Tuesday, the first Monday after the 22nd β with a live "next 5" preview before you commit, twelve rolling months of real task rows (so they show up in search, the calendar and the widget), and an "edit this / this and future / all" prompt when you change one.
Bring your tasks with you: Settings βΊ Data βΊ Import.
- Export from the app you are leaving. Todoist: Settings βΊ Backups (a ZIP), or a project's menu βΊ Export as CSV. TickTick: on the web, Settings βΊ Backup & Import βΊ Generate backup.
- Choose the file. The wizard shows what will come in before anything is written: how many tasks, repeating tasks, sub-items, projects and tags, and every item it could not carry over exactly.
- Import. Run the same file again later and nothing is duplicated: what is already here is skipped, and a task you deleted stays deleted.
What maps to what: projects and lists β projects, labels, sections and columns β tags, sub-tasks β checklist items, priorities p1βp4 β high / medium / low / none, due dates with their time and time zone, repeats β AllisWell repeats where the rule is exact (anything else stays in the task's description with a note), comments β the description. Completed tasks are optional (TickTick; Todoist's exports leave them out). Imported tasks never ring as urgent alarms. The same import is one API call (docs/API.md).
Apple Reminders has no export file, so there is no importer for it.
On the phone β the same local-first app, from one Flutter codebase:
iPhone 17 Pro Max Β· Pixel 9 Pro XL Β· light, dark, an alarm actually going off, and the Home Screen widget with a clock that really ticks Β· every one a real capture from a running app, not a mock-up.
How they are produced: docs/SCREENSHOTS.md
The widget is Home, at a glance β the same buckets (overdue Β· no date Β· today Β· this week Β· this month), worked out by the app and drawn natively, so it never disagrees with the list you open.
- Tap the circle, the task is done β without opening the app (iPhone and iPad on iOS 17+, Android; the Mac on macOS 14+ once its widget target is signed β below). It is an ordinary completion: it works offline and syncs like any other.
- "+" opens the app on the new-task sheet, the day already filled in.
- One widget per project, if you like β each widget can show everything or a single project (edit the widget on Apple platforms; long-press β reconfigure on Android).
- The lock screen (iPhone): the next task and when it is due, and how many tasks today still holds.
- A clock that really ticks in the header, in the date format you chose in the app.
- Private widget and Compact widget in Settings βΊ General βΊ Widget. Private shows "Private task" instead of every title β and the titles are never written for the widget at all, so they do not leave the app.
- Sizes: medium and large on iPhone, extra large on iPad and Mac, and a freely resizable widget on Android, which also turns the day over at midnight on its own.
Self-hosting? Widgets need nothing from your server: the app writes a small
snapshot for them from its local copy of your data, so every instance gets them as
they are. If you build and sign the app yourself under your own identifiers, the
iOS app and its widget extension must share one App Group (group.com.alliswell.alliswell
here β change it in both entitlements and in widget_host.dart together); Android
needs nothing; the macOS widget target is added by a script and signed once in Xcode
(SETUP.md). The whole design, with
the traps we measured on the way: docs/WIDGETS.md.
- β‘ Fast capture β a task in seconds, with or without a date; a dedicated Inbox keeps unplanned thoughts out of your day until you're ready. Plus press-and-hold to talk, share any text or link into the app, and natural-language quick add, offline, in Turkish and English β "tomorrow 9am pay rent #home p1" becomes a dated, tagged task, with the recognized words shown as chips you can undo (the optional β¨ AI parse still splits a sentence into several tasks).
- π Home, your way β one chronological view (overdue Β· today Β· this week Β· next 30 days) with an Apple-style month calendar, or flip to a Board (kanban) with your own hideable, reorderable status columns and drag-to-move.
- π Projects β colours, favourites, archiving, a Notion-style README note as the overview, and per-project Tasks / Notes / Files tabs.
- π· Tags & priorities β type
#tagsinline (auto-create, colours, fold-matched suggestions) and setnone β urgentpriority. Checklists inside a task. - π Alarm-grade reminders β exact-minute delivery, urgent alarms through Silent mode & Focus, a re-alert-until-acknowledged chain you can tune, snooze presets (5 m / 30 m / 1 h / tomorrow / custom) that each say when they'll ring, mute one task's alarms without completing it, your own ringtone, an alarm log, and a privacy mode that hides task content on the lock screen.
- π Recurring tasks that survive a short month β see Β§5 above.
- π Instant search β case- and accent-insensitive across the Latin alphabets ("muller" finds MΓΌller, "cafe" finds cafΓ©), ranked title β tag β body, running locally over the on-device replica, so it works offline. The folding is the app's own, so results never depend on your database's collation.
- π Notes & documents β Markdown notes with live syntax while you type, a real GFM reading view (tables, task lists, footnotes, KaTeX, Mermaid), inline images, links to tasks and projects, pin/archive, card grid or list, and
.md/ PDF export. The engine is our own markdown_forge package (MIT) β extracted so any Flutter app can use it. - π Calendar sync β two-way with Google Calendar: your tasks become events, edits in Google come back, and your Google events show up on Home. On iPhone and Mac, tasks are also mirrored into Apple Calendar (one-way for now). Every task is on the calendar, and it is not a setting.
- π Attachments & Files β attach any file to tasks, notes and projects, plus a global Files section with nestable folders β stored in Cloudflare R2 / any S3 via presigned URLs (the API never proxies your bytes).
- π Local-first realtime sync β offline by default: a mutation outbox, a revision log, idempotent push with field-level last-write-wins, and a Socket.IO channel that fans changes to every device within a round-trip.
- β Finish things visibly β a completed task stays on today's list, struck through and calm, until the next midnight; everything older lives in Settings βΈ Completed, a day-headed timeline you can scroll back through.
- π Delete like you expect β swipe a row from the right, it half-opens, and the red Delete is what deletes. Tasks, notes, projects and files, with an Undo that works by not having written anything yet.
- β‘ Quick access β a personal shortcut list for the projects, tasks, notes, folders, files and links you actually live in, with your own emoji, colour and order. A sidebar section on desktop and web, a popover on narrow windows, and a draggable floating button on phones. Yours alone: shortcuts never leak to other members of a shared workspace.
- π€ AI, on your terms (optional) β use it from the Claude or ChatGPT you already pay for (MCP, above), or bring your own key in the app: Anthropic, OpenAI, Gemini, OpenRouter or a local Ollama. Off by default; every proposed task waits for your tap.
- π₯ Home-screen widgets β iPhone, iPad, Android and (one signing step away) Mac widgets that mirror your Home buckets, carry the system clock and how many tasks today actually holds in the header, complete a task with one tap, follow one project if you want them to, and sit on the iPhone lock screen β see Widgets.
- π Sign in the way you already do β e-mail and password, Continue with Google, or Continue with Apple. The provider proves who you are; AllisWell's own database still owns the account, so a self-hosted instance works the same way β or drops social sign-in entirely and keeps passwords. How it works β
- π Localisation β ships in English and Turkish, auto-detected from your system; adding a language is dropping in one JSON file.
- π Self-hosted & private β your MySQL, your server, one
docker compose up. Free for personal use (licence).
The tools we love, we can't fully own. AllisWell takes their best ideas and adds what none of these give you: the source in the open, self-hosting you actually own, true two-way Google Calendar sync, and a local-first realtime engine.
| AllisWell | Google Calendar | Google Tasks | Apple Reminders | Things 3 | |
|---|---|---|---|---|---|
| Source available | β | β | β | β | β |
| Self-hosted, your database | β | β | β | β | β |
| Price | free | free | free | free | ~$80 |
| iOS Β· Android Β· Web Β· desktop | β | β | β | β | β |
| Works fully offline | β | β | β | β | β |
| Kanban board | β | β | β | β | β |
| Rich notes & file attachments | β | β | β | β | β |
| Alarms through Silent + Focus | β | β | β | β | β |
| Re-alert until acknowledged | β | β | β | β | β |
| Recurrence clamps (31st β 28 Feb) | β | β | β | β | β |
| Two-way Google Calendar sync | β | native | native | β | β |
| Accent-insensitive search | β | β | β | β | β |
| MCP connector for Claude / ChatGPT | β | β | β | β | β |
β full Β· β partial Β· β none. Competitor behaviour as of mid-2026.
Where they beat us β honestly. Apple Reminders has location-based and
messaging-based reminders we simply don't have. Google and Apple Calendar do
invitations, RSVPs and free/busy; we mirror to your calendar and let it do that.
Todoist and Apple Reminders have real collaboration β assignees, comments,
shared lists β where our workspace model exists but the sharing UI does not.
Things 3 has had ten years to sand its corners; we are a young product. And
self-hosting is work: a managed app has no docker compose, no TLS
certificate and no backups to think about.
Already self-hosting? Then Vikunja, Super Productivity, Tasks.org and Nextcloud Tasks are the real alternatives, and some of them beat us β sharing, tasks over CalDAV, a public demo, more importers (we read Todoist and TickTick), years of maturity. The side-by-side, checked against their own docs, is in docs/COMPARISON.md Β§7.
The full analysis β every claim above, the things they do better, and the lines we deliberately did not write β is in docs/COMPARISON.md.
Two published images β the API and the web app β for linux/amd64 and
linux/arm64, tagged on every release:
curl -O https://raw.githubusercontent.com/mahirozdin/alliswell/main/docker-compose.selfhost.yml
curl -o .env https://raw.githubusercontent.com/mahirozdin/alliswell/main/.env.selfhost.example
echo "JWT_ACCESS_SECRET=$(openssl rand -hex 32)" >> .env
echo "JWT_REFRESH_SECRET=$(openssl rand -hex 32)" >> .env
nano .env # your domains + database passwords
docker compose -f docker-compose.selfhost.yml up -dThe API creates and migrates its own schema on start, so an upgrade is just
pull + up -d β your data lives in named volumes and is never touched.
The web image reads your API address at container start, so one prebuilt image
serves any domain without rebuilding Flutter.
Full guide β TLS/reverse proxy, upgrades & backups, Cloudflare R2 attachments, Google Calendar, troubleshooting: docs/SELF-HOSTING.md.
Flutter App (iOS / Android / macOS / Windows / Linux / Web)
β REST + WebSocket (Socket.IO) Β· offline-first local SQLite replica
βΌ
Node.js API β Fastify, JavaScript only (no TypeScript)
ββ Auth (JWT + refresh rotation) ββ Sync engine (revision log, outbox)
ββ Projects / Tasks / Tags ββ Reminder scheduler
ββ Notes / Files (presigned R2/S3) ββ Calendar sync workers (BullMQ)
ββ Recurrence engine (task_series) ββ Remote MCP server (OAuth 2.1)
ββ Search (accent folding) ββ AI providers (BYOK, 5 adapters)
β
ββ MySQL 8.4 / MariaDB 10.11+ (canonical data)
ββ Redis 8 (queues, Socket.IO fan-out, cache)
ββ Object storage: Cloudflare R2 / any S3 (attachments)
ββ Calendar providers: Google Calendar API Β· Apple EventKit Β· CalDAV (iCloud, Nextcloudβ¦)The monorepo:
| Path | What it is |
|---|---|
apps/api |
Fastify backend β JavaScript only, MySQL via knex |
apps/app |
The Flutter app β all six platforms, one codebase |
apps/landing |
This site β Vue 3 + Vite, served at the root of alliswell.space |
scripts/seed-demo.mjs |
The demo workspace every screenshot is shot from |
scripts/screenshots/ |
Screenshot + store-asset pipeline |
Details: docs/ARCHITECTURE.md β’ Design decisions: docs/adr/
Prerequisites: Node.js β₯ 22, Docker, Flutter β₯ 3.44 (for the app).
git clone https://github.com/mahirozdin/alliswell.git
cd alliswell
# 1. Infra: MySQL + Redis (+ MinIO for attachments)
cp .env.example .env
docker compose up -d mysql redis
# 2. API
npm install
npm run db:migrate
npm run dev # β http://localhost:3000 (health: /health/ready)
# 3. Flutter app
cd apps/app
flutter pub get
flutter run -d chrome # or: macos / windows / an emulatorWant the app full of realistic data in one command?
npm run seed:demo # demo@alliswell.space / AllisWellDemo2026Run everything in containers instead: docker compose --profile full up.
Optional DB admin UI: docker compose --profile tools up -d adminer β http://localhost:8080.
Optional integrations (all off until configured, see .env.example):
Google Calendar (GOOGLE_*), file attachments via Cloudflare R2 / any S3 (STORAGE_S3_*),
and AI (AI_* β off by default; see docs/AI.md).
| Command | What it does |
|---|---|
npm run dev |
Start API with watch mode |
npm test |
API unit tests (no infra needed) |
npm run test:integration |
API integration tests (needs MySQL+Redis) |
npm run seed:demo |
Fill a running instance with the demo workspace |
npm run shots:web |
Regenerate the web screenshots |
npm run landing:dev |
Run the marketing site locally |
npm run lint / npm run format |
ESLint / Prettier |
npm run db:migrate / db:rollback |
Knex migrations |
npm run check:no-ts |
Enforce the JavaScript-only policy |
npm run check:i18n |
Enforce no hardcoded UI strings (localisation) |
npm run next |
Print the next task from docs/TASKS.md |
npm run verify:task -- <tests> |
The narrow check for the change in hand (K1) |
npm run verify:batch |
Everything CI checks, once, before a push (K2) |
| Doc | Purpose |
|---|---|
| docs/COMPARISON.md | Full feature inventory + honest comparison with Google, Apple, Things 3 and the self-hosted alternatives (Vikunja, Super Productivity, Tasks.org, Nextcloud Tasks) |
| docs/BLUEPRINT.md | Product vision, domain model, full functional spec (TR) |
| docs/ARCHITECTURE.md | System architecture, stack, sync & calendar design |
| docs/SELF-HOSTING.md | Run your own instance with Docker: TLS, upgrades, backups, storage |
| docs/AI.md Β· docs/MCP.md | AI providers & consent Β· the remote MCP connector |
| docs/API.md Β· live | The REST API & personal API keys: every endpoint with examples, plus a Postman collection |
| docs/FIREBASE.md | Analytics, Crashlytics, Performance β optional, and how to point them at your project |
| docs/ATTACHMENTS.md | File attachments: R2/S3 storage, presigned flow, CORS setup |
| docs/MARKDOWN.md | The markdown workspace: field survey, feature scope, document model |
| docs/NOTIFICATIONS.md | Exact-time / urgent alarm delivery research & plan |
| docs/WIDGETS.md | Home-screen widget architecture |
| docs/SCREENSHOTS.md | How every image in this repo is produced |
| docs/STORE-LISTING.md | App Store & Play copy, asset sizes, claim guardrails |
| ROADMAP.md | Phase-by-phase roadmap: shipped, next, and v2 parking lot |
| docs/TASKS.md Β· docs/STATE.md | Open OPH-xxx tasks Β· live development state |
| CHANGELOG.md | What changed, per release |
| docs/adr/ | Architecture Decision Records |
| AGENTS.md Β· CONTRIBUTING.md Β· SECURITY.md | Workflow, contributing & security policy |
This repository is designed for continuous development by AI coding agents:
npm run nextprints the next task (docs/STATE.md names it too).- Say "do the next task" (Turkish: "sΔ±radaki iΕi yap").
- The agent follows AGENTS.md: implement β its own tests (
verify:task) β update docs β remove the finished task from docs/TASKS.md β update STATE β commit; the full set (verify:batch) runs once before a push. - For a run of many tasks, a phase workflow takes a whole epic (docs/development/workflow.md): a fresh agent per task, then the full set, a smoke run and a review once at the end.
The markdown files (STATE / TASKS / CHANGELOG) are the single source of truth β no external board required.
Everything above is the free edition, and it is built for one person's work. AllisWell Enterprise is a separate, commercially licensed edition for organisations where work is filed between departments rather than kept on one list:
- Teams on their own subdomains β one instance, several organisations, isolated on the server rather than in the interface.
- Permissions and units β named permissions that roles are assembled from, and a unit per department, workshop or site, with explicit sharing between them.
- A service desk β a service catalogue routed to units, tickets that stay distinct from tasks, SLA targets that run on a shift-aware business calendar, and health checks that open an incident when a service goes down.
- A public request portal β a request form at a public URL, with expiry, revocation and quotas, for the people who should not have accounts.
- Meeting recordings that become work β a speaker-separated note with the decisions pulled out, and a decision that turns into a ticket.
It runs in the cloud under your organisation's own address, or on your own servers exactly like the rest of AllisWell: your hardware, your database, no request leaving the building unless you decide it should.
β What the Enterprise edition includes Β Β·Β TΓΌrkΓ§e Β Β·Β info@bubiapps.com
It does not change the free edition in either direction β this repository stays under PolyForm Noncommercial, and Enterprise is used under a separate written agreement. The section below is the rule for both.
AllisWell is free for you, and not free for your employer. That is the whole rule; everything below is detail.
The source is public and it always will be. You can read it, fork it, change it, and run your own instance on your own machine forever without paying anyone or asking anyone. What you cannot do is take it into a business β resell it, offer it as a service, or run it as part of a commercial operation.
| You are⦠| Free? |
|---|---|
| A person, using it for your own life | β Free |
| Self-hosting your own instance at home or on your own VPS | β Free |
| Studying it, forking it, submitting a fix, building on it as a hobby | β Free |
| A charity, school, university, public research body or government institution | β Free |
| A company running it for your team, at any size | β Needs a commercial licence |
| Reselling it, or offering it to others as a hosted service | β Needs a commercial licence |
Enterprise, or anything commercial β info@bubiapps.com. What the Enterprise edition actually adds is one section up, and in alliswell.space/enterprise; the licence terms are also in docs/ENTERPRISE.md. Commercial licences exist, they are not expensive, and they come with the self-hosting support the free tier does not.
Why this and not AGPL. AllisWell used to be AGPL-3.0, and AGPL would have let a competitor host the whole product commercially and comply merely by publishing their changes. This is a single-maintainer product whose revenue is the hosted service at alliswell.space and the app stores β so the licence now protects exactly that, and nothing else. The full reasoning, the alternatives that were weighed (FSL, Elastic License, AGPL + commercial exception), and the consequences are in ADR-0024.
Being straight about the label. PolyForm Noncommercial is source-available, not OSI "open source" β it discriminates against commercial use, which the Open Source Definition forbids. The repo used to say "open source" everywhere; it now says source-available, because the other word would be untrue.
If you already have v0.9.0 or earlier, you have it under AGPL-3.0 and you keep those rights for that copy. A licence granted cannot be taken back. These terms apply from v1.0.0.
Contributions are very welcome β read CONTRIBUTING.md and pick a task from docs/TASKS.md. Please open an issue before large changes.
Translations are especially welcome and need no Dart: copy
apps/app/assets/i18n/en.json to <code>.json, translate the values, and
register the locale β see CONTRIBUTING.md.
Licence: PolyForm Noncommercial 1.0.0 β see Licence & commercial use above. Contributions are accepted under the same terms.
β Star this repo Β Β·Β π alliswell.space Β Β·Β Open the app Β Β·Β π€ Google Play Β Β·Β π App Store
AllisWell β source-available self-hosted productivity hub Β· to-do & task manager Β· Todoist / Things 3 / TickTick / Apple Reminders / Notion alternative Β· two-way Google Calendar sync & Apple Calendar mirror Β· offline-first Β· Flutter (iOS, Android, Web, macOS, Windows, Linux) Β· Node.js + MySQL Β· self-hosted & private.










