android
Flutter (stable), Dart with null-safety.
- Local storage: Drift (SQLite) via
sqlite3_flutter_libs,path_provider,path. - State management: Riverpod (
flutter_riverpod). - IDs:
uuid. - Notifications:
flutter_local_notifications+timezone(opt-in reminders). - Home screen widget:
home_widget(Android App Widget, nativeRemoteViews). - Preferences:
shared_preferences(accent color + theme override). - Misc:
intl,collection. - Dev:
flutter_lints,drift_dev,build_runner.
No backend, no analytics SDK, no crash reporting that phones home — hard requirement. License: MIT.
Primary user: someone who wants a dead-simple weekly task list — one screen, seven days — with no accounts, no cloud, and no clutter. The job is to see the week at a glance and check off today's tasks without the overhead of calendars, projects, or tags.
Loopweek is a free, fully open-source weekly to-do app whose entire value is constraint: one screen, seven days, nothing else. No calendar grid, no month view, no navigation between screens for the core loop. Success means the user can plan and complete a week without ever leaving a single screen, and without the app asking anything of them (no account, no permission, no payment).
An original, clean-room implementation of the "one screen, seven days" concept. Its meaningfully different position is a weekly planner that makes constraint the feature: the accordion single-open-day model keeps the screen short and predictable, tasks are date-specific with no automatic rollover (incomplete tasks stay on their original date forever), and recurring tasks generate independent occurrences so editing one never touches past or future.
- Daily-driving on a phone; the week view is the home destination, reached repeatedly through the day.
- Optional home-screen widget puts today's tasks on the launcher with checkboxes that toggle completion in the background without opening the app.
- 100% local, on-device storage; everything works offline.
- System light/dark mode is followed automatically with a manual override in Settings.
- Reminder notifications are optional and opt-in.
- Single-screen week view as an accordion: exactly one day expanded at a time; today is expanded by default. Tapping a collapsed day expands it and collapses the previously open day.
- Day-specific tasks with no automatic rollover. An incomplete task stays on its original date forever unless the user manually moves it.
- Recurrence (never / daily / weekly) materializes independent rows linked back to the source rule by
recurrenceParentId. Completing or deleting one occurrence never affects past or future occurrences; future recurrence can be stopped without touching history. - Task fields:
id,title,date,isCompleted,colorTag(orange | pink | blue | green, default orange),hasTime,time,hasReminder,recurrence,recurrenceParentId,sortOrder. - One accent color per user preference drives the active checkbox, the selected segmented-control option, toggle switches, primary actions, and the home-screen widget.
- Light/dark theme follows system with manual override.
- Optional reminders; notification permission is requested only when the user actually switches a reminder on — never at startup.
- Home-screen widget: medium size shows today + up to 5 tasks (incomplete prioritized); large size shows up to 10 tasks, or today + tomorrow when today is sparse. Widget uses the user's selected accent color.
- Interaction model is tap and long-press only (long-press to remove or reorder). No swipe gestures.
- First run: one skippable welcome sheet (value prop, the three gestures, live accent pick) shown once and persisted via shared_preferences; an empty week shows a first-task orientation, and a one-time "hold a task" hint retires once the gesture is used or dismissed.
No cloud sync, no accounts or login, no calendar/month view, no subtasks, no tags or projects beyond the 4 color tags, no priority levels beyond color, no AI features, no ads, no analytics, no in-app purchases.
- Name: Loopweek — an original product, not derived from any other app's name, logo, or code.
- Voice: plain, direct, de-emphasized. Copy is minimal and functional ("Add a new task...", "Scheduled for", "Remind me", "Hold to remove tasks or reorder by time and priority.").
- Binding visual constraint (recorded, not expanded): bold, tight-tracking, condensed sans-serif for day headers and section titles — heavy weight, slightly reduced letter spacing. This is the app's stated main visual signature to keep consistent everywhere a heading appears.
- Binding visual constraint (recorded, not expanded): single accent color per user (default orange, roughly
#F4511E) for active checkboxes, selected segmented control, toggles, and primary actions; light theme off-white#F2F2F2-ish with white content areas; dark theme near-black#121212-ish with dark gray content areas (avoid pure black/pure white); flat design, no shadows/heavy card elevation, dividers do the separating; moderate corner radius (~10-12dp), toggles remain pill-shaped.
README.md— full setup, architecture, recurrence-risk, privacy, and home-widget description.docs/Loopweek product spec.md— the complete original project brief handed to the implementation.CONTRIBUTING.md,LICENSE(MIT) — present and public-repo-ready.- Brand mark: an original seven-segment open-loop mark (see
DESIGN.md,docs/brand/generate_logo.py). No third-party brand, asset, or trademark is used. - No testimonials, customers, benchmarks, pricing, or deployment evidence exists; future work must not invent any.
- Constraint is the feature. One screen, seven days, nothing else — refusing features is a principle, not a backlog gap.
- The week is the screen. No navigation for the core loop; the accordion keeps the single-open-day model short and predictable.
- Tasks belong to their date. No rollover, ever — an incomplete task stays where it was put until the user moves it.
- Nothing asks anything of the user. No account, no cloud, no ads, no paywall, no upfront permission; notifications and widget are pure opt-in.
- One color, flat design, marks the surface. A single accent color and dividers (never shadows) carry the entire visual system.
- Light/dark follows system with manual override.
- No product-specific accessibility standard beyond Flutter/Material defaults has been established; treat as an open decision.