{"id":25706369,"url":"https://github.com/dotnetfactory/fluid-calendar","last_synced_at":"2026-01-24T07:52:41.561Z","repository":{"id":278000902,"uuid":"934194391","full_name":"dotnetfactory/fluid-calendar","owner":"dotnetfactory","description":null,"archived":false,"fork":false,"pushed_at":"2025-12-29T17:56:41.000Z","size":1538,"stargazers_count":873,"open_issues_count":59,"forks_count":45,"subscribers_count":10,"default_branch":"main","last_synced_at":"2026-01-01T23:10:56.878Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dotnetfactory.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["eibrahim"]}},"created_at":"2025-02-17T12:34:57.000Z","updated_at":"2026-01-01T19:13:00.000Z","dependencies_parsed_at":"2025-02-17T13:38:10.809Z","dependency_job_id":"c978a9e5-aa7d-4451-be2c-f90d2eee727d","html_url":"https://github.com/dotnetfactory/fluid-calendar","commit_stats":null,"previous_names":["dotnetfactory/fluid-calendar"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/dotnetfactory/fluid-calendar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotnetfactory%2Ffluid-calendar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotnetfactory%2Ffluid-calendar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotnetfactory%2Ffluid-calendar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotnetfactory%2Ffluid-calendar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dotnetfactory","download_url":"https://codeload.github.com/dotnetfactory/fluid-calendar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotnetfactory%2Ffluid-calendar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28720388,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T05:53:42.649Z","status":"ssl_error","status_checked_at":"2026-01-24T05:53:41.698Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-25T07:02:22.229Z","updated_at":"2026-01-24T07:52:41.555Z","avatar_url":"https://github.com/dotnetfactory.png","language":"TypeScript","funding_links":["https://github.com/sponsors/eibrahim"],"categories":["前端开发框架及项目","TypeScript"],"sub_categories":["前端项目_其他"],"readme":"# FluidCalendar\n\nAn open-source alternative to Motion, designed for intelligent task scheduling and calendar management. FluidCalendar helps you stay on top of your tasks with smart scheduling capabilities, calendar integration, and customizable workflows.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n⚠️ **WARNING: ACTIVE DEVELOPMENT VERY BUGGY - REPORT BUGS AND BE PATIENT ✌️** ⚠️\n\nThis project is in active development and currently contains many bugs and incomplete features. It is not yet recommended for production use. If you encounter issues:\n\n1. Please check the [existing issues](https://github.com/dotnetfactory/fluid-calendar/issues) to see if it's already reported\n2. If not found, [create a new issue](https://github.com/dotnetfactory/fluid-calendar/issues/new) with:\n   - Steps to reproduce\n   - Expected behavior\n   - Actual behavior\n   - Any relevant error messages or screenshots\n\nYour bug reports help make FluidCalendar better! We appreciate your patience and contributions as we work to stabilize the platform.\n\n## About\n\nFluidCalendar is built for people who want full control over their scheduling workflow. It combines the power of automatic task scheduling with the flexibility of open-source software. Read more about the journey and motivation in [Part 1 of my blog series](https://medium.com/front-end-weekly/fluid-calendar-an-open-source-alternative-to-motion-part-1-7a5b52bf219d).\n\n![Snagit 2024 2025-02-16 12 33 23](https://github.com/user-attachments/assets/515381e9-b961-475d-a272-d454ecca59cb)\n\n## Support the Project ❤️\n\nIf you find FluidCalendar useful, please consider supporting its development. Your sponsorship helps ensure continued maintenance and new features.\n\n[![GitHub Sponsor](https://img.shields.io/badge/Sponsor-GitHub-ea4aaa.svg?style=for-the-badge\u0026logo=github)](https://github.com/sponsors/eibrahim)\n\nBy becoming a sponsor, you:\n\n- Help keep the project actively maintained\n- Get early access to new features\n- Support open-source software development\n\n## Try the SaaS Version\n\nDon't want to self-host? We're currently beta testing our hosted version at [FluidCalendar.com](https://fluidcalendar.com). Sign up for the waitlist to be among the first to experience the future of intelligent calendar management, with all the features of the open-source version plus:\n\n- Managed infrastructure\n- Automatic updates\n- Premium support\n- Advanced AI features\n\n## Features\n\n- 🤖 **Intelligent Task Scheduling** - Automatically schedule tasks based on your preferences and availability\n- 📅 **Calendar Integration** - Seamless sync with Google Calendar (more providers coming soon)\n- ⚡ **Smart Time Slot Management** - Finds optimal time slots based on your work hours and buffer preferences\n- 🎨 **Modern UI** - Clean, responsive interface with smooth transitions\n- 🔧 **Customizable** - Adjust scheduling algorithms and preferences to your needs\n- 🔒 **Privacy-Focused** - Self-host your own instance\n\n## Tech Stack\n\n- Next.js 15 with App Router\n- TypeScript\n- Prisma for database management\n- FullCalendar for calendar UI\n- NextAuth.js for authentication\n- Tailwind CSS for styling\n\n## Prerequisites\n\n- Node.js (version specified in `.nvmrc`)\n- A Google Cloud Project (for Google Calendar integration)\n\n## Google Cloud Setup\n\nTo enable Google Calendar integration:\n\n1. Create a Project:\n\n   - Go to [Google Cloud Console](https://console.cloud.google.com)\n   - Click \"New Project\" and follow the prompts\n   - Note your Project ID\n\n2. Enable Required APIs:\n\n   - In your project, go to \"APIs \u0026 Services\" \u003e \"Library\"\n   - Search for and enable:\n     - Google Calendar API\n     - Google People API (for user profile information)\n\n3. Configure OAuth Consent Screen:\n\n   - Go to \"APIs \u0026 Services\" \u003e \"OAuth consent screen\"\n   - Choose \"External\" user type\n   - Fill in the required information:\n     - App name: \"FluidCalendar\" (or your preferred name)\n     - User support email\n     - Developer contact information\n   - Add scopes:\n     - `./auth/calendar.events`\n     - `./auth/calendar`\n     - `./auth/userinfo.email`\n     - `openid`\n     - `/auth/tasks` _(Required if you plan to sync Google Tasks)_\n   - Add test users if in testing mode\n\n4. Create OAuth 2.0 Credentials:\n\n   - Go to \"APIs \u0026 Services\" \u003e \"Credentials\"\n   - Click \"Create Credentials\" \u003e \"OAuth client ID\"\n   - Choose \"Web application\"\n   - Set Authorized JavaScript origins:\n     - `http://localhost:3000` (for development)\n     - Your production URL (if deployed)\n   - Set Authorized redirect URIs:\n     - `http://localhost:3000/api/calendar/google` (for development)\n     - `https://your-domain.com/api/calendar/google` (for production)\n   - Click \"Create\"\n   - Save the generated Client ID and Client Secret\n\n5. Configure Credentials:\n   - Go to FluidCalendar Settings \u003e System\n   - Enter your Google Client ID and Client Secret in the Google Calendar Integration section\n   - Or set environment variables as fallback:\n     ```bash\n     GOOGLE_CLIENT_ID=\"your-client-id.apps.googleusercontent.com\"\n     GOOGLE_CLIENT_SECRET=\"your-client-secret\"\n     ```\n\nNote: For production deployment, you'll need to:\n\n- Verify your domain ownership\n- Submit your application for verification if you plan to have more than 100 users\n- Add your production domain to the authorized origins and redirect URIs\n\n## Microsoft Outlook Setup\n\nTo enable Outlook Calendar integration:\n\n1. Create an Azure AD Application:\n\n   - Go to [Azure Portal](https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade)\n   - Click \"New registration\"\n   - Name your application (e.g., \"FluidCalendar\")\n   - Under \"Supported account types\", select \"Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)\"\n   - Click \"Register\"\n\n2. Configure Platform Settings:\n\n   - In your registered app, go to \"Authentication\"\n   - Click \"Add a platform\"\n   - Choose \"Web\"\n   - Add Redirect URIs:\n     - `http://localhost:3000/api/auth/callback/azure-ad` (for development)\n     - `https://your-domain.com/api/auth/callback/azure-ad` (for production)\n   - Under \"Implicit grant\", check \"Access tokens\" and \"ID tokens\"\n   - Click \"Configure\"\n\n3. Add API Permissions:\n\n   - Go to \"API permissions\"\n   - Click \"Add a permission\"\n   - Choose \"Microsoft Graph\"\n   - Select \"Delegated permissions\"\n   - Add the following permissions:\n     - `Calendars.ReadWrite`\n     - `Tasks.ReadWrite`\n     - `User.Read`\n     - `offline_access`\n   - Click \"Add permissions\"\n   - Click \"Grant admin consent\" (if you're an admin)\n\n4. Create Client Secret:\n\n   - Go to \"Certificates \u0026 secrets\"\n   - Click \"New client secret\"\n   - Add a description and choose expiry\n   - Click \"Add\"\n   - Copy the generated secret value immediately (you won't be able to see it again)\n\n5. Configure Credentials:\n   - Go to FluidCalendar Settings \u003e System\n   - Enter your Outlook credentials in the Outlook Calendar Integration section:\n     - Client ID (Application ID)\n     - Client Secret\n     - Tenant ID (Optional - leave empty to allow any Microsoft account)\n   - Or set environment variables as fallback:\n     ```bash\n     AZURE_AD_CLIENT_ID=\"your-client-id\"\n     AZURE_AD_CLIENT_SECRET=\"your-client-secret\"\n     AZURE_AD_TENANT_ID=\"your-tenant-id-or-common\"\n     ```\n\nNote: For production deployment:\n\n- Update the redirect URIs to include your production domain\n- Ensure all required permissions are granted\n- Consider implementing additional security measures based on your needs\n\n## Installation\n\n### Quick Start with Docker (Recommended)\n\n1. Install Docker on your machine\n2. Clone the repository (or just download the docker-compose.yml file):\n\n   ```bash\n   git clone https://github.com/dotnetfactory/fluid-calendar.git\n   cd fluid-calendar\n   ```\n\n3. Copy the example environment file and configure it:\n\n   ```bash\n   cp .env.example .env\n   ```\n\n   Edit the `.env` file and set at minimum these values:\n\n   ```\n   DATABASE_URL=postgresql://fluid:fluid@db:5432/fluid_calendar\n   NEXTAUTH_URL=http://localhost:3000\n   NEXTAUTH_SECRET=your-random-secret-key\n   ```\n\n4. Run the application:\n\n   ```bash\n   docker compose up -d\n   ```\n\n5. Visit http://localhost:3000\n\nThat's it! The application will be running with a PostgreSQL database automatically configured. The docker-compose.yml file is already configured to use the pre-built Docker image.\n\n### For Developers\n\nIf you want to develop FluidCalendar:\n\n1. Clone the repository:\n\n   ```bash\n   git clone https://github.com/dotnetfactory/fluid-calendar.git\n   cd fluid-calendar\n   ```\n\n2. Start the development environment:\n\n   ```bash\n   docker compose -f docker-compose.yml up -d\n   ```\n\n3. Visit http://localhost:3000\n\nThe development environment includes:\n\n- Hot reloading\n- PostgreSQL database\n- Development tools\n- Exposed database port (5432) for direct access\n\n### Useful Docker Commands\n\n```bash\n# View logs\ndocker compose logs -f\n\n# Stop the application\ndocker compose down\n\n# Update to the latest version\ndocker pull eibrahim/fluid-calendar:latest\ndocker compose up -d\n\n# Reset database (caution: deletes all data)\ndocker compose down -v\ndocker compose up -d\n\n# Access database CLI\ndocker compose exec db psql -U fluid -d fluid_calendar\n```\n\n## Environment Setup\n\n1. Copy `.env.example` to `.env`:\n\n```bash\ncp .env.example .env\n```\n\n2. Configure the following environment variables:\n\n- `DATABASE_URL`: Your database connection string\n- `NEXTAUTH_URL`: Your application URL\n- `NEXTAUTH_SECRET`: Random string for session encryption\n\nNote: Google credentials and logging settings can be managed through the UI in Settings \u003e System. Environment variables will be used as fallback if system settings are not configured.\n\n## Getting Started\n\nFirst, run the development server:\n\n```bash\nnpm run dev\n# or\nyarn dev\n# or\npnpm dev\n# or\nbun dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\n## Need Professional Help?\n\nDon't want to handle the migration yourself? We offer a complete done-for-you service that includes:\n\n- Managed OpenProject hosting\n- Complete Jira migration\n- 24/7 technical support\n- Secure and reliable infrastructure\n\nVisit [portfolio.elitecoders.co/openproject](https://portfolio.elitecoders.co/openproject) to learn more about our managed OpenProject migration service.\n\n## About\n\nThis project was built by [EliteCoders](https://www.elitecoders.co), a software development company specializing in custom software solutions. If you need help with:\n\n- Custom software development\n- System integration\n- Migration tools and services\n- Technical consulting\n\nPlease reach out to us at hello@elitecoders.co or visit our website at [www.elitecoders.co](https://www.elitecoders.co).\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.\n\nPlease make sure to update tests as appropriate.\n\n## SAAS Development\n\nFluidCalendar is available as both an open source self-hosted solution and a managed SAAS service. The open source version contains all the core functionality, while the SAAS version includes additional premium features.\n\n### Open Source vs SAAS Features\n\n| Feature                           | Open Source | SAAS |\n| --------------------------------- | ----------- | ---- |\n| Calendar Management               | ✅          | ✅   |\n| Task Management                   | ✅          | ✅   |\n| Google Calendar Integration       | ✅          | ✅   |\n| Outlook Calendar Integration      | ✅          | ✅   |\n| CalDAV Integration                | ✅          | ✅   |\n| Billing \u0026 Subscription Management | ❌          | ✅   |\n\n### SAAS Development Setup\n\nIf you're a contributor to the SAAS version, follow these steps to set up your development environment:\n\n1. Clone the private SAAS repository:\n\n   ```\n   git clone https://github.com/dotnetfactory/fluid-calendar-saas.git\n   ```\n\n2. Enable SAAS features in your environment:\n\n   ```\n   # .env.local\n   ENABLE_SAAS_FEATURES=true\n   ```\n\n3. Run the development server:\n   ```\n   npm run dev\n   ```\n\n### Syncing Changes Between Repositories\n\nTo sync changes from the private SAAS repository to the public open source repository:\n\n1. Use the provided sync script:\n\n   ```\n   ./scripts/sync-repos.sh /path/to/private/repo /path/to/public/repo\n   ```\n\n2. Review the changes in the public repository\n3. Commit and push the changes to the public repository\n\n### Contributing to SAAS Features\n\nWhen developing SAAS features:\n\n1. Place all SAAS-specific code in the `src/saas` directory\n2. Use the feature flag system to conditionally enable SAAS features\n3. Provide fallbacks for SAAS features in the open source version\n\nFor more information about contributing to the SAAS version, please contact the maintainers.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdotnetfactory%2Ffluid-calendar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdotnetfactory%2Ffluid-calendar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdotnetfactory%2Ffluid-calendar/lists"}