First off, thank you for considering contributing to Open Sunsama! It's people like you that make Open Sunsama such a great tool.
- Code of Conduct
- Getting Started
- Development Setup
- How to Contribute
- Pull Request Process
- Coding Standards
- Commit Messages
- Community
This project and everyone participating in it is governed by our Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to ceo@circo.so.
There are many ways to contribute:
- Bug Reports: Found a bug? Open an issue with detailed reproduction steps
- Feature Requests: Have an idea? Start a discussion in GitHub Discussions
- Code Contributions: Fix bugs, add features, improve performance
- Documentation: Improve README, add tutorials, fix typos
- Testing: Write tests, improve coverage, report edge cases
- Design: UI/UX improvements, accessibility enhancements
- Translations: Help translate the app to other languages
Looking for a place to start? Check out issues labeled:
good first issue- Great for newcomershelp wanted- Extra attention neededdocumentation- Docs improvements
- Bun v1.0+ (recommended) or Node.js 20+
- PostgreSQL 15+
- Git
# 1. Fork the repository on GitHub
# 2. Clone your fork
git clone https://github.com/YOUR_USERNAME/open-sunsama.git
cd open-sunsama
# 3. Add upstream remote
git remote add upstream https://github.com/ShadowWalker2014/open-sunsama.git
# 4. Install dependencies
bun install
# 5. Set up environment
cp .env.example .env
# Edit .env with your database URL
# 6. Set up the database
bun run db:push
# 7. Start development servers
bun run devopen-sunsama/
├── apps/
│ ├── api/ # Hono REST API
│ ├── web/ # React + Vite SPA
│ ├── desktop/ # Tauri desktop app
│ └── mobile/ # Expo mobile app
├── packages/
│ ├── database/ # Drizzle ORM + schema
│ ├── types/ # Shared TypeScript types
│ ├── api-client/ # HTTP client + React Query
│ └── utils/ # Shared utilities
└── mcp/ # MCP server for AI
# Development
bun run dev # Start all dev servers
bun run dev:web # Web + API only
bun run dev:desktop # Desktop + API
# Quality
bun run typecheck # TypeScript checking
bun run lint # ESLint
bun run lint:fix # Fix lint errors
bun run format # Prettier formatting
bun run test # Run tests
# Database
bun run db:generate # Generate migrations
bun run db:push # Push schema changes
bun run db:studio # Open Drizzle Studio
# Build
bun run build # Build all packagesBefore creating a bug report, please check existing issues. When creating a bug report, include:
- Summary: A clear, concise description
- Steps to Reproduce: Detailed steps to reproduce the issue
- Expected Behavior: What you expected to happen
- Actual Behavior: What actually happened
- Environment: OS, browser, Node version, etc.
- Screenshots/Logs: If applicable
Use the bug report template.
Feature requests are welcome! Please:
- Check if the feature already exists or is planned
- Open a discussion in GitHub Discussions
- Describe the problem you're trying to solve
- Explain your proposed solution
- Consider alternatives you've thought about
- Find or create an issue describing what you want to work on
- Comment on the issue to let others know you're working on it
- Fork and create a branch from
main - Make your changes following our coding standards
- Write/update tests as needed
- Update documentation if required
- Submit a pull request
- Code compiles without errors (
bun run build) - All tests pass (
bun run test) - No lint errors (
bun run lint) - TypeScript is happy (
bun run typecheck) - Code is formatted (
bun run format) - Documentation is updated (if applicable)
- Commit messages follow our convention
- Keep PRs focused: One feature or fix per PR
- Write a good description: Explain what and why
- Link related issues: Use "Fixes #123" or "Closes #456"
- Add screenshots: For UI changes
- Request review: Tag relevant maintainers
- A maintainer will review your PR
- They may request changes or ask questions
- Make requested changes in new commits
- Once approved, a maintainer will merge your PR
- Your contribution will be in the next release!
- Use TypeScript for all new code
- Avoid
anytype - useunknownand type guards - Export types from
packages/types - Use Zod for runtime validation
// Good
function processTask(task: Task): ProcessedTask {
return { ...task, processed: true };
}
// Avoid
function processTask(task: any): any {
return { ...task, processed: true };
}- Use functional components with hooks
- Colocate related code (component + styles + tests)
- Use TanStack Query for server state
- Use Radix UI for accessible components
// Good
export function TaskCard({ task }: { task: Task }) {
const { mutate: completeTask } = useCompleteTask();
return (
<Card>
<CardTitle>{task.title}</CardTitle>
<Button onClick={() => completeTask(task.id)}>Complete</Button>
</Card>
);
}- Use Hono route handlers
- Validate input with Zod
- Return consistent response shapes
- Handle errors gracefully
// Good
app.post("/tasks", zValidator("json", createTaskSchema), async (c) => {
const data = c.req.valid("json");
const task = await createTask(data);
return c.json({ success: true, data: task });
});- Write tests for new features
- Test edge cases and error handling
- Use descriptive test names
describe("TaskService", () => {
it("should create a task with default priority P2", async () => {
const task = await createTask({ title: "Test" });
expect(task.priority).toBe("P2");
});
it("should throw if title is empty", async () => {
await expect(createTask({ title: "" })).rejects.toThrow();
});
});We use Conventional Commits:
<type>(<scope>): <description>
[optional body]
[optional footer]
feat: New featurefix: Bug fixdocs: Documentation onlystyle: Formatting, no code changerefactor: Code change that neither fixes a bug nor adds a featureperf: Performance improvementtest: Adding testschore: Maintenance tasks
feat(tasks): add subtask support
fix(api): handle null scheduledDate in task creation
docs(readme): update installation instructions
refactor(web): extract TaskCard into separate componentUse the package or app name:
api,web,desktop,mobiledatabase,types,api-client,utilsmcpci,deps,config
- GitHub Discussions: Questions, ideas, show & tell
- GitHub Issues: Bug reports, feature requests
Contributors are recognized in:
- The README contributors section
- Release notes for their contributions
- Our website's contributors page
Don't hesitate to ask! Open a discussion or reach out to maintainers.
Thank you for contributing to Open Sunsama!