Stuff I or other people have actually run into. Not a marketing page.
npm run web opens on which port?
8081 by default (Expo Metro). If that's taken, the terminal will show
the actual port. Just click whatever link it prints.
The dev server says "EMFILE: too many open files" on macOS. Bump the file descriptor limit:
ulimit -n 65536Then restart npm run web.
TypeScript complains about missing types after npm install.
npm run typecheck should be the only thing that knows. If it fails
on a fresh install, rm -rf node_modules package-lock.json && npm install
usually fixes it.
Does the dev server work offline? Yes, once the first install is done. Web Audio and other browser APIs still need the browser to be online the first time they fetch.
APK is taking forever. First build downloads Gradle + Android dependencies. ~20 minutes on a good connection. Subsequent builds are ~3 minutes.
iOS build fails with "No code signing identities found". EAS handles this with its own credentials; for local builds, you need an Apple Developer account. Use EAS Build if you can.
EAS Build keeps timing out.
The free tier has a 30-minute limit. If your first build includes
expo prebuild, you might hit it. Run prebuild once locally to
materialise the android/ directory, commit it, then eas build will
just be the gradle step.
Where is my data?
AsyncStorage, keyed under a single root. On web that's
localStorage["taskflow-storage"]. Don't clear site data unless you
mean it.
I cleared my browser data and lost everything. Help. Sorry, that one is on me not shipping export-by-default yet. Open Settings → Data → Export before you do anything destructive, and import on the other end.
Can two devices sync? Yes. Mobile ⇄ desktop syncs end-to-end-encrypted over a P2P session, with an optional self-hosted relay as a NAT-traversal fallback. Pairing is a one-shot 8-digit code; after that, LAN-direct is preferred when reachable. The relay only ever sees ciphertext. Setup is in docs/desktop-user-guide.md §7, and the protocol stack is in ARCHITECTURE.md §9.
Search history disappears when I close the app.
This is a known UX gap — search history lives in component state
because the store doesn't have a searchHistory slice yet. It's on
the list. Workaround: don't close the app, or live with it.
TaskCard shows "今天" / "明天" on a date that's clearly in the past.
The overdue logic only fires if the task has a dueTime and the
current time is past it. Date-only tasks don't trigger the overdue
state. I think this is the right call (a task "due today" isn't
overdue at 9am) but it surprises people.
Voice input is greyed out on mobile.
Voice input uses the Web Speech API, which is Web-only. Native would
need @react-native-voice/voice or similar, and I don't want to
balloon the APK for a feature most people use once. If you need it,
PRs welcome.
The desktop app is a separate Electron project under desktop/. The
full manual is docs/desktop-user-guide.md;
this section is the short version of what people actually ask.
I forgot my master password. Is there a reset?
No. PBKDF2 600000 rounds derives the SQLCipher key; there's no server
to send a reset link. The only path back is uninstall, delete the
userData directory, reinstall, and restore from an encrypted backup
(.taskflow-backup file) — if you still remember the backup password.
If both are gone, the data is gone. This is the cost of local-first
encryption.
Where's the data stored? A single SQLite file encrypted with SQLCipher, under the OS userData dir:
- macOS:
~/Library/Application Support/TaskFlow/taskflow.db - Windows:
%APPDATA%\TaskFlow\taskflow.db - Linux:
~/.config/TaskFlow/taskflow.db
Don't move just the .db file alone — the master password derives
the key, so as long as you know the password, copying the file to a
new machine and unlocking works. Without the password, the file is
random bytes.
Biometric unlock stopped working.
Most common cause on Linux: fprintd isn't running. Check with
systemctl status fprintd. On macOS/Windows: the OS biometric
enrollment changed (re-enrolled fingers, Windows Hello reconfigured).
The fallback is always the master password — the lock screen keeps
the password field regardless of biometric state.
Sync pairing keeps failing.
Nine times out of ten it's clock skew. The relay rejects timestamps
outside ±60 seconds. NTP both machines and retry. Other causes: relay
URL typo (must include ws:// or http:// scheme), relay not
reachable from one side (check firewalls on cross-network setups),
or the 8-digit code expired (5-minute TTL — generate a new one).
Can I sync the vault to mobile? Via E2EE sync, yes — vault items go through the same encrypted channel as tasks. Via JSON export, no — JSON export is plaintext and intentionally excludes the vault, so credentials can't leak through an insecure channel. See docs/desktop-user-guide.md §5.
The desktop build is huge.
Electron ships Chromium + Node, so the baseline is ~80 MB before any
app code. There's no good way around that without throwing away
Electron. The installer sizes are in desktop/electron-builder.yml.