Type a high-level goal; an AI agent breaks it into goals → projects → tasks → subtasks with priorities, due dates and time estimates, then tracks progress as you complete them.
Why: planning is the work nobody has time for. This puts an agent on it so you can get to doing.
You only need Node 20+. No Firebase, OpenAI or Postgres required.
git clone https://github.com/snahar7/TaskAI && cd TaskAI
npm ci
npm run demo # builds and serves http://localhost:5000Open http://localhost:5000, type a goal (try "Launch a newsletter in 6 weeks") and click Break Down My Goal.
What demo mode does:
- Login: you're signed in automatically as a local Demo User, and a yellow banner shows that demo mode is on.
- AI: breakdowns are realistic canned templates picked by keywords in your goal (newsletter/content, product launch, learning, fitness, job search), with a generic fallback. AI Assist is disabled.
- Database: with no
DATABASE_URL, data goes into an embedded Postgres (PGlite) in./.taflo-data. Delete that folder to reset.
Demo mode turns on automatically when OPENAI_API_KEY or the Firebase config is missing, or when you set DEMO_MODE=true. Set DEMO_MODE=false to require real keys. Demo login only exists while demo mode is on, so never run a public deployment in demo mode.
- GPT-4o breakdown of goals/tasks into structured subtasks, with an approval step before saving
- Goal → project → task → subtask hierarchy, detail pages, calendar timeline
- Progress roll-up when subtasks complete
- AI-assist services: planning assistant, research agent, content generator, task analyzer
- Firebase auth, team assignment, file upload
React 18 + TypeScript, Vite, wouter, TanStack Query, Tailwind + shadcn/ui · Express (TypeScript) · PostgreSQL (Neon or local) + Drizzle ORM · sessions in Postgres (connect-pg-simple) · OpenAI GPT-4o · Firebase (auth/Firestore)
You need Node 20+, an OpenAI API key, a Postgres database, and a Firebase project (see Set up your own Firebase).
- Get a database. Either:
- Neon (no install): sign up at neon.tech, create a project, and copy the connection string (
postgresql://…neon.tech/neondb?sslmode=require). - Local Postgres:
docker compose up -dstarts one atpostgresql://taflo:taflo@localhost:5432/taflo.
- Neon (no install): sign up at neon.tech, create a project, and copy the connection string (
- Configure:
In
git clone https://github.com/snahar7/TaskAI && cd TaskAI npm ci cp .env.example .env
.env, setDATABASE_URL,OPENAI_API_KEY,SESSION_SECRET(openssl rand -hex 32) and theVITE_FIREBASE_*values. - Create the tables:
npm run db:push - Start:
npm run dev, then open http://localhost:5000 (or yourPORT).
Production: npm run build && npm start. Sessions are stored in Postgres (the session table is created automatically).
SESSION_SECRET is required in every environment, including dev. The server refuses to start without it. Generate one with:
openssl rand -hex 32and put it in .env as SESSION_SECRET=<value>.
TaskAI ships with no Firebase project. Bring your own:
- Create a project at console.firebase.google.com.
- Authentication → Get started → enable Email/Password and Google. Under Settings → Authorized domains, add your dev and production domains.
- Firestore Database → Create database (production mode).
- Project settings → Your apps → Add app → Web. Register the app and copy the
firebaseConfigvalues into.envas theVITE_FIREBASE_*variables (see.env.example). - Optional (server-side Firestore): Project settings → Service accounts → Generate new private key. Put the JSON on one line in
FIREBASE_SERVICE_ACCOUNT_KEYand setFIREBASE_PROJECT_ID.
The app fails fast with a clear error listing any missing VITE_FIREBASE_* variables.
Lock it down:
- In Google Cloud Console → APIs & Services → Credentials, restrict the browser API key to your domains (HTTP referrers) and to the Identity Toolkit, Token Service and Firestore APIs.
- Use Firestore rules so each user can only read and write their own data. Example:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId}/{document=**} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
match /{collection}/{docId} {
allow read, update, delete: if request.auth != null && resource.data.userId == request.auth.uid;
allow create: if request.auth != null && request.resource.data.userId == request.auth.uid;
}
}
}
DATABASE_URL (Neon or any Postgres; optional DATABASE_DRIVER=neon|pg), OPENAI_API_KEY, SESSION_SECRET, JWT_SECRET, FIREBASE_PROJECT_ID, FIREBASE_PRIVATE_KEY, FIREBASE_CLIENT_EMAIL, VITE_FIREBASE_API_KEY, VITE_FIREBASE_AUTH_DOMAIN, VITE_FIREBASE_PROJECT_ID, PORT, NODE_ENV (see .env.example).
MIT
