Pikku Project Setup Foundations
This skill provides foundational patterns for setting up Pikku projects. All runtime adapter skills reference this for common setup logic.
When to use this skillβ
- Setting up any Pikku runtime (Express, Fastify, Lambda, Cloudflare, etc.)
- Understanding project structure patterns
- Determining standalone vs workspace setup
- Configuring bootstrap imports correctly
- Setting up common package.json scripts
Note: This skill is referenced by runtime skills. Users typically invoke runtime skills directly (e.g., "add express runtime"), which then reference this skill's patterns.
Project Type Detectionβ
Pikku projects come in three flavors. Detect automatically by checking the project structure:
1. Standalone Projectβ
Characteristics:
- Functions and runtime in the same package
- No
packages/
directory - Single
package.json
at root - Functions typically in
src/functions/
Directory structure:
my-app/
βββ package.json
βββ pikku.config.json
βββ src/
β βββ functions/ # Pikku functions
β β βββ *.function.ts
β βββ services.ts # Services setup
β βββ config.ts # Config
β βββ start.ts # Runtime server/worker
βββ .pikku/ # Generated wiring
β βββ pikku-bootstrap.gen.js
βββ tsconfig.json
Detection:
- Check for
src/functions/
or similar - No workspace field in package.json
- No
packages/
directory
2. Workspace - No Backend Configβ
Characteristics:
- Monorepo with separate packages
- Functions in
packages/functions/
- Backend imports from functions package
- Backend does NOT have its own
pikku.config.json
- Uses functions package's filter configuration
Directory structure:
my-monorepo/
βββ package.json (workspace root)
βββ packages/
β βββ functions/
β βββ package.json
β βββ pikku.config.json # Filters defined here
β βββ src/
β β βββ functions/
β β βββ services.ts
β β βββ config.ts
β βββ .pikku/ # Generated (with filters)
β βββ pikku-bootstrap.gen.js
βββ backends/
β βββ express/
β βββ package.json # Depends on @my-app/functions
β βββ bin/
β β βββ start.ts # Imports from functions package
β βββ NO pikku.config.json # Key: no config here
βββ tsconfig.json
Detection:
- Check for
packages/
or workspace field in root package.json - Backend package has dependency on functions package
- Backend does NOT have
pikku.config.json
Key trait: Backend uses functions package filters (can't customize)
3. Workspace - With Backend Configβ
Characteristics:
- Monorepo with separate packages
- Functions in
packages/functions/
- Backend HAS its own
pikku.config.json
with custom filters - Backend generates its own
.pikku/
directory - Allows different function subsets per backend
Directory structure:
my-monorepo/
βββ package.json (workspace root)
βββ packages/
β βββ functions/
β βββ package.json
β βββ pikku.config.json # Base filters
β βββ src/functions/
β βββ .pikku/ # Generated (all functions)
βββ backends/
β βββ express/
β βββ package.json # Has @pikku/cli devDep
β βββ pikku.config.json # KEY: Extends functions config
β βββ bin/start.ts # Imports from backend .pikku
β βββ .pikku/ # Generated (custom filtered)
β βββ pikku-bootstrap.gen.js
βββ tsconfig.json
Detection:
- Check for
packages/
or workspace field in root package.json - Backend HAS
pikku.config.json
withextends
field - Backend has
@pikku/cli
in devDependencies
Key trait: Backend has custom filters, generates own wiring
Bootstrap Import Patternsβ
The bootstrap file contains all wiring registration. Import path depends on project type:
Standaloneβ
import './.pikku/pikku-bootstrap.gen.js'
Generated by running npx pikku all
in project root.
Workspace - No Backend Configβ
import '@my-app/functions/.pikku/pikku-bootstrap.gen'
Bootstrap comes from functions package. Backend doesn't run pikku command.
Workspace - With Backend Configβ
import '../.pikku/pikku-bootstrap.gen'
Generated by running npx pikku
in backend directory.
Queue-Specific Bootstrapβ
For queue workers (BullMQ, PG-Boss), bootstrap is in a /queue/
subdirectory:
Standalone:
import './.pikku/queue/pikku-bootstrap-queue.gen.js'
Workspace:
import '@my-app/functions/.pikku/queue/pikku-bootstrap-queue.gen.js'
Common Package.json Scriptsβ
Standalone Projectβ
{
"scripts": {
"pikku": "pikku all",
"prebuild": "npm run pikku",
"dev": "tsx watch src/start.ts",
"start": "tsx src/start.ts",
"build": "tsc -b"
},
"dependencies": {
"@pikku/core": "^0.9.x",
"@pikku/express": "^0.9.x"
},
"devDependencies": {
"@pikku/cli": "^0.9.x",
"tsx": "^4.x",
"typescript": "^5.x"
}
}
Key scripts:
pikku
: Generates wiring filesprebuild
: Auto-run pikku before builddev
: Watch mode for developmentstart
: Production start
Workspace - No Backend Configβ
{
"name": "@my-app/express-backend",
"scripts": {
"dev": "tsx watch bin/start.ts",
"start": "tsx bin/start.ts",
"build": "tsc -b"
},
"dependencies": {
"@my-app/functions": "workspace:*",
"@pikku/express": "^0.9.x"
},
"devDependencies": {
"tsx": "^4.x",
"typescript": "^5.x"
}
}
Key differences:
- NO
pikku
script (uses functions package wiring) - NO
@pikku/cli
devDependency - NO
@pikku/core
dependency (comes from functions package) - Dependency on functions workspace package
Workspace - With Backend Configβ
{
"name": "@my-app/express-backend",
"scripts": {
"pikku": "pikku",
"prebuild": "npm run pikku",
"dev": "tsx watch bin/start.ts",
"start": "tsx bin/start.ts",
"build": "tsc -b"
},
"dependencies": {
"@my-app/functions": "workspace:*",
"@pikku/express": "^0.9.x"
},
"devDependencies": {
"@pikku/cli": "^0.9.x",
"tsx": "^4.x",
"typescript": "^5.x"
}
}
Key differences from no-config:
- HAS
pikku
script - HAS
@pikku/cli
in devDependencies - HAS
prebuild
script
pikku.config.json Patternsβ
Standalone Projectβ
{
"tsconfig": "./tsconfig.json",
"srcDirectories": ["src"],
"outDir": ".pikku",
"filters": {
"types": ["http", "channel", "scheduler"],
"tags": ["api"]
}
}
Functions Package (Workspace)β
{
"tsconfig": "./tsconfig.json",
"srcDirectories": ["src"],
"outDir": ".pikku",
"filters": {
"types": ["http", "channel", "scheduler", "queue"],
"tags": ["api", "backend"]
}
}
Backend Package (Workspace with Custom Filters)β
{
"extends": "../../packages/functions/pikku.config.json",
"filters": {
"types": ["http", "scheduler"],
"tags": ["api", "express"],
"excludeTags": ["edge-only", "lambda-only"]
}
}
Key: extends
field points to functions package config. Filters override base config.
Running pikku Commandβ
When to Runβ
Always run after:
- Adding/modifying function definitions
- Adding/modifying wiring files (_.http.ts, _.channel.ts, etc.)
- Changing pikku.config.json
Don't need to run:
- Changing service implementations
- Changing business logic inside functions
- Modifying runtime server code
Where to Runβ
Standalone:
cd my-app/
npm run pikku
Workspace - Functions Package:
cd packages/functions/
npm run pikku
Workspace - Backend with Config:
# First, ensure functions package is up to date
cd packages/functions/
npm run pikku
# Then, generate backend-specific wiring
cd ../../backends/express/
npm run pikku
What Gets Generatedβ
Running pikku
creates files in .pikku/
directory:
.pikku/
βββ pikku-bootstrap.gen.js # Wiring registration
βββ pikku-types.gen.ts # Type definitions
βββ pikku-fetch.gen.ts # HTTP client (if httpFile configured)
βββ pikku-websocket.gen.ts # WebSocket client (if websocketFile configured)
βββ queue/
β βββ pikku-bootstrap-queue.gen.js # Queue wiring (if queue functions exist)
βββ ...
Smart Defaultsβ
When setting up runtimes, use these sensible defaults:
Server Configurationβ
- Port: 3000 (or next available)
- Hostname:
- Development:
'localhost'
- Docker/containers:
'0.0.0.0'
- Development:
- Health check:
/health-check
File Locationsβ
- Standalone:
src/start.ts
orsrc/main.ts
- Workspace:
bin/start.ts
- Functions:
src/functions/
- Services:
src/services.ts
- Config:
src/config.ts
Package Managersβ
- Detect from lockfile:
package-lock.json
β npm,yarn.lock
β yarn,pnpm-lock.yaml
β pnpm - Default to
npm
if none detected
Verification Stepsβ
After setup, verify:
1. Package Installationβ
npm list @pikku/core @pikku/[runtime]
# Should show installed versions
2. Wiring Generationβ
ls .pikku/pikku-bootstrap.gen.js
# Or for workspace: ls packages/functions/.pikku/pikku-bootstrap.gen.js
# File should exist
3. TypeScript Compilationβ
npm run build
# Should compile without errors
4. Server/Worker Startβ
npm run dev
# Should start without errors
5. Health Check (for HTTP servers)β
curl http://localhost:3000/health-check
# Should return {"status":"ok"}
Common Pitfallsβ
Wrong Bootstrap Importβ
β Wrong:
// Backend in workspace using functions package filters
import './.pikku/pikku-bootstrap.gen.js' // File doesn't exist!
β Correct:
// Import from functions package
import '@my-app/functions/.pikku/pikku-bootstrap.gen'
Missing pikku Scriptβ
β Problem: Backend has pikku.config.json
but no pikku
script in package.json
β
Solution: Add "pikku": "pikku"
to scripts AND @pikku/cli
to devDependencies
Running pikku in Wrong Directoryβ
β Wrong: Running pikku
in workspace root (has no pikku.config.json)
β
Correct: Run in packages/functions/
or specific backend directory
Forgetting to Run pikkuβ
β Problem: Modified wiring files but didn't regenerate bootstrap
β
Solution: Run npm run pikku
after wiring changes, or use prebuild
script
Related Skillsβ
Runtime Adapters (all reference this skill):
- pikku-express
- pikku-fastify
- pikku-ws
- pikku-uws
- pikku-aws-lambda
- pikku-cloudflare
- pikku-queue-bullmq
- pikku-queue-pg-boss
Function Definition:
- pikku-functions (for creating function definitions)
- pikku-http (for HTTP wiring)
- pikku-channel (for WebSocket wiring)
- pikku-queue (for queue function definitions)
Configuration:
- pikku-cli (for CLI commands and config options)