AI-Powered Team Orchestration Platform - Streamline product development and team collaboration with AI
Project description
InnoDay Platform
InnoDay is the central hub of your project. Every significant event โ ticket work, releases, spec changes, board syncs, repo additions, meeting decisions โ is recorded here. Skills, agents, and CLI tools all write back to InnoDay so that the full history of a project is always queryable in one place.
AI-powered development platform for managing tickets, boards, repositories, and releases with Claude AI integration.
๐ Quick Start
Most people just need the CLI, pointed at the shared dev environment โ not a repo clone or a self-hosted platform.
# Install the CLI from PyPI
uv tool install innoday
# Register against the shared dev environment (Railway-hosted)
innoday init --default
# Defaults to https://innoday-dev.up.railway.app -- no --api-url needed for
# dev. Prompts for the team access secret interactively. --default persists
# this as the profile used automatically (including for MCP).
# Verify end-to-end
innoday orgs list
# Should list your accessible organizations with exit code 0.
Only clone this repo and run a platform yourself if you're standing up your own instance (self-hosting, or local development on InnoDay itself) โ see Running Your Own Platform below.
๐ค Claude Code MCP Integration
Add InnoDay directly to Claude Code โ create tickets, sync boards, and query work items without leaving your editor. Reuses the CLI config from Quick Start above once innoday init has been run.
claude mcp add innoday -- uvx --from innoday mcp-server-innoday
Or find it in the MCP registry: io.github.havilandsoftware/mcp-server-innoday
See CLAUDE.md for the full MCP tool reference โ this README doesn't maintain a second hand-written tool list to avoid the two drifting out of sync.
Environment variables (optional):
| Variable | Default | Description |
|---|---|---|
INNODAY_API_URL |
https://innoday-dev.up.railway.app |
URL of your InnoDay instance โ matches innoday init's own default (the shared dev environment); override to point at a local instance instead |
INNODAY_TEAM_SECRET |
(from ~/.innoday/config.json) |
Overrides the X-Team-Secret header sent on every request; only needed against a TEAM_ACCESS_SECRET-gated deployment (see CLAUDE.md's "Optional (deployed environments)") |
Org/project context for MCP tool calls is not set via an env var โ like the
CLI, the MCP server resolves it from .innoday/project.yml in the directory
Claude Code was launched from (see Config & Project Setup
below), falling back to your last-used org from ~/.innoday/config.json. Pass
organization_id/project_id explicitly to a tool call to override either
for that one call.
Troubleshooting: MCP tools failing with a stale error after a fix ships
If mcp__innoday__* tool calls keep failing the same way even after a fix
merges and publishes to PyPI, the installed CLI/MCP binary itself is stale โ
claude mcp add/reconnect does not re-fetch code, it just reconnects to
whatever uvx --from innoday mcp-server-innoday currently resolves to.
uvx and uv tool upgrade both resolve "latest" by version-number
comparison, which can pin to an old release if that release's number is
numerically higher than the current line (see "Reset history" in
docs/VERSION_MANAGEMENT.md) or if it's simply cached from a prior uv tool install.
Fix, in order:
uv tool list | grep innoday # compare against the version that just published
uv tool upgrade innoday --reinstall # --reinstall bypasses uv's own version comparison,
# which is necessary if the prior install predates
# a version-numbering reset
Then reconnect the MCP session (/mcp reconnect in Claude Code, or restart
the session) โ the running MCP server process is spawned once and never
re-reads the binary on its own.
๐๏ธ Config & Project Setup
Two different files are involved, at two different scopes โ worth keeping straight:
| File | Scope | What it holds |
|---|---|---|
~/.innoday/config.json |
Your machine, all projects | Identity: current profile, API URL, your user id, last-used org, which integrations are configured. Written by innoday init/config init. Integration secrets are never stored here โ this file only holds a pointer to where the real value lives (your system keyring for GitHub tokens and legacy board credentials; Supabase Vault, server-side, for newer Jira/Trello/Linear board credentials). |
<workspace>/.innoday/project.yml |
One specific project workspace | Which org + project this directory belongs to (org.slug, org.innoday_id, project.innoday_id), plus the repos that make it up. Created by onboarding a project (see pixelfuel-claude's register-project/onboard-project skills, or hand-authored for a non-Pixelfuel workspace). |
How org/project context actually gets resolved, both for the CLI and the MCP server, in precedence order:
- An explicit override for this one call โ
--organization <slug>for the CLI, ororganization_id/project_idarguments on an MCP tool call. .innoday/project.yml, found by walking up from the current directory. This is why runninginnoday(or launching Claude Code with the MCP server) from inside a project workspace resolves the right org/project automatically, with zero flags.- The last-used org persisted in
~/.innoday/config.json, as a fallback for commands run outside any project directory (e.g. a bareinnoday orgs listfrom your home directory).
There is no persistent "switch" command for either the CLI or MCP โ a
directory's own .innoday/project.yml always wins over whatever org you used
last, so moving between project workspaces resolves correctly without
remembering to switch anything.
The object model, from the top down:
- Organization โ the tenant/security boundary. Everything below is isolated by org. Most day-to-day work never touches this directly.
- Project โ the unit you actually work inside. Has a slug (used to match
GitHub repos by topic label), a scope document, and exactly one board.
.innoday/project.ymlpins a workspace to one project. - Board โ one Jira/Trello/Notion/Linear board, synced into a project. A board always belongs to exactly one project (enforced at the database level) โ this is where tickets originate from.
- Ticket โ a work item, always belonging to a project (via its board).
Created either by a board sync or directly via
innoday tickets create(InnoDay-only until a board sync or explicit push reconciles it externally). - Repository โ tracked against a project by GitHub topic label
(
innoday git sync), not manually linked one at a time. - Release โ a version record tied to a project, created by
blastofforinnoday releases create.
๐ CLI Reference
Every command below is verified against the current CLI (src/cli/commands/) โ none of these are aspirational. Run innoday <command> --help for the full flag list on anything.
# Identity & setup
innoday init --default # First-time setup, registers against dev by default
innoday config init # Re-run the interactive setup wizard
innoday config show # View current config
innoday config set api-url <url> # Point the CLI at a different InnoDay instance
innoday config integrations # Configure Jira/Trello/Notion credentials
innoday orgs list # List organizations you can access
innoday orgs current # Show the org resolved for this invocation
innoday orgs show [slug] [--stats]
innoday orgs env-setup [slug] # Wizard for env/orgs/<slug> board credentials
innoday version # CLI version
# Org/project context is resolved from cwd, not a persistent "switch" command --
# run bare `innoday` commands from inside a directory with .innoday/project.yml
# and org/project resolve automatically. Use --organization <slug> only to
# override when running outside any project directory.
# Projects (the unit you work inside day to day)
innoday projects create "Customer Portal" --description "Q1 features"
innoday projects list
innoday projects show --project-id <id> [--overview]
innoday projects update --project-id <id> --status ACTIVE
innoday projects delete --project-id <id>
# Tickets
innoday tickets list
innoday tickets create "New feature"
innoday tickets show --ticket-id <id>
innoday tickets update --ticket-id <id> --status IN_PROGRESS
innoday tickets assign --ticket-id <id> <user-id>
innoday tickets close --ticket-id <id>
innoday tickets comment --ticket-id <id> "note"
innoday tickets comments --ticket-id <id>
# Boards (Jira / Trello / Notion / Linear)
innoday board register --type jira "<board-url>" "Board Name" --project-id <id>
innoday board sync --board-id <id>
# Scope documents
innoday scope show <project-id>
innoday scope generate <project-id>
# Sync โ the project-scoped cascade (board tickets, repo discovery, release status)
innoday sync # Cascade sync using cwd's project context
innoday sync ticket <PROJ-123> # Fetch/upsert one ticket immediately by external key
# Repository discovery (topic-based, project-scoped)
innoday git sync [--org <slug>] [--project-id <id>] [--label <topic>]
# Board credential storage (Trello/Jira tokens specifically -- not general auth)
innoday auth login [--service trello|jira]
innoday auth status
innoday auth list
Service management (innoday status, no prefix, is a real identity/connectivity check โ distinct from platform status below):
innoday status # Check CLI identity + API connectivity
innoday platform init # Interactive platform setup wizard
innoday platform start --env <local|dev|test>
innoday platform stop
innoday platform restart
innoday platform logs
innoday platform status
The old bare innoday start/stop/restart/logs (no platform prefix) still work as deprecated shims for the commands above โ use the platform-prefixed form. Neither form has an agent service; only api, ui, and all exist.
๐ง Running Your Own Platform
Only needed if you're self-hosting InnoDay or developing on this repo itself โ most users want the Quick Start above instead.
git clone git@github.com:havilandsoftware/innoday.git
cd innoday
./install.sh
innoday platform init # Interactive setup wizard (new terminal)
Full walkthrough โ prerequisites, database setup, environment variables, verification, platform staff roles, known limitations โ lives in docs/PLATFORM_SETUP.md. That guide is the canonical copy; this README doesn't duplicate it.
Other ways to run it:
No installation โ run from the cloned repo directly
git clone https://github.com/havilandsoftware/innoday.git
cd innoday
./bin/innoday --version # Wrapper: cd's to repo root, runs via uv, no install step
cat > .env.local <<'EOF'
ENVIRONMENT=local
DATABASE_URL=postgresql://innoday:innoday_pass@localhost:54322/innoday
CLAUDE_API_KEY=your-claude-api-key
GITHUB_TOKEN=your-github-token
GITHUB_ORG=havilandsoftware
EOF
./bin/innoday platform start --env local
Docker Compose
git clone https://github.com/havilandsoftware/innoday.git
cd innoday
docker compose up -d
Service URLs (local): REST API http://localhost:8002 (docs) ยท Agent API http://localhost:9000 ยท Web UI http://localhost:7860
Uninstall:
./uninstall.sh
# Or manually:
rm -rf ~/.innoday
rm -f ~/.local/bin/innoday
# Then remove the PATH entry for ~/.local/bin from your shell config
โจ Features That Make InnoDay Special
๐ค AI-Powered Team Orchestration
- Smart Update Collection: Automatically gather and summarize team progress with AI assistance
- Intelligent Meeting Preparation: AI-driven SCRUM facilitation and meeting insights
- Optimal Workload Distribution: Machine learning-based task assignment and team balancing
- Context-Aware Information Routing: Connect people to the right information at the right time
- Claude AI Integration: Advanced conversation analysis with recency weighting and temporal patterns
๐๏ธ InnoDay as the Central Hub
InnoDay is not just a ticket tracker โ it is the authoritative record of everything that happens on a project. All platform tools are designed to write back to InnoDay so that history, decisions, and state are always queryable without having to reconstruct them from git logs or local files.
| Event | How it reaches InnoDay |
|---|---|
| Ticket created / status changed | CLI innoday tickets create/update, MCP create_ticket, update_ticket |
| Release cut | blastoff release registers the release record automatically |
| Board synced, ticket carries a new release/fix-version | BoardSyncService._ensure_release_exists auto-creates a PLANNED release row (version taken from the synced ticket's fix-version field, not hardcoded) โ triggered during board sync, not project onboarding |
| Repo tracked for a project | innoday git sync discovers repos by GitHub topic label and reconciles them against the project |
| Spec / goals updated | MCP update_project_scope; CLI equivalent is innoday scope show/innoday scope generate |
| Meeting or decision | MCP add_project_update |
| Board sync | MCP sync_board, sync_linear_board |
| Agent session output | MCP add_project_update โ any output worth keeping goes here, not only to local memory |
Rule of thumb: if you need to remember it across sessions or share it with the team, save it to InnoDay. Local .innoday/memory.json is a cache; InnoDay is the record of truth.
๐ Project-Based Organization
Project is the unit you actually work inside day to day โ the thing you cd
into, register boards for, and sync tickets against. Organization exists
underneath as the tenant/security boundary (see "Enterprise-Ready
Architecture" below), not something you interact with directly most of the
time.
- Unified Project Structure: Organize work with goals, scope, and clear boundaries
- Scope Document Management: Version-controlled requirements with iterative refinement workflow
- Project Update Tracking: Capture clarifications, feedback, and Q&A during scoping
- Repository Layer Classification: Categorize repos by architecture (UI, API, Data, AI, Legacy)
- Primary Repository Designation: Identify the main codebase for each project
- Board Association: Every board belongs to exactly one project โ enforced at the
database level (
BoardRegistration.project_idis a required FK) โ and the same rule applies to repositories. - Release Records: Every release is registered in InnoDay with version, status, summary, and changelog
- Project Overview Dashboard: Complete visibility across all project components
๐ Unified Multi-Platform Integration
- Central Hub: InnoDay receives events from all connected tools โ boards, repos, agents, and the CLI
- Single Source of Truth: Seamlessly manage Jira, Trello, Notion, Linear, and GitHub from one interface
- Real-Time Synchronization: Automatic bi-directional sync with intelligent duplicate detection
- Universal Ticket Model: Work with tickets from any platform using consistent APIs โ including the unified
GET /workendpoint - Linear Integration: Full GraphQL sync for Linear teams, issues, workflow states, priorities, and parent relationships
- Board Registration System: Secure, token-based integration without storing credentials
๐ข Enterprise-Ready Architecture
Organization is the tenant/security boundary โ the thing every Project, board, and ticket is isolated by underneath the surface, but not something you typically think about day to day once you're working inside a project.
- Organization-Based Multi-Tenancy: Complete data isolation with flexible membership roles
- Platform Organization Protection: Special administrative entity that cannot be modified or deleted
- Smart License Management: Usage-based tiers with real-time tracking and enforcement
- Role-Based Access Control: Granular permissions (MEMBER, ADMIN, OWNER, DEVELOPER, PLATFORM)
๐ฏ Developer Experience
- Comprehensive CLI: Rich command-line interface with secure credential storage and beautiful output
- Modern API Design: FastAPI with automatic documentation, type safety, and async support
- Three Service Architecture: Separate API, Agent, and UI services for flexible deployment
- Container Execution Support: Run AI workloads in isolated Docker environments
๐๏ธ API Architecture (v1)
- 144 RESTful Endpoints: Organized across 17 specialized routers
- Organization-Scoped Resources: All operations under
/api/v1/organizations/{org_id}/ - Consolidated Routers: Reduced from 20+ files to 17 well-organized modules
- Unified AI Operations: All Claude/AI functionality under
/api/v1/ai/ - Complete Workflows: Project management, board sync, repository tracking, and container execution
๐ก๏ธ Security & Compliance
- Token Pass-Through: Integration credentials never stored in database
- Secure Credential Management: System keyring integration for sensitive data
- Audit Trail: Complete history for synchronization, license changes, and executions
- API Protection: Platform organization endpoints restricted to authorized users
๐ Prerequisites
Only needed for Running Your Own Platform โ the Quick Start path above only needs uv.
- Python 3.11+ (Required for full functionality and type safety)
- uv package manager (Install Guide)
- Database: PostgreSQL (production) or SQLite (development)
- PostgreSQL requires
psycopg2-binary(automatically installed viauv sync)
- PostgreSQL requires
- Integration Accounts: Jira, Trello, GitHub, Claude AI, Slack (optional)
๐ Documentation
- Platform Setup Guide - Full self-hosting walkthrough: prerequisites, database, environment variables, verification
- API v1 Workflows - Complete API workflows and examples
- REST API Documentation - Comprehensive endpoint reference
- Agent API Documentation - AI agent interaction guide
- CLI Documentation - Command-line interface guide
- Integration Testing Guide - Complete testing setup and configuration
- Contributing Guide - Development setup and contribution guidelines
- Domain Model - Core business objects and relationships
- Version Management - Release and versioning process
- CI/CD Pipeline - Automated testing and deployment
- Changelog - Version history and changes
๐งช Development & Testing
Running Tests
# Full test suite
uv run python -m pytest tests/ -v
# Specific test categories
uv run python -m pytest tests/test_api* -v # API tests
uv run python -m pytest tests/test_cli* -v # CLI tests
uv run python -m pytest tests/test_agent* -v # Agent tests
# Coverage report
uv run python -m pytest tests/ --cov=src --cov-report=html
Code Quality
# Format code
uv run black src/ tests/
uv run isort src/ tests/
# Lint code
uv run flake8 src/ tests/
uv run bandit -r src/
# Type checking
uv run mypy src/
๐๏ธ Architecture
InnoDay follows a modular architecture with clear separation of concerns:
src/
โโโ api/ # REST API & external integrations
โโโ agent/ # AI agent with HuggingFace integration
โโโ cli/ # Command-line interface
โโโ domain/ # Core business models (User, Ticket, Organization, Project)
โโโ middleware/ # RBAC, authentication, validation
โโโ routers/ # FastAPI route handlers
โโโ services/ # Business logic layer (ProjectService, etc.)
โโโ tools/ # AI-powered automation utilities
โโโ ui/ # Gradio web interface
โโโ main.py # Service dispatcher
Key Technologies:
- FastAPI: Modern, fast web framework with automatic API docs
- SQLModel: Type-safe ORM with Pydantic integration
- HuggingFace: AI agent capabilities and model integration
- Gradio: Interactive web interface for AI interactions
- Rich: Beautiful terminal output and CLI experience
Platform Organization
InnoDay uses a special Platform Organization that serves as the system administrator:
- Singleton Entity: Only one platform organization exists per InnoDay instance
- Special Privileges: Members with PLATFORM role have cross-organization access
- Protected Entity: Cannot be modified or deleted through standard API endpoints
- System Configuration: Holds platform-wide settings and billing information
- First-time Setup: Automatically created during
innoday config init
The platform organization ensures proper system administration while maintaining security boundaries between client organizations. All system-level operations and platform management require PLATFORM role membership.
๐ Security & Licensing
Role-Based Access Control
- Admin Users: Full system access, user management, license control
- Member Users: Standard ticket and project access
- Developer Users: Repository and project management capabilities
- Organization Isolation: Multi-tenant data separation and security
Licensing Tiers
- Pro: 1 user, 1 project, 3 tickets/day, email support
- Max: 5 users, 5 projects, unlimited tickets, priority support
- Unlimited: No restrictions, priority support
Haviland Software Clients
- Free License: Included with Haviland Software services
- Full Access: Complete platform capabilities for employees
๐ข CI/CD & Deployment
The project includes comprehensive GitHub Actions workflows:
- CI Pipeline: Tests, builds, security scans, Docker
- Version Bump & Release: Auto-bumps version on merge to main, publishes to PyPI and MCP registry, creates GitHub release
- Dependency Updates: Weekly security and package updates
Release Process (fully automated):
Every merge to main automatically:
- Bumps the minor version in
src/version.py - Builds and publishes the package to PyPI
- Updates
server.jsonversion and publishes to the MCP registry - Creates a GitHub release with changelog
Required GitHub secrets (set once):
PYPI_API_TOKENโ PyPI API token for theinnodaypackage
MCP registry publishing authenticates via mcp-publisher login github-oidc, using the workflow's own GitHub Actions OIDC identity (id-token: write permission) โ no stored secret needed.
๐ค Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
Development Standards:
- Python 3.11+ for type safety and performance
- Black code formatting and isort imports
- Comprehensive test coverage (pytest)
- Type hints with mypy validation
- Clear documentation and examples
๐ Support
- Documentation: API Docs | Agent API
- Issues: GitHub Issues
- Email: hello@havilandsoftware.com
- Enterprise: Contact for custom deployments and integrations
๐ License
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.
Built with โค๏ธ by Haviland Software
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file innoday-0.1.42b0.tar.gz.
File metadata
- Download URL: innoday-0.1.42b0.tar.gz
- Upload date:
- Size: 510.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9a8de2071983fe77eb3400132385e57dde0fbc12d424c7a5efe7eee476a5507
|
|
| MD5 |
1b09c6f566aede5840379bc226145c0b
|
|
| BLAKE2b-256 |
287fcc38606bf4fe41da89dc7bb33a87db69bbf02c94b295f7d29c088d85e831
|
File details
Details for the file innoday-0.1.42b0-py3-none-any.whl.
File metadata
- Download URL: innoday-0.1.42b0-py3-none-any.whl
- Upload date:
- Size: 491.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04e783bfffab6e44c29d884e5855189034da908b1797af848514bcf27bf16dc2
|
|
| MD5 |
31f91a3e84d017c42f5813eaf0062b2f
|
|
| BLAKE2b-256 |
605ac63f9d1dce660cdf7130065677d9b2b0c45754fef92e31a6bf5dadbd7133
|