An AI-native "shared memory + decision OS" that compounds into a living memory graph over time.
- Node.js 18+
- npm
# Install dependencies
npm install
# Initialize database + seed demo data
npm run db:seed
# Start dev server
npm run devDemo login: demo@reattend.com / demo1234
npm run build
npm startCreate a .env.local file:
# Auth (required)
NEXTAUTH_SECRET=your-secret-here
NEXTAUTH_URL=http://localhost:3000
# Database
DATABASE_URL=./data/reattend.db
# AI Provider (mock | openai | anthropic)
AI_PROVIDER=mock
AI_API_KEY=
AI_MODEL=
# Embedding Provider
EMBEDDING_PROVIDER=mock
EMBEDDING_API_KEY=
EMBEDDING_MODEL=
# App
APP_URL=http://localhost:3000| Layer | Technology |
|---|---|
| Framework | Next.js 14 (App Router) |
| Language | TypeScript |
| Database | SQLite via better-sqlite3 |
| ORM | Drizzle ORM |
| Auth | NextAuth.js v5 |
| UI | Tailwind CSS + shadcn/ui + Radix |
| Graph/Board | React Flow (@xyflow/react) |
| Animations | Framer Motion |
| State | Zustand |
| AI | Provider-agnostic (mock mode included) |
src/
app/ # Next.js App Router
(auth)/ # Login, Register
(app)/app/ # Authenticated app routes
api/ # API routes
components/
app/ # App shell (sidebar, topbar)
ui/ # shadcn/ui components
lib/
db/ # Schema, migrations, seed
ai/ # LLM interface, prompts, agents
jobs/ # Background job queue
auth/ # Auth configuration
stores/ # Zustand stores
types/ # TypeScript definitions
POST /api/ingest
Content-Type: application/json
{
"text": "string (required)",
"source": "string (default: manual)",
"workspace_id": "string (required)",
"occurred_at": "ISO 8601 datetime",
"author": { "name": "string", "email": "string" },
"metadata": { ... }
}
- Ingest → Raw item created in inbox
- Triage Agent → Analyzes text, decides store/ignore, extracts entities/tags
- Embedding Job → Generates vector embedding for semantic search
- Linking Agent → Finds similar records, creates graph edges
- Project Agent → Suggests project groupings
Set AI_PROVIDER=mock for local dev. The mock provider:
- Returns deterministic triage results based on keyword analysis
- Generates consistent 384-dim embeddings from text hashing
- Creates similarity-based links
Edit src/lib/ai/llm.ts and implement the LLMProvider interface:
interface LLMProvider {
generateJSON<T>(prompt: string, schema: ZodType<T>): Promise<T>
generateText(prompt: string): Promise<string>
embed(text: string): Promise<number[]>
}| Route | Description |
|---|---|
/ |
Landing page |
/login |
Authentication |
/register |
Account creation (30-day trial) |
/app |
Dashboard with daily summary |
/app/inbox |
Raw captures + AI triage |
/app/memories |
Curated records list + detail |
/app/projects |
Project management + AI suggestions |
/app/graph |
Interactive memory graph |
/app/boards |
Whiteboard canvas (Miro-like) |
/app/search |
Semantic + text search |
/app/integrations |
100 integration directory |
/app/settings |
Profile, workspace, members, agent logs |
/app/billing |
Plan selection, billing stubs |
SQLite database stored at data/reattend.db. Tables:
users,workspaces,workspace_members,workspace_invitessources,raw_items(inbox)records(curated memories),entities,record_entitiesrecord_links(graph edges),embeddingsprojects,project_records,project_suggestionsboards,board_nodes,board_edgescomments,activity_logplans,subscriptionsintegrations_catalog(100 items),integrations_connectionsjob_queue,inbox_notifications
rm data/reattend.db
npm run db:seed- Multi-tenant workspaces (personal + team)
- Dark mode + light mode
- AI triage with entity extraction
- Semantic search via embeddings
- Interactive memory graph with filters
- Whiteboard/canvas with sticky notes
- 100 integration stubs
- Billing stubs with 30-day trial
- Invite team members by email
- Agent activity logs
- Ask AI (conversational Q&A over memories)
- Notification inbox