Skip to content

docs(development): explain why packages live in apps vs extra#594

Merged
Andrei Kvapil (kvaps) merged 5 commits into
mainfrom
docs/apps-extra-categorization
Jul 13, 2026
Merged

docs(development): explain why packages live in apps vs extra#594
Andrei Kvapil (kvaps) merged 5 commits into
mainfrom
docs/apps-extra-categorization

Conversation

@kvaps

@kvaps Andrei Kvapil (kvaps) commented Jun 30, 2026

Copy link
Copy Markdown
Member

What

Expands the Packages section of the v1.5 Developer Guide to explain why some applications live in packages/apps and others in packages/extra, grounding the split in Cozystack's managed-services model.

Why

The previous text described the two categories only mechanically ("shown in the dashboard catalog" vs "not shown, installed as part of a tenant"), which doesn't tell a contributor where a new component belongs. This adds the underlying principle and a concrete decision guide.

Changes

  • Framing intro: Cozystack is a provider of managed services; each service is a first-class object the user orders directly, while the implementation stays hidden underneath (AWS/GCP model).
  • apps — rewritten as the first-class managed services a user orders directly (Postgres, Kubernetes, S3 bucket, …), with the high-level-API / input-control rationale.
  • extra — rewritten as enabler modules switched on per-tenant that power those services under the hood, with the worked example extra/seaweedfsapps/bucket (S3) and extra/etcdapps/kubernetes.
  • New "Choosing apps, extra, or a bundled dependency" decision guide, including single, private dependencies bundled inside a chart and never exposed to the user (e.g. the monitoring stack's own database).

Scope: only the latest v1 docs (v1.5); other versions and next are untouched.

Summary by CodeRabbit

  • Documentation
    • Expanded and clarified Cozystack “package categories,” reframing Cozystack as a managed-services provider with four categories: core, system, apps, and extra.
    • Rewrote apps guidance to highlight user-orderable services exposed in the dashboard catalog via a validated app layer.
    • Expanded extra guidance to define tenant-enabled enabler modules that aren’t orderable standalone services and are shared with child tenants.
    • Added a new decision section with practical guidance for choosing apps vs extra vs bundled dependencies.

Ground the apps/extra split in Cozystack's managed-services model: apps are
first-class services a user orders directly; extra are enabler modules switched
on per-tenant that power those services under the hood. Add concrete examples
(S3 bucket over SeaweedFS, Managed Kubernetes over etcd) and a decision guide
covering single, private dependencies bundled inside a chart.

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Andrei Kvapil <kvapss@gmail.com>
@netlify

netlify Bot commented Jun 30, 2026

Copy link
Copy Markdown

Deploy Preview for cozystack ready!

Name Link
🔨 Latest commit 85146e8
🔍 Latest deploy log https://app.netlify.com/projects/cozystack/deploys/6a54e0e49ae84e00087a1a08
😎 Deploy Preview https://deploy-preview-594--cozystack.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 07095589-939d-4567-8b90-71b28eb8c3d6

📥 Commits

Reviewing files that changed from the base of the PR and between 96801f1 and 85146e8.

📒 Files selected for processing (1)
  • content/en/docs/v1.5/development.md

📝 Walkthrough

Walkthrough

The v1.5 development documentation defines four Cozystack package categories, clarifies apps and extra behavior, and adds rules for choosing between standalone services, tenant enablers, and bundled dependencies.

Changes

Package type documentation expansion

Layer / File(s) Summary
Packages overview and apps/extra definitions
content/en/docs/v1.5/development.md
Defines core, system, apps, and extra; describes apps as catalog-visible services exposed through apps.cozystack.io; and documents tenant-level extra modules with examples.
New decision-criteria section
content/en/docs/v1.5/development.md
Adds criteria for placing capabilities in apps, extra, or bundled dependencies, including when separate app services should be referenced rather than bundled.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Suggested reviewers: lllamnyp

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main doc change: explaining why packages belong in apps versus extra.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/apps-extra-categorization

Warning

Tools execution failed with the following error:

Failed to run tools: 13 INTERNAL: Received RST_STREAM with code 2 (Internal server error)


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the development documentation to clarify the architecture of Cozystack packages, introducing detailed explanations of the four package categories (core, system, apps, and extra) and a decision guide for choosing between them. The review feedback suggests minor improvements to the text, including refining the AWS/GCP comparison to focus on managed offerings, correcting a grammatical agreement issue, and adding commas after 'e.g.' for consistency.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread content/en/docs/v1.5/development.md Outdated
Comment thread content/en/docs/v1.5/development.md Outdated
Comment thread content/en/docs/v1.5/development.md Outdated
Comment thread content/en/docs/v1.5/development.md
…rences vm-disk)

Clarify that dependencies also exist between first-class services: when a
dependency has its own lifecycle and value, it stays an apps service and other
apps reference it (vm-instance attaches an existing vm-disk by name) rather than
bundling or moving it to extra.

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Andrei Kvapil <kvapss@gmail.com>
@kvaps Andrei Kvapil (kvaps) marked this pull request as ready for review June 30, 2026 16:25
… commas)

Refine the AWS/GCP analogy to reference their managed offerings, fix
subject-verb agreement for extra modules, and add the comma after e.g. for
consistency with the rest of the document.

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Andrei Kvapil <kvapss@gmail.com>

@IvanHunters IvanHunters left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Accurate and well-written — I cross-checked every claim (package inventory, chart descriptions, the bucket->seaweedfs BucketClass wiring, etcd->kubernetes, the bundled alerta-db PostgreSQL, the former ferretdb bundling) against the monorepo and they hold.

One nit: extra/seaweedfs is quoted as "Managed SeaweedFS Service", but the actual Chart.yaml description is just Seaweedfs. Since the surrounding descriptions are verbatim chart strings, either use the real string or drop the quotes and phrase it as a gloss.

Optional: a one-line pointer on how apps/extra placement affects bundle/variant selection and PackageSource wiring would help a contributor go from "where does my package go" to "how do I make it ship".

@myasnikovdaniil myasnikovdaniil left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice improvement — the old text described apps vs extra purely mechanically ("shown in the catalog" vs "not shown"), which never told a contributor where a new package belongs. The managed-services framing and the "Choosing apps, extra, or a bundled dependency" decision guide are exactly what was missing, and the vm-disk/vm-instance "reference, don't bundle" example is a genuinely good one.

A few precision points on the examples, so the page doesn't go stale or over-promise on the neatness of the split (all inline). None of them are blockers — happy to /lgtm once the etcd note below is addressed one way or another.

Comment thread content/en/docs/v1.5/development.md Outdated
So a tenant administrator *enables the SeaweedFS module once*, and from then on users
can order S3 buckets as a first-class service. The user consumes a bucket; they never
see, order, or manage SeaweedFS itself — it is an implementation detail of "S3 bucket".
The same relationship holds for `extra/etcd` ("Storage for Kubernetes clusters"), which

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Heads-up: etcd is the flagship extra example here, but there's an active design proposal to remove exactly this arrangement — community#25 proposes retiring the etcd tenant module and folding etcd into the kubernetes app (one etcd per cluster, no tenant-level sharing). If #25 lands, this paragraph is the first thing that goes stale.

Suggestion: either add a short forward-note ("etcd's placement as a tenant module is under review — see community#25"), or lead the section with a more stable flagship example (seaweedfsbucket is already the cleaner illustration and isn't being reworked). Not blocking the PR, just avoiding a same-week staleness.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point — I dropped the etcd example entirely, so the section stays valid regardless of how community#25 lands. seaweedfs → bucket remains the flagship example.

Comment thread content/en/docs/v1.5/development.md Outdated
The same relationship holds for `extra/etcd` ("Storage for Kubernetes clusters"), which
provides the datastore for `apps/kubernetes` managed clusters. Other `extra` modules
supply tenant-wide infrastructure rather than orderable services: `extra/ingress`
(NGINX Ingress Controller), `extra/gateway` (per-tenant Gateway API backed by Cilium),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This example list is slightly off against the code:

  • extra/external-dns isn't a per-tenant toggle — it's not in the Tenant chart's schema (packages/apps/tenant/values.yaml only has etcd/monitoring/ingress/gateway/seaweedfs), and its release definition is category: Networking with no internal.cozystack.io/tenantmodule label. So it doesn't fit the "an enabler a tenant switches on" definition this section just gave — it behaves like a normal app that happens to live in extra/.
  • extra/gateway has no -rd/ApplicationDefinition at all, so it has no dashboard/catalog presence — it's toggle-only (and auto-enabled for derived-apex tenants). Fine to mention, but it's not shown anywhere the way ingress/monitoring are.

Suggestion: keep ingress + monitoring as the tenant-module examples (they cleanly match the definition) and either drop external-dns or call it out as the "lives in extra but is really just an app" case.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right on both counts. Dropped external-dns from the list — it matches neither category as written, so I filed cozystack/cozystack#3275 to settle its placement (proper enabler module if it's a per-tenant singleton, move to apps if multi-instance makes sense). Kept ingress + monitoring as the examples and marked gateway as toggle-only.

Comment thread content/en/docs/v1.5/development.md Outdated
`extra` packages are **enabler modules**, not first-class services. A user never orders
them as a final entity; instead they are switched on as **tenant options**, and once
enabled they provide capabilities that the `apps` services build on — working under the
hood. For that reason they are *not* shown in the application catalog and can only be

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: "not shown in the application catalog" is correct (the console excludes module/Administration definitions from the Marketplace — apps/console/src/routes/MarketplaceList.tsx), but they're not invisible — they appear under Administration → Modules (routes/ModulesPage.tsx) and are configured there per tenant. Consider "not shown in the application catalog (they appear under Administration → Modules instead)" so a reader doesn't expect them to be entirely absent from the dashboard. Optional nit.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, added the pointer.

- Drop the etcd example so the section stays valid regardless of the
  outcome of the per-cluster etcd proposal
- Drop external-dns from the extra examples: it behaves like a regular
  app and its placement is tracked in a separate issue
- Note that extra modules appear under Administration -> Modules
- Remove the non-verbatim seaweedfs chart description quote

Assisted-By: Claude
Signed-off-by: Andrei Kvapil <kvapss@gmail.com>

@myasnikovdaniil myasnikovdaniil left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — all three points from the earlier pass are addressed and verified against the code.

  • etcd example dropped — seaweedfs → bucket is now the flagship, so the section no longer rides on the community#25 outcome.
  • external-dns removed from the extra list (placement tracked in cozystack/cozystack#3275); ingress + monitoring kept as the tenant-module examples; gateway correctly marked toggle-only — no ApplicationDefinition, Cilium-backed, auto-enabled for derived-apex tenants (matches packages/apps/tenant/values.yaml).
  • Administration → Modules pointer added.

New claims check out too: app display names match each chart's description:, extra/seaweedfs BucketClassapps/bucket BucketClaim, monitoring's bundled Alerta Postgres, and the former ferretdb's bundled Postgres.

Two non-blocking notes:

  1. apps/vm-disk is quoted as "Virtual Machine Disk", but the chart description is "Virtual Machine disk" (lowercase d) — trivial.
  2. The Netlify preview is red, but the deploy-preview build (npm install && ./hack/download_openapi.sh && hugo --gc --minify --buildFuture) reproduces green locally on the pinned hugo 0.160.1 — the failure looks environmental, not content-related; a retrigger should clear it.

@kvaps Andrei Kvapil (kvaps) merged commit 439891a into main Jul 13, 2026
4 of 6 checks passed
@kvaps Andrei Kvapil (kvaps) deleted the docs/apps-extra-categorization branch July 13, 2026 12:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants