| name | nextnode |
| description | NextNode ecosystem hub. Auto-load when working on any NextNode or SaaS project — covers nextnode.toml config, CI workflows, docker-compose rules, and cross-references to package skills. |
| user-invocable | false |
| autoload-dirs | ["/Users/walid/Development/nextnode","/Users/walid/Development/saas"] |
NextNode Ecosystem Hub
This skill auto-loads on all NextNode/SaaS projects. It defines what a compliant repo looks like and references specialized skills for details.
Related Skills
| Skill | Purpose | Auto-loads? |
|---|
standards | @nextnode-solutions/standards — linting, formatting, TypeScript, Tailwind, testing, commit conventions | Yes (same dirs) |
logger | @nextnode-solutions/logger — logging library API and patterns | Yes (same dirs; use when logger integration is relevant) |
email-manager | @nextnode-solutions/email-manager — email sending library API | Yes (same dirs, conditional) |
nn | @nextnode-solutions/nn — local dev DX CLI (nn up, nn env, nn down) | Yes (same dirs) |
nextnode-infra | Infrastructure operations — infra CLI commands, Terraform, VPS, deployment, DNS | Yes (same dirs) |
nextnode-standards | Compliance audit — checks all standards and produces a report | Yes (same dirs) |
nextnode-brand | Brand guidelines — colors, typography, logo system | Yes (same dirs; applied during UI/frontend work) |
n8n-cli | n8n workflow operations against the shared automation instance | Yes (same dirs) |
structure-astro | Astro project src/ structure — domain-driven components, shared/page separation, lib layer, islands | Yes (same dirs + clients) |
docker | Docker standards — multi-stage builds, pnpm optimization, security hardening, nextnode.toml integration | Yes (when editing Docker files) |
Keeping skills up to date: Run /learn on any @nextnode-solutions/* package to update its skill. /learn cascades to dependent skills automatically.
nextnode.toml — The Single Config File
Every NextNode/SaaS repo has a nextnode.toml at its root. This file drives ALL pipeline behavior — no other CI config is needed beyond the reusable workflow caller.
Canonical Template
[project]
name = "my-app"
type = "app"
description = "Description"
domain = "app.nextnode.fr"
redirect_domains = ["www.app.fr"]
[scripts]
lint = "lint"
test = "test"
build = "build"
[server]
name = "my-vps"
project = "my-hetzner-project"
type = "cpx22"
location = "nbg1"
internal = false
[volume]
enabled = false
size = 20
[deploy]
port = 4321
file = "docker-compose.yml"
zero_downtime = false
[health]
type = "http"
path = "/health"
interval = "30s"
timeout = "10s"
retries = 3
[sablier]
enabled = true
session_duration = "15m"
display_name = "My App"
[services.supabase]
studio_port = 54323
migrations = "supabase/migrations"
features = ["storage", "realtime"]
[services.supabase.oauth]
providers = ["github", "google"]
[services.supabase.oauth.github]
scopes = ["user:email"]
[services.supabase.versions]
postgres = "15.8.1.085"
[services.r2]
bucket = "my-bucket"
public = false
domain_cdn = true
domain_cdn_prefix = "cdn"
cdn = ["cdn.example.com"]
[services.redis]
port = 6379
[[routes]]
subdomain = "admin"
service = "strapi"
port = 1337
health_path = "/_health"
[environment.development]
enabled = true
pr_previews = true
cpu_limit = "0.25"
memory_limit = "256M"
[environment.production]
enabled = true
cpu_limit = "1.0"
memory_limit = "1G"
cpu_reservation = "0.25"
memory_reservation = "256M"
Server Tier Resolution
| Config Present | Dev VPS | Prod VPS |
|---|
No [server] | Shared dev VPS (shared-dev) | Shared prod VPS (shared-prod) |
[server] (no name) | Dedicated VPS ({project-name}) | Same dedicated VPS |
[server] + name | Named shared VPS (nextnode-{name}) — multi-tenant | Same named VPS |
Per-Repo CI Files
CRITICAL: The caller workflow MUST declare permissions for the reusable workflow to function.
1. .github/workflows/deploy-dev.yml — Dev deploy pipeline
name: Deploy Dev
on:
push:
branches: [main]
workflow_dispatch:
permissions:
checks: read
contents: read
packages: write
concurrency:
group: deploy-dev-${{ github.ref }}
cancel-in-progress: true
jobs:
pipeline:
uses: NextNodeSolutions/infrastructure/.github/workflows/pipeline.yml@main
with:
environment: dev
secrets: inherit
2. .github/workflows/deploy-prod.yml — Manual production deploy
name: Deploy to Production
on:
workflow_dispatch:
permissions:
checks: read
contents: read
packages: write
jobs:
deploy:
uses: NextNodeSolutions/infrastructure/.github/workflows/pipeline.yml@main
with:
action: deploy-prod
environment: prod
secrets: inherit
3. .github/workflows/pr-preview.yml — PR preview deploy + cleanup
name: PR Preview
on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened, closed]
permissions:
checks: read
contents: read
deployments: write
packages: write
pull-requests: write
concurrency:
group: pr-preview-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
preview:
if: github.event.action != 'closed'
uses: NextNodeSolutions/infrastructure/.github/workflows/pipeline.yml@main
with:
action: pr-preview
environment: dev
pr_number: ${{ github.event.pull_request.number }}
secrets: inherit
cleanup:
if: github.event.action == 'closed'
uses: NextNodeSolutions/infrastructure/.github/workflows/pipeline.yml@main
with:
action: pr-cleanup
environment: dev
pr_number: ${{ github.event.pull_request.number }}
secrets: inherit
How Workflows Map to Pipeline Actions
| Workflow | action | environment | Trigger |
|---|
deploy-dev.yml | ci (default) | dev (default) | push to main / manual |
deploy-prod.yml | deploy-prod | prod | manual only |
pr-preview.yml | pr-preview | dev | PR opened/synced |
pr-preview.yml | pr-cleanup | dev | PR closed |
docker-compose.yml Standard (Apps Only)
Caddy runs natively on the VPS — apps do NOT need a proxy-public external network.
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "${HOST_PORT_APP}:${APP_PORT_APP}"
restart: unless-stopped
environment:
- NODE_ENV=${NODE_ENV}
Rules:
- No
proxy-public network — Caddy is native, reaches app via host port mapping
- No
env_file — use environment block. CLI injects all env vars into .env at deploy time
- No
container_name — let Docker Compose auto-name
- No inline
healthcheck — put health checks in Dockerfile (HEALTHCHECK instruction)
restart: unless-stopped — standard restart policy
- Port mapping —
${HOST_PORT_APP}:${APP_PORT_APP} where HOST_PORT_APP is CLI-assigned (10000-29999) and APP_PORT_APP is from nextnode.toml [deploy].port. Every buildable service uses ${HOST_PORT_<SERVICE>}:${APP_PORT_<SERVICE>} (SERVICE = uppercased name, hyphens → underscores)
Commit Convention
Uses Conventional Commits — semantic-release reads these to determine version bumps:
feat: — minor version bump
fix: — patch version bump
feat!: or BREAKING CHANGE: — major version bump
Formatting Rules for Code Generation
When generating or editing code in any NextNode project, follow the formatting rules defined in the standards skill (section "Formatting Rules for Code Generation"). Key points:
- Indentation: tabs (width 4)
- Semicolons: none
- Quotes: single quotes (double in JSX)
- Trailing commas: always (except JSON)
- Arrow parens: avoid
- Import order: side-effect > builtin > external > internal > parent > sibling > index
- Type imports: always use
import type (separate, top-level)
See the standards skill for the complete list.