A modern, open-source web platform for project management and collaboration. FortyOne provides a comprehensive suite of tools for teams to organize, track, and deliver projects efficiently.
- 🎯 Project Management: Organize projects with objectives, key results, and milestones
- 📋 Task Tracking: Create, assign, and track tasks with rich text editing
- 👥 Team Collaboration: Real-time collaboration with team members
- 📊 Analytics: PostHog integration for user analytics and insights
- 🔐 Authentication: Secure authentication with NextAuth and Google OAuth
- 📱 Cross-Platform: Web application with React Native mobile app
- 🎨 Modern UI: Built with Radix UI, Tailwind CSS, and Framer Motion
- ⚡ Performance: Optimized with Next.js 15 and React 19
- 🔍 Search: Built-in search functionality across all content
- 📚 Documentation: Comprehensive documentation site with Fumadocs
# Clone the repository
git clone https://github.com/complexus/fortyone.git
cd fortyone
# Install dependencies
pnpm install
# Set up environment variables
cp apps/landing/.env.example apps/landing/.env
cp apps/projects/.env.example apps/projects/.env
cp apps/mobile/.env.example apps/mobile/.env
# Edit .env files with your actual values
# Start development server
pnpm devVisit https://fortyone.lc to see the application.
- 📚 User Guide - Complete documentation
- 🤝 Contributing - How to contribute
- 🔒 Security - Security policy and reporting
FortyOne is built as a monorepo using Turborepo with the following structure:
fortyone/
├── apps/ # Applications
│ ├── landing/ # Marketing & authentication
│ ├── docs/ # Documentation site
│ ├── projects/ # Main project management app
│ └── mobile/ # React Native mobile app
├── packages/ # Shared packages
│ ├── ui/ # Component library
│ ├── lib/ # Shared utilities
│ ├── icons/ # Icon library
│ └── [config]/ # Tooling configurations
└── tools/ # Development tools
We welcome contributions! Please see our Contributing Guide for details.
# Install dependencies
pnpm install
# Start development
pnpm dev
# Run tests
pnpm test
# Lint code
pnpm lintThis project is licensed under the FortyOne License - see the LICENSE file for details.
The FortyOne License allows free personal and non-commercial use, while requiring commercial licensing for businesses with $200K+ annual revenue.
- 📧 Email: [email protected]
- 🐛 Issues: GitHub Issues
- 💬 Discussions: GitHub Discussions
- 📖 Documentation: docs.fortyone.app
- Built with Next.js, React, and TypeScript
- UI components by Radix UI
- Analytics by PostHog
Before setting up the development environment, ensure you have the following installed:
- Node.js (v18 or higher) - Download here
- pnpm (v9.3.0 or higher) - Install with
npm install -g pnpm - Caddy (v2 or higher) - Installation guide
Caddy is required for local development as it handles subdomain routing and SSL termination.
macOS (Homebrew):
brew install caddyLinux (Ubuntu/Debian):
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddyOther platforms: See Caddy's official installation docs
git clone <repository-url>
cd fortyone
pnpm installImportant: We use .lc domains for local development instead of .local because .local domains cannot be added to OAuth providers (like Google) as valid redirect URIs. This allows us to test authentication flows locally with real OAuth providers.
.local: Cannot be used for OAuth redirects, but Caddy supports automatic wildcard routing.localhost: Caddy supports automatic wildcard routing, but limited OAuth provider support.lc: Valid TLD for OAuth redirects, but requires manual subdomain configuration
Add the following entries to your /etc/hosts file:
sudo nano /etc/hostsAdd these lines:
127.0.0.1 fortyone.lc
127.0.0.1 docs.fortyone.lc
127.0.0.1 www.fortyone.lc
127.0.0.1 qa.fortyone.lc
127.0.0.1 payments.fortyone.lc
127.0.0.1 growth.fortyone.lc
Note: Unlike .local or .localhost domains, each subdomain must be manually added to both /etc/hosts and the Caddyfile. When adding new workspaces or subdomains, you'll need to:
- Add the subdomain to
/etc/hosts - Add a corresponding entry in the
Caddyfile - Restart Caddy
The project includes a unified development command that starts both Turbo and Caddy:
pnpm devThis command will:
- Start all Next.js applications in development mode
- Launch Caddy server with SSL/TLS termination
- Enable hot reloading across all apps
- Serve apps with HTTPS (using Caddy's internal CA)
Once running, access your applications at:
- Landing Page: https://fortyone.lc (port 3000)
- Documentation: https://docs.fortyone.lc (port 3002)
- Projects App: https://*.fortyone.lc (port 3001)
- QA workspace: https://qa.fortyone.lc
- Payments workspace: https://payments.fortyone.lc
- Growth workspace: https://growth.fortyone.lc
Note: All local domains use HTTPS with Caddy's internal CA. You may need to accept the security certificate in your browser on first visit.
This is a Turborepo monorepo with the following structure:
fortyone.tech/
├── apps/ # Applications
│ ├── landing/ # Main landing page (fortyone.lc)
│ ├── docs/ # Documentation site (docs.fortyone.lc)
│ └── projects/ # Projects management app (*.fortyone.lc)
├── packages/ # Shared packages
│ ├── ui/ # Shared React components
│ ├── icons/ # Icon library
│ ├── lib/ # Shared utilities and helpers
│ ├── tailwind-config/ # Shared Tailwind configuration
│ ├── eslint-config-custom/ # ESLint configuration
│ └── tsconfig/ # TypeScript configurations
├── Caddyfile # Caddy server configuration
└── package.json # Root package.json with scripts
- Purpose: Main marketing and landing pages
- URL: https://fortyone.lc
- Port: 3000
- Tech Stack: Next.js 15, React 19, Framer Motion, GSAP
- Features:
- MDX content support
- Authentication with NextAuth
- PostHog analytics
- Cal.com integration
- Purpose: Documentation and guides
- URL: https://docs.fortyone.lc
- Port: 3002
- Tech Stack: Next.js 15, Fumadocs
- Features:
- MDX-based documentation
- Built-in search
- Code syntax highlighting
- Purpose: Main application for project management
- URL: https://*.fortyone.lc (handles workspace-specific subdomain routing)
- Port: 3001
- Tech Stack: Next.js 16, React 19, TanStack Query, Tiptap
- Features:
- Rich text editing with Tiptap
- Drag and drop functionality
- Real-time collaboration
- Workspace-based subdomain routing
- Jest testing setup
- Docker support
Shared React component library built with:
- Radix UI primitives
- Tailwind CSS for styling
- TypeScript for type safety
Shared utilities, helpers, and business logic used across applications.
Centralized icon library for consistent iconography across all apps.
- tailwind-config: Shared Tailwind CSS configuration
- eslint-config-custom: Custom ESLint rules and configurations
- tsconfig: TypeScript configuration presets
# Build all apps and packages
pnpm build
# Build specific app
pnpm build --filter=landing
pnpm build --filter=docs
pnpm build --filter=projects# Lint all packages
pnpm lint
# Format code
pnpm format# Run tests (projects app has Jest setup)
cd apps/projects
pnpm testWhen adding a new workspace or subdomain:
-
Add to
/etc/hosts:sudo nano /etc/hosts # Add: 127.0.0.1 newworkspace.fortyone.lc -
Update
Caddyfile:newworkspace.fortyone.lc { tls internal reverse_proxy localhost:3001 }
-
Restart Caddy:
# Stop current dev process (Ctrl+C) and restart pnpm dev
The development environment uses Caddy as a reverse proxy to route subdomain traffic:
fortyone.lc→localhost:3000(landing)docs.fortyone.lc→localhost:3002(docs)*.fortyone.lc→localhost:3001(projects - workspace-specific routing)
This setup allows for:
- OAuth compatibility:
.lcdomains work with Google OAuth and other providers - SSL/TLS in development: Caddy provides HTTPS with internal certificates
- Realistic subdomain testing: Production-like routing behavior
- Clean application separation: Each app runs independently
- OAuth Support: Unlike
.local,.lcdomains can be registered as valid redirect URIs with OAuth providers like Google, enabling full authentication testing in development - Valid TLD:
.lcis Saint Lucia's country code TLD, making it a legitimate domain for authentication services - Manual Control: While requiring manual configuration, this gives explicit control over which subdomains are available
Subdomain not resolving:
- Verify
/etc/hostsentries are correct - Ensure the subdomain is added to the
Caddyfile - Clear DNS cache:
sudo dscacheutil -flushcache(macOS) orsudo systemctl restart systemd-resolved(Linux) - Restart Caddy: Stop with
Ctrl+Cand runpnpm devagain
SSL Certificate warnings:
- Accept Caddy's internal CA certificate in your browser
- The warning is expected on first visit to each subdomain
- Consider installing Caddy's root certificate for seamless development
Port conflicts:
- Check if ports 3000, 3001, 3002 are available
- Kill conflicting processes:
lsof -ti:3000 | xargs kill
Caddy not starting:
- Verify Caddy installation:
caddy version - Check Caddyfile syntax:
caddy validate --config Caddyfile - Ensure no other web servers are running on port 80/443
OAuth authentication issues:
- Verify the subdomain is registered in your OAuth provider's console
- Ensure redirect URIs include the full
https://subdomain.fortyone.lcformat - Check that the subdomain resolves correctly before testing auth
Dependencies issues:
- Clear node_modules:
rm -rf node_modules && pnpm install - Clear Turbo cache:
pnpm turbo clean