Skip to content

Configuration Reference

PopKit uses a layered configuration system with project-local files. This reference documents all configuration files, their locations, and available options.

FilePurposeScope
.claude/popkit/config.jsonProject settings and preferencesPer-project
.claude/popkit/routines.jsonRoutine definitions and defaultsPer-project
.claude/popkit/state.jsonRuntime state (auto-managed)Per-project
STATUS.jsonSession state for continuityPer-project root
.claude/popkit/measurements/Performance metrics (optional)Per-project
.claude/popkit/routines/<type>Custom routine definitionsPer-project

Project-level PopKit configuration.

<project-root>/.claude/popkit/config.json
{
"project_name": "string",
"prefix": "string",
"defaults": {
"morning": "string",
"nightly": "string"
},
"routines": {
"morning": [],
"nightly": []
}
}
FieldTypeDefaultDescription
project_namestring(auto-detect)Human-readable project name
prefixstring(generated)Short prefix for custom routine IDs
defaults.morningstring"pk"Default morning routine ID
defaults.nightlystring"pk"Default nightly routine ID
routines.morningarray[]List of custom morning routine definitions
routines.nightlyarray[]List of custom nightly routine definitions

The prefix is auto-generated from your project name:

Project NameGenerated Prefix
Reseller Centralrc
My Awesome Appmaa
genesisgen
popkitpop

Custom routines use this prefix: rc-1, rc-2, etc.

{
"project_name": "Reseller Central",
"prefix": "rc",
"defaults": {
"morning": "rc-1",
"nightly": "pk"
},
"routines": {
"morning": [
{
"id": "rc-1",
"name": "Full Stack Check",
"description": "Includes database and Redis health",
"created": "2024-01-15T08:00:00Z",
"based_on": "pk"
}
],
"nightly": []
}
}

Detailed routine configuration (legacy format, merging into config.json).

<project-root>/.claude/popkit/routines.json
{
"morning": {
"default": "string",
"routines": {
"<id>": {
"name": "string",
"checks": []
}
}
},
"nightly": {
"default": "string",
"routines": {}
}
}

Pre-configured flag combinations for common use cases.

ProfileFlags AppliedUse Case
minimal--quick --skip-tests --skip-services --skip-deploymentsFast health check (< 10s)
standard(defaults)Normal daily routine (~20s)
thorough--full --measureDeep analysis (~60s)
ci--optimized --measure --simple --no-cacheCI/CD pipelines
Terminal window
/popkit-dev:routine morning --profile minimal
/popkit-dev:routine morning --profile thorough
FlagEffect
--quickOne-line summary instead of full report
--skip-testsSkip test execution
--skip-servicesSkip service health checks
--skip-deploymentsSkip deployment status check
--fullInclude all checks (slower)
--measureTrack performance metrics
--optimizedUse caching for efficiency
--simpleMarkdown tables instead of ASCII dashboard
--no-cacheForce fresh execution, bypass cache
--no-nightlySkip “From Last Night” section
--no-upstreamSkip Anthropic upstream update check

Some flags automatically enable others:

  • --measure enables --simple (for parseable output)
  • --full overrides --optimized (thorough checks can’t be cached)

Session state file for cross-session continuity.

<project-root>/STATUS.json
{
"session_id": "string",
"timestamp": "ISO-8601",
"last_morning_routine": {
"executed_at": "ISO-8601",
"ready_to_code_score": "string",
"breakdown": {},
"session_restored": "boolean"
},
"last_nightly_routine": {
"executed_at": "ISO-8601",
"sleep_score": "string"
},
"git_status": {
"current_branch": "string",
"commits_behind_remote": "number",
"uncommitted_files": "number",
"stashes": "number",
"action_required": "string"
},
"metrics": {
"ready_to_code_score": "string"
},
"recommendations": {
"before_coding": [],
"todays_focus": []
}
}
  1. Nightly routine writes current state (branch, work summary, sleep score)
  2. Morning routine reads previous state to restore context
  3. Session capture (/popkit-core:project capture) updates manually

When you create a custom routine with /popkit-dev:routine generate, it creates:

.claude/popkit/routines/
├── morning/
│ └── rc-1/
│ ├── routine.md # Routine definition
│ ├── config.json # Routine config
│ └── checks/ # Custom check scripts
└── nightly/
└── rc-1/
├── routine.md
├── config.json
└── scripts/
---
id: rc-1
name: Full Stack Check
type: morning
project: Reseller Central
prefix: rc
based_on: pk
created: 2024-01-15T08:00:00Z
modified: 2024-01-15T08:00:00Z
---
# Morning Routine: Full Stack Check
Custom checks for full-stack projects.
## Checks
### Git Status
\`\`\`bash
git status --porcelain
git log --oneline -3
\`\`\`
### Database Health
\`\`\`bash
pg_isready -h localhost -p 5432
\`\`\`
## Score Calculation
| Check | Points | Criteria |
| --------- | ------ | ---------------------- |
| Git clean | 25 | No uncommitted changes |
| Database | 25 | PostgreSQL responding |
| Redis | 25 | Redis responding |
| Tests | 25 | All tests pass |
{
"id": "rc-1",
"name": "Full Stack Check",
"description": "Includes database and Redis health",
"based_on": "pk",
"checks": [
{ "name": "git_clean", "weight": 25, "script": "checks/git.sh" },
{ "name": "database", "weight": 25, "script": "checks/database.sh" },
{ "name": "redis", "weight": 25, "script": "checks/redis.sh" },
{ "name": "tests", "weight": 25, "script": "checks/tests.sh" }
],
"score_weights": {
"git_clean": 25,
"database": 25,
"redis": 25,
"tests": 25
}
}

When running with --measure, performance data is stored.

.claude/popkit/measurements/<routine>-<timestamp>.json
{
"routine": "morning",
"timestamp": "ISO-8601",
"duration_ms": "number",
"tool_calls": "number",
"tokens": {
"input": "number",
"output": "number"
},
"cost_estimate_usd": "number",
"breakdown": {
"git_check": { "duration_ms": "number", "tokens": "number" },
"github_check": { "duration_ms": "number", "tokens": "number" }
},
"results": {
"ready_to_code_score": "number",
"services_running": "number",
"commits_behind": "number"
}
}
Terminal window
# View latest measurement
/popkit-core:stats routine
# View specific routine
/popkit-core:stats routine morning
# View all measurements
/popkit-core:stats routine --all

PopKit respects these environment variables:

VariablePurposeDefault
POPKIT_DEBUGEnable debug outputfalse
POPKIT_NO_COLORDisable colored outputfalse
POPKIT_CACHE_TTLCache time-to-live in seconds300
GITHUB_TOKENGitHub API authentication(gh CLI)

To initialize PopKit configuration for a new project:

Terminal window
# Initialize with defaults
/popkit-core:project init
# Or manually create config
python -m popkit_shared.utils.routine_storage init

This creates the .claude/popkit/ directory structure and detects your project name/prefix.