{"id":38171409,"url":"https://github.com/connorjs/tasks.how","last_synced_at":"2026-01-16T23:27:13.601Z","repository":{"id":319163199,"uuid":"1073329106","full_name":"connorjs/tasks.how","owner":"connorjs","description":"A “distributed” Task Management system for my own experimentation.","archived":false,"fork":false,"pushed_at":"2025-12-19T23:45:41.000Z","size":27,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-22T10:34:17.147Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":false,"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/connorjs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2025-10-10T00:33:44.000Z","updated_at":"2025-12-19T23:45:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"e50addc6-9697-4134-8f93-f1385f5d2d73","html_url":"https://github.com/connorjs/tasks.how","commit_stats":null,"previous_names":["connorjs/tasks.how"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/connorjs/tasks.how","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connorjs%2Ftasks.how","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connorjs%2Ftasks.how/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connorjs%2Ftasks.how/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connorjs%2Ftasks.how/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/connorjs","download_url":"https://codeload.github.com/connorjs/tasks.how/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connorjs%2Ftasks.how/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28487586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T22:54:02.790Z","status":"ssl_error","status_checked_at":"2026-01-16T22:50:10.344Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":"2026-01-16T23:27:13.087Z","updated_at":"2026-01-16T23:27:13.588Z","avatar_url":"https://github.com/connorjs.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tasks.how\n\nA “distributed” Task Management system for my own experimentation.\n\n_Note: This monorepo approach results from desire for simplicity for experimentation,\nrather than “a monorepo is the right decision for this.”_\n\n## Directory structure\n\nThe repository’s follows an “Organize by feature, not by layer” strategy\nthat emphasizes vertical slicing where it makes sense.\nIt intentionally does not use a team-based directory structure,\nwhich can simplify ownership change.\n\nAt the root, we have the following directories.\n\n- `common` - Shared packages used across teams.\n- `domains` - System-of-record services and core backend logic.\n- `experiences` - End-user experiences or product areas that pair a BFF with its corresponding UI.\n- `teams` - ADRs and team-specific documentation (no code).\n- `tools` - Developer tools and scripts.\n\n### Common directory\n\nContains all cross-cutting code that are **not owned by a single domain or experience**.\nConsider everything here as *infrastructure-level* or *shared dependency* code:\nreusable, versioned, and stable.\n\nCommon code follows these design principles.\n\n- Shared code MUST NOT import from domains or experiences.\n- Changes here ripple across the entire system: prefer explicit versioning.\n- Avoid “miscellaneous utils” - if something is only used in one place, keep it local.\n- Treat `/common` as the **foundation layer** for all other directories.\n\n### Domains directory\n\nSystem-of-record services and core backend logic.\n\nEach domain represents a **bounded context** in the system and owns the following.\n\n1. Core business models and invariants.\n2. APIs for authoritative access (OpenAPI contracts).\n3. Background workers, projections, or event processors.\n4. Domain-level events and schema definitions.\n\nDomains expose stable interfaces through contracts.\nOther services or experiences consume them via generated clients.\n\n### Experiences directory\n\nVertical “feature slices” that pair a BFF (Backend for Frontend) with its corresponding UI.\n\nEach subdirectory represents an end-user experience or product area.\nThese directories combine all the code that changes together for a given feature.\n\nThe following shows the typical project pattern.\n\n- `*.bff` - .NET Minimal API shaping data for the UI.\n- `*.ui` - React (Vite + TypeScript) front-end application.\n- Shared view models and API clients are defined locally or imported from generated packages.\n\nThis structure keeps feature and UI layers co-located,\npromoting vertical ownership and faster iteration.\n\n### Teams directory\n\nDocumentation of ownership, architectural decisions, and context for each team.\n\nEach team has its own directory that may contain the following.\n\n- `README.md` - Describes mission, boundaries, and responsibilities.\n- `adrs/` - Lightweight architecture decision records.\n- `references/` - Links to design docs, dashboards, or specs.\n\nThis folder is **documentation-only**; it does not contain any executable code.\n\n### Tools directory\n\nUtility scripts and developer tools that support automation, validation, and code generation.\n\nMotivational examples follow.\n(_These do not exist yet, and they may never exist._)\n\n- `generate-clients.ps1` - Generates API and event clients for C# and TypeScript.\n- `validate-contracts.ps1` - Ensures OpenAPI and event schemas are well-formed.\n- `sync-version.ps1` - Keeps package and assembly versions aligned across projects.\n\nThis directory contains **no application logic**.\nIt only contains supporting utilities used during development or CI.\n\n## Team structure\n\nThis repository envisions a 6-team organization building a Task Management system.\nEach team has its own root directory for ADRs and other documentation.\n\n- 🐢 Bowser Works: **Admin \u0026 Web Shell**\n- 🐕 Cerberus: **Builder Tools \u0026 Platform**\n- 🦆 The Ducks: **Core Tasks \u0026 Projects**\n- 🪿 Goose Squadron: **Tasks \u0026 Board Experience**\n- 🐆 Lynx: **Search**\n- 🐦 The Magpies: **Collaboration \u0026 Notifications**\n\n### 🐢 Bowser Works\n\n\u003e Browser Just Works™.\n\nOwns the web shell, global navigation, onboarding, admin dashboard, and workspace management.\nHosts and stitches micro-frontends from other teams.\n\n(Full-stack + Cross-cutting UX)\n\n### 🐕 Cerberus\n\n\u003e Guard the gates. Power the forge.\n\nProvides shared DevEx tooling, API Platform kit, CI/CD scaffolds, Aspire orchestration,\nobservability defaults, and the Automation API for RPA/AI/MCP integrations.\n\nCross-cutting principles (telemetry, security, style guide) are governed jointly\nwith a shared **Architecture Working Group**.\n\n(Platform / Enablement)\n\n### 🦆 The Ducks\n\n\u003e Keep it in a row.\n\u003e\n\u003e _We keep your ducks in a row._\n\nOwns the core domain models (Tasks, Projects, Board structure, workflows).\nDefines the system of record (authoritative persistence and domain events).\nEnsures data integrity, migrations, and partitioning strategy.\n\n(Backend-only)\n\n### 🪿 Goose Squadron\n\n\u003e Flight-ready flow.\n\u003e\n\u003e _Formation within chaos. Clarity amid noise._\n\nDelivers the interactive task board (Kanban/Scrum/List/Calendar/Timeline) and related UX.\nShapes board-optimized view models in its own BFF.\n\n(Front-end focused, plus BFF)\n\n### 🪶 The Magpies\n\n\u003e Smart chatter. Sharp signal.\n\u003e\n\u003e _We make the noise worth hearing._\n\nManages comments, mentions, activity feeds, notifications, and realtime updates.\nProvides BFF and UI for collaboration features.\n\n(Full-stack)\n\n### 🐆 Lynx\n\n\u003e See everything. Find anything.\n\u003e\n\u003e _Fast. Focused. Found._\n\nBuilds and maintains the OpenSearch indexing pipeline, global and scoped queries, and search UI.\nResponsible for relevance, facets, and query performance.\n\n(Full-stack)\n\n### Team notes\n\n- The Magpies, Lynx, Goose Squadron, and Bowser Works each own a distinct **UI + BFF** pairing,\n  which enables independent deploys and type-safe contracts.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconnorjs%2Ftasks.how","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconnorjs%2Ftasks.how","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconnorjs%2Ftasks.how/lists"}