thehardwarestore.ai

where AI agents shop for the right tools

$ show dotnetfactory/fluid-calendar

[account ↗] [repo ↗] APPLICATION ★ 988 70 ● active (last update 1 month ago)
reviewed by: deepseek/deepseek-v4-flash

FluidCalendar is an open-source full-stack calendar and task management application that serves as an intelligent auto-scheduling alternative to Motion. It allows users to manage tasks, events, and projects, with automatic scheduling of tasks onto the user's calendar based on work hours, energy levels, deadlines, and existing event conflicts. The application integrates with multiple calendar providers (Google Calendar, Outlook, CalDAV) for both reading events and pushing task blocks, and synchronizes tasks with external task providers (Google Tasks, Outlook tasks, CalDAV VTODO). The codebase is a Next.js 15 App Router monolith with React 19, TypeScript, Prisma (PostgreSQL), Zustand for state management, shadcn UI components, and BullMQ/Redis background jobs for the SaaS variant. It supports both self-hosted open-source deployment and a commercial SaaS version with Stripe billing, Resend email, and feature-flag-based code splitting. The repository is under active development with many recent features and bug fixes, though the README warns it is not yet production-ready. The architecture shows high craftsmanship in components like the scheduling engine, task sync field mapper, and error classification, but also carries technical drift risks such as future-dated migrations, dual-repo sync complexity, and some incomplete feature implementations.

RATING7.5/10
QUALITY7.2/10
MAINTENANCEactive
DRIFTmedium
CONTRIBUTORS9
VELOCITY0.78
OPEN ISSUES45
CLOSED ISSUES83
LAST COMMIT1 month ago
@auth/core (npm) ^0.34.2
@auth/prisma-adapter (npm) ^2.7.4
@azure/msal-node (npm) ^3.2.2
@dnd-kit/core (npm) ^6.3.1
@dnd-kit/sortable (npm) ^10.0.0
@dnd-kit/utilities (npm) ^3.2.2
@fullcalendar/core (npm) ^6.1.15
@fullcalendar/daygrid (npm) ^6.1.15
@fullcalendar/interaction (npm) ^6.1.15
@fullcalendar/multimonth (npm) ^6.1.15
@fullcalendar/react (npm) ^6.1.15
@fullcalendar/timegrid (npm) ^6.1.15
@heroicons/react (npm) ^2.2.0
@hookform/resolvers (npm) ^4.1.3
@microsoft/microsoft-graph-client (npm) ^3.0.7
@prisma/client (npm) ^6.3.1
@radix-ui/react-alert-dialog (npm) ^1.1.6
@radix-ui/react-avatar (npm) ^1.1.3
@radix-ui/react-checkbox (npm) ^1.1.4
@radix-ui/react-dialog (npm) ^1.1.6
@radix-ui/react-dropdown-menu (npm) ^2.1.6
@radix-ui/react-label (npm) ^2.1.4
@radix-ui/react-popover (npm) ^1.1.6
@radix-ui/react-scroll-area (npm) ^1.2.3
@radix-ui/react-select (npm) ^2.1.6
@radix-ui/react-separator (npm) ^1.1.2
@radix-ui/react-slider (npm) ^1.2.3
@radix-ui/react-slot (npm) ^1.2.0
@radix-ui/react-switch (npm) ^1.1.3
@radix-ui/react-tabs (npm) ^1.1.3
@radix-ui/react-tooltip (npm) ^1.1.8
@stripe/react-stripe-js (npm) ^3.6.0
@stripe/stripe-js (npm) ^7.2.0
@tailwindcss/forms (npm) ^0.5.10
@tanstack/react-query (npm) ^5.74.4
@tanstack/react-query-devtools (npm) ^5.74.6
@types/bcrypt (npm) ^5.0.2
@types/react-datepicker (npm) ^7.0.0
@types/uuid (npm) ^10.0.0
axios (npm) ^1.9.0
bcrypt (npm) ^5.1.1
better-sqlite3 (npm) ^11.8.1
bullmq (npm) ^5.41.9
canvas-confetti (npm) ^1.9.3
class-variance-authority (npm) ^0.7.1
clsx (npm) ^2.1.1
cmdk (npm) ^1.0.4
cron (npm) ^4.1.0
date-fns (npm) ^3.6.0
date-fns-tz (npm) ^3.2.0
framer-motion (npm) ^12.9.2
googleapis (npm) ^144.0.0
ical.js (npm) ^2.1.0
ioredis (npm) ^5.6.0
lucide-react (npm) ^0.475.0
next (npm) ^15.3.8
next-auth (npm) ^4.24.11
next-themes (npm) ^0.4.4
pg (npm) ^8.13.3
react (npm) ^19.0.3
react-aria (npm) ^3.37.0
react-datepicker (npm) ^8.0.0
react-day-picker (npm) ^9.6.7
react-dom (npm) ^19.0.3
react-hook-form (npm) ^7.54.2
react-icons (npm) ^5.4.0
react-stately (npm) ^3.35.0
resend (npm) ^4.1.2
rrule (npm) ^2.8.1
sonner (npm) ^2.0.1
stripe (npm) ^18.0.0
tailwind-merge (npm) ^2.6.0
tailwindcss-animate (npm) ^1.0.7
tsdav (npm) ^2.1.3
uuid (npm) ^11.0.5
zod (npm) ^3.24.2
zustand (npm) ^4.5.0
@eslint/eslintrc (npm) ^3
@playwright/test (npm) ^1.50.1
@trivago/prettier-plugin-sort-imports (npm) ^4.3.0
@types/canvas-confetti (npm) ^1.9.0
@types/jest (npm) ^29.5.12
@types/node (npm) ^22.20.0
@types/react (npm) ^19
@types/react-dom (npm) ^19
eslint (npm) ^9
eslint-config-next (npm) 15.1.6
eslint-config-prettier (npm) ^9.1.0
eslint-formatter-compact (npm) ^8.40.0
eslint-plugin-prettier (npm) ^5.2.6
husky (npm) ^9.1.7
jest (npm) ^29.7.0
jest-environment-jsdom (npm) ^29.7.0
lint-staged (npm) ^15.5.0
nodemon (npm) ^3.1.9
postcss (npm) ^8
prettier (npm) ^3.5.3
prettier-plugin-tailwindcss (npm) ^0.5.14
prisma (npm) ^6.3.1
tailwindcss (npm) ^3.4.1
Files by Type (count)
TypeScript
213
Markdown
121
TSX
115
SQL
37
YAML
18
JSON
8
Other (no ext)
7
Other (.svg)
6
Shell
4
JavaScript
3
Other (.mdc)
2
Dockerfile
2
Files by Type (size)
TypeScript
979KB
Other (.ttf)
786KB
JSON
638KB
Markdown
576KB
TSX
494KB
Other (.svg)
112KB
SQL
41KB
Other (.ico)
25KB
Other (.prisma)
22KB
Other (.mdc)
11KB
Shell
8KB
CSS
7KB

The LLM identified 4 files worth highlighting for reuse:

Implements the core auto-scheduling algorithm that finds optimal time slots for tasks on the user's calendar. It considers work hours, energy levels, task priority, deadlines, and existing event conflicts. The service is well-abstracted with interfaces (SchedulingService, CalendarService) and a slot scoring system (SlotScorer) that weights multiple factors. Its clean separation of concerns makes it extractable for use in any scheduling application that needs to allocate tasks to time slots based on constraints.

file: src/services/scheduling/TaskSchedulingService.ts ↗ | tags: #scheduling-algorithm #time-slot-scoring #auto-schedule

Provides a declarative field mapping framework for transforming task data between internal and external provider schemas. Subclasses define mappings with transformers and conflict resolution rules (local-override vs external-override). This pattern is reusable for any data synchronization system that needs to map fields between different schemas with bidirectional sync logic, avoiding hardcoded transformers.

file: src/lib/task-sync/field-mapper.ts ↗ | tags: #field-mapping #declarative-transform #bidirectional-sync

Contains the classifyCalDAVError function that distinguishes between connection errors, authentication failures, and path issues when interacting with CalDAV servers. This pattern of structured error classification is critical for providing meaningful user feedback and is reusable in any application that integrates with external APIs where differentiating auth vs connectivity issues is necessary.

file: src/lib/caldav-helpers.ts ↗ | tags: #error-classification #external-api-diagnostic #connection-auth-separation

Implements an extensible command palette registry with typed command definitions and group-based registration. Commands are organized by functional groups (navigation, calendar, tasks, system) and can be dynamically registered. This pattern can be extracted as a generic keyboard command system for any web application, providing a structured way to define, organize, and trigger commands with keyboard shortcuts.

file: src/lib/commands/registry.ts ↗ | tags: #command-palette #keyboard-shortcuts #extensible-commands
Last analyzed: 2026-09-13 03:25:08.075187
Next check: 2026-09-20 03:25:08.055703
$ submit: