AI-first todo app for capturing, planning, and actually finishing work.
Recall is a lightweight task manager focused on one thing: reducing friction between “I need to do this” and “I’ve started doing it.”
It combines fast task capture, practical AI assistance, and a clean day-to-day workflow, so you spend less time maintaining a system and more time moving things forward.
Most todo apps become powerful by becoming heavy. Recall goes in the opposite direction:
- Fast to capture — write tasks the way you naturally think
- Practical to manage — prioritize, schedule, filter, and review without getting buried in settings
- AI that helps with real work — not just chat for the sake of chat
- Local-first by default — usable with minimal setup, with optional server-side capabilities when needed
In short: Recall helps you focus on execution, not tool maintenance.
-
Natural language capture
Type things like “Remind me tomorrow at 3pm to call the client” and turn them into structured tasks quickly. -
Full task workflow
Create, complete, pin, prioritize, filter, sort, tag, group into lists, and break work into subtasks. -
Unified due-date shortcuts
Quickly set tasks to today, tomorrow, tonight, or next Monday 9:00 with minimal clicks. -
Compact task editing
Edit dates and times directly from task cards with a lightweight inline picker. -
Pomodoro mode with floating widget
Stay focused with a timer that keeps running across views, supports floating display, dragging, docking, collapsing, and completion highlights. -
Habits and countdowns
Covers common personal productivity scenarios beyond simple task lists. -
AI assistants built into the workflow
- Todo Agent for turning rough input into actionable tasks
- Manage Agent for surfacing priorities and suggesting one-click actions
-
Local-first storage
Works out of the box with LocalStorage, with optional Redis / PostgreSQL / WebDAV support depending on your setup. -
PWA support
Installable, cacheable, and notification-friendly.
Recall currently includes two practical AI roles:
Best for:
- converting natural language into tasks
- splitting vague ideas into actionable items
- helping you capture faster with less manual editing
Best for:
- identifying what deserves attention now
- recommending priority changes
- surfacing overdue or important tasks
- offering direct actions from recommendation cards
Supported quick actions include:
suggestedPriority→ one-click priority updatesuggestedPinned→ one-click pin / unpinsuggestedDuePreset→ one-click set to today / tomorrow / tonight / next week
These actions reuse the existing task update flow rather than creating a separate write path, which keeps behavior consistent and predictable.
- Next.js (App Router)
- React 18 + TypeScript
- Tailwind CSS + Lucide Icons
- Prisma (optional database layer)
- Redis (optional sync / queue capability)
- WebDAV (optional attachment storage)
npm install
npm run devDefault local address:
http://localhost:3000Type check:
npm run typecheckLint:
npm run lintImage:
34v0wphix/recallRun directly:
docker pull 34v0wphix/recall:latest
docker run -d \
--name recall_app \
-p 3789:3789 \
--restart always \
34v0wphix/recall:latestOpen:
http://<your-server-ip>:3789Health checks:
curl -fsS http://localhost:3789/api/health
curl -fsS http://localhost:3789/api/health?deep=1If
NEXTAUTH_SECRETis not provided, the container can generate a temporary secret so the app still starts. For production, set it explicitly.
version: '3.8'
services:
postgres:
image: postgres:16-alpine
profiles: ["local-db"]
environment:
POSTGRES_DB: recall
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
app:
image: 34v0wphix/recall:latest
restart: always
ports:
- "3789:3789"
environment:
NEXTAUTH_URL: http://localhost:3789
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET:-}
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/recalldocker compose --profile local-db up -dversion: '3.8'
services:
app:
image: 34v0wphix/recall:latest
restart: always
ports:
- "3789:3789"
environment:
NEXTAUTH_URL: http://localhost:3789
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET:-}
DATABASE_URL: postgresql://USERNAME:PASSWORD@REMOTE_HOST:5432/recalldocker compose up -dYou can also compose your database config with:
DB_HOSTDB_PORTDB_NAMEDB_USERDB_PASSWORD
| Variable | Description | Default |
|---|---|---|
OPENAI_API_KEY |
API key for AI features | - |
OPENAI_BASE_URL |
AI endpoint base URL | https://ai.shuaihong.fun/v1 |
EMBEDDING_PROVIDER |
Embedding provider (openai / local) |
openai |
NEXTAUTH_URL |
Public app URL for auth | http://localhost:3789 |
NEXTAUTH_SECRET |
NextAuth secret | - |
DATABASE_URL |
Server-side database URL | postgresql://postgres:postgres@postgres:5432/recall |
REDIS_HOST |
Redis host | - |
REDIS_PORT |
Redis port | 6379 |
REDIS_DB |
Redis database index | 0 |
REDIS_PASSWORD |
Redis password | - |
The current default server-side persistence path is PostgreSQL. Browser-side LocalStorage behavior is still preserved for lightweight usage.
Recall’s server-side persistence uses Prisma + PostgreSQL by default.
More details: docs/plan/database.md
export DATABASE_URL='postgresql://postgres:postgres@localhost:5432/recall'
npx prisma generate
npx prisma db pushDATABASE_URL='postgresql://postgres:postgres@localhost:5432/recall' ./scripts/db-check.shRecall still supports a dynamic PostgreSQL mode via x-pg-* headers, but this is intentionally restricted:
- disabled by default
- requires
ENABLE_DYNAMIC_PG_HEADERS=true - only works for unauthenticated requests
- authenticated sessions always prefer the server database
Recommended when enabling:
PG_HEADERS_TOKENPG_HEADERS_HOST_ALLOWLIST
Use this only in trusted self-hosted environments.
- stronger search / embedding resilience
- better multi-device sync and account support
- smoother mobile interactions and performance
- more reliable and more explainable AI assistance
Issues, suggestions, and PRs are welcome.
Recommended commit prefixes:
feat:new featurefix:bug fixdocs:documentationrefactor:code restructuringchore:tooling / maintenance
If you want to help shape a faster, cleaner, more practical AI todo experience, feel free to join in.
MIT