# Synculous A routine and medication management app designed as a prosthetic for executive function. Built for people with ADHD. The app externalizes the things ADHD impairs — time awareness, sequence memory, task initiation, and emotional regulation around failure — into a guided, sequential interface with immediate feedback and zero shame. ## Architecture ``` synculous/ ├── synculous-client/ # Next.js 16 frontend (React, Tailwind) ├── api/ # Flask REST API │ ├── main.py # App entry point, auth routes │ └── routes/ # Domain route modules │ ├── routines.py # Routines CRUD + sessions │ ├── routine_sessions_extended.py # Pause, resume, abort, notes │ ├── routine_stats.py # Completion stats, streaks, weekly summary │ ├── routine_templates.py # Premade routine templates │ ├── routine_steps_extended.py # Step instructions, types, media │ ├── routine_tags.py # Tagging system │ ├── medications.py # Medication scheduling + adherence │ ├── preferences.py # User settings + timezone │ ├── notifications.py # Web push subscriptions │ ├── rewards.py # Variable reward system │ └── victories.py # Achievement detection ├── core/ # Shared business logic │ ├── postgres.py # Generic PostgreSQL CRUD │ ├── auth.py # JWT + bcrypt authentication │ ├── users.py # User management │ ├── routines.py # Routine/session/streak logic │ ├── tz.py # Timezone-aware date/time helpers │ └── notifications.py # Multi-channel notifications ├── scheduler/ │ └── daemon.py # Background polling for reminders ├── bot/ # Discord bot (optional) ├── ai/ # LLM parser for natural language commands ├── config/ │ ├── schema.sql # Database schema │ ├── seed_templates.sql # 12 premade ADHD-designed routine templates │ ├── seed_rewards.sql # Variable reward pool │ └── .env.example # Environment template ├── docker-compose.yml └── Dockerfile ``` ## Quick Start ```bash # Copy environment config cp config/.env.example config/.env # Edit with your values nano config/.env # Start everything docker-compose up ``` This starts five services: | Service | Port | Description | |---------|------|-------------| | `db` | 5432 | PostgreSQL 16 with schema + seed data | | `app` | 8080 | Flask API | | `scheduler` | — | Background daemon for medication/routine reminders | | `bot` | — | Discord bot (optional, needs `DISCORD_BOT_TOKEN`) | | `client` | 3000 | Next.js frontend | ## Features ### Routines - Create routines with ordered steps (4-7 steps recommended) - Run sessions with a guided, one-step-at-a-time focus interface - Complete, skip, pause, resume, or cancel sessions - Swipe gestures for step completion on mobile - Per-step timing with visual countdown - Animated celebration screen on completion with streak stats and variable rewards ### Premade Templates 12 ADHD-designed templates ship out of the box, seeded from `config/seed_templates.sql`: | Template | What it's for | |----------|---------------| | Morning Launch | Getting from bed to ready. First step: just sit up. | | Leaving the House | The keys-wallet-phone checklist. | | Focus Sprint | One focused work block with environment setup first. | | Wind Down | Screen-first sleep transition. | | Quick Tidy | Fast sweep, not deep cleaning. Completable on bad days. | | Body Reset | Minimum viable hygiene. Zero judgment. | | Unstuck | For executive function paralysis. Pure two-minute-rule. | | Evening Reset | Set tomorrow up to be easier. | | Move Your Body | Not a workout. Just movement. Starts with shoes. | | Sunday Reset | Weekly prep so Monday doesn't ambush you. | | Cook a Meal | One meal, start to finish, low activation energy. | | Errand Run | Externalized planning + sequencing for errands. | All templates follow the design framework: two-minute-rule entry points, concrete instructions, zero-shame language, 4-6 steps max. ### Medications - Scheduling: daily, twice daily, specific days, every N days, as-needed (PRN) - "Today's meds" view with cross-midnight lookahead (late night + early morning) - Take, skip, snooze actions with logging - Adherence tracking and statistics - Refill tracking with low-quantity alerts - Background reminders via the scheduler daemon ### Streaks and Stats - Per-routine streak tracking (current + longest) - Weekly summary across all routines - Completion rate and average duration stats - Victory detection (comebacks, weekend completions, variety, consistency) - Milestone celebrations at 3, 7, 14, 21, 30, 60, 90, 100, 365 days ### Rewards - Variable reward pool seeded from `config/seed_rewards.sql` - Random reward on routine completion (post-completion only, never mid-routine) - Reward history tracking per user - Common and rare rarity tiers ### Notifications - Web push notifications via VAPID - Discord webhooks - ntfy support - Scheduled reminders for medications and routines ### Timezone Support All date/time operations respect the user's local timezone: - The frontend sends `X-Timezone-Offset` with every API request - The timezone offset is also persisted to `user_preferences` for background jobs - Streaks, "today's meds," weekly stats, and reminders all use the user's local date - The scheduler daemon looks up each user's stored offset for reminder timing ### User Preferences - Sound effects (default off — habituation risk) - Haptic feedback (default on) - Launch screen toggle - Celebration style - Timezone offset (auto-synced from browser) ## API Overview All endpoints require `Authorization: Bearer ` except `/api/register` and `/api/login`. ### Auth | Method | Endpoint | Description | |--------|----------|-------------| | POST | `/api/register` | Create account | | POST | `/api/login` | Get JWT token | ### Routines | Method | Endpoint | Description | |--------|----------|-------------| | GET | `/api/routines` | List user's routines | | POST | `/api/routines` | Create a routine | | GET | `/api/routines/:id` | Get routine with steps | | PUT | `/api/routines/:id` | Update routine | | DELETE | `/api/routines/:id` | Delete routine | | GET | `/api/routines/:id/steps` | List steps | | POST | `/api/routines/:id/steps` | Add a step | | PUT | `/api/routines/:id/steps/reorder` | Reorder steps | | POST | `/api/routines/:id/start` | Start a session | ### Sessions | Method | Endpoint | Description | |--------|----------|-------------| | GET | `/api/sessions/active` | Get active or paused session | | POST | `/api/sessions/:id/complete-step` | Complete current step | | POST | `/api/sessions/:id/skip-step` | Skip current step | | POST | `/api/sessions/:id/pause` | Pause session | | POST | `/api/sessions/:id/resume` | Resume session | | POST | `/api/sessions/:id/cancel` | Cancel session | | POST | `/api/sessions/:id/abort` | Abort with reason | ### Medications | Method | Endpoint | Description | |--------|----------|-------------| | GET | `/api/medications` | List medications | | POST | `/api/medications` | Add medication | | GET | `/api/medications/today` | Today's schedule with status | | POST | `/api/medications/:id/take` | Log dose taken | | POST | `/api/medications/:id/skip` | Log dose skipped | | GET | `/api/medications/adherence` | Adherence stats | | GET | `/api/medications/refills-due` | Refills due soon | ### Stats | Method | Endpoint | Description | |--------|----------|-------------| | GET | `/api/routines/:id/stats` | Routine completion stats | | GET | `/api/routines/:id/streak` | Routine streak | | GET | `/api/routines/streaks` | All streaks | | GET | `/api/routines/weekly-summary` | Weekly progress | | GET | `/api/victories` | Achievement detection | ### Templates, Tags, Rewards, Preferences | Method | Endpoint | Description | |--------|----------|-------------| | GET | `/api/templates` | List available templates | | POST | `/api/templates/:id/clone` | Clone template to user's routines | | GET/PUT | `/api/preferences` | User settings | | GET | `/api/rewards/random` | Random completion reward | ## Environment Variables | Variable | Description | |----------|-------------| | `DB_HOST` | PostgreSQL host | | `DB_PORT` | PostgreSQL port | | `DB_NAME` | Database name | | `DB_USER` | Database user | | `DB_PASS` | Database password | | `JWT_SECRET` | JWT signing secret | | `DISCORD_BOT_TOKEN` | Discord bot token (optional) | | `API_URL` | API URL for bot (default: `http://app:5000`) | | `OPENROUTER_API_KEY` | OpenRouter API key (for AI parser) | | `POLL_INTERVAL` | Scheduler poll interval in seconds (default: 60) | ## Design Framework Synculous follows a documented design framework based on research from 9 books on behavior design, cognitive psychology, and ADHD. The three core principles: 1. **Immediate Feedback** — Visual state change on tap in <0.1s. Per-step completion signals. Post-routine celebration. 2. **One Thing at a Time** — Current step visually dominant. No decisions during execution. 4-7 steps max per routine. 3. **Zero Shame** — No failure language. Streaks as identity markers, not performance metrics. Non-punitive everywhere. ## License MIT