Building Your AppProject Structure

Project Structure

A tour of the folders and files inside a SiteKnock project, before and after you add your first app.

A fresh project

When you scaffold a project, it starts lean — no apps/ directory yet, just the configuration and tooling:

my-saas/
├── config/
│   └── sk-config.jsonc      # Project manifest (apps, features, branding, SEO)
├── scripts/                  # CLI dispatchers (run-app, run-generator, etc.)
├── docker-compose.yml        # Dev services (Postgres, Mailpit, MinIO, Redis)
├── turbo.json                # Turborepo config
├── pnpm-workspace.yaml       # Workspace + catalogs
├── package.json              # sk-version + @siteknock/* dependencies
└── README.md

After adding an app

Running pnpm app create my-app --type fe+be expands the project with everything that app needs:

my-saas/
├── apps/
│   ├── frontend/             # Next.js App Router (port 3000)
│   └── backend/              # Express API (port 5000)
├── config/
│   ├── sk-config.jsonc       # Now lists my-app
│   └── my-app/
│       ├── config.jsonc      # Per-app config overrides
│       ├── branding.jsonc    # Per-app branding
│       └── layout.jsonc      # Per-app layout
├── locales/
│   └── my-app/en/            # Translations
├── pages/
│   └── my-app/               # Page content
└── emails/
    └── my-app/               # Email templates

Key locations

PathWhat lives here
config/sk-config.jsoncThe single source of truth — apps, features, branding, SEO
config/<app>/Per-app config, branding, and layout overrides
apps/frontend/Your Next.js app (App Router, locale-prefixed routes)
apps/backend/Your Express API (/api/* routes)
apps/backend/prisma/partials/Your .prisma.part schema partials
locales/<app>/<locale>/Translation JSON files
pages/<app>/Page content designed in the Page Workspace
emails/<app>/Email templates designed in the Email Workspace

Generated vs. yours

Files written by the generator (routing, branding wiring, the merged schema.prisma, env templates, feature flags) are regenerated whenever config changes. Your business logic — backend route handlers, custom components, and .prisma.part models — is yours to own.

All @siteknock/* packages are pre-built modules you import directly. You don't build them — you compose them.

Next steps