You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Plugin frontend: plugins/<name>/app/ with (group)/ route groups
Route metadata: route.meta.json next to page.tsx. access is authenticated
(default) / public / guest. Directory names grant nothing
Plugin API namespace: /api/<name>, overridable with api_base. Handler file
location does not affect the URL; src/routes/mod.rs sits at the namespace root
URLs use hyphens: underscores in path segments are converted to -
State: Extension layer for SharedMenus, SharedPlugins
Events: EventBus extension; action work and emit use the same EventTransaction
Audit: event payloads are admin-visible only when their type opts in with AUDIT = true
Logs go to stderr: stdout is reserved for the YEOLLIN_EXPORT envelope
Authorization is opt-in per handler: the middleware authenticates, it does not
authorize. Guard admin/destructive routes with current.require_role("admin")?
(Authorize on CurrentUser). Refusals are always a bare 403; matching is exact
Plugin registration: yeollin plugin add <name> from the app dir. Never hand-edit
the two sites; yeollin plugin doctor verifies them. members is globbed
ANTI-PATTERNS
NOtypography="title" or typography="caption" (use subheading/label)
NO fetch() in SSG pages (use file reads for build-time data)
NO direct edits to .yeollin/ (regenerated at prebuild)
NO symlinks in dev mode (use proxy or copy mode)
NO deriving access from (public) / (guest) directory names — declare it in route.meta.json
NO backend routes outside /api, and NOapi inside api_base
NO prefix matching for public/guest routes — matching is whole-path exact
NO work before the export branch in YeollinApp::run (no DB, no secrets)
COMMANDS
# Plugins (from app dir)
yeollin init my-plugin # scaffold plugins/my-plugin
yeollin plugin add my-plugin # register with the app (Cargo.toml + yeollin_app!)
yeollin plugin doctor # verify both sites agree, non-zero on drift# Development (from app dir)cd apps/example-app
cargo run -p yeollin-cli -- dev # Single port dev server# Build
cargo run -p yeollin-cli -- build # Full production build# Check
cargo check --workspace # Rust
bun tsc --noEmit # TypeScript (in packages/app)
ENV VARS
Var
Purpose
PORT
API server port (default: 3001)
JWT_SECRET
Required to serve. Min 32 bytes; startup fails otherwise. yeollin dev injects an ephemeral one
YEOLLIN_DEV_PROXY
Enable dev proxy to vinext port. Also gates the dev-asset auth exemption
YEOLLIN_EXPORT
Print one ExportEnvelope JSON on stdout and exit (used by prebuild)
NOTES
packages/app/ is the TEMPLATE, not the running app
Actual frontend runs from .yeollin/app/ after prebuild