n8n-agents-project-scaffolder — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited n8n-agents-project-scaffolder (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Generate complete, production-ready n8n project structures from scratch.
| Scaffold Type | Use Case | Key Files |
|---|---|---|
| Deployment | New n8n server with PostgreSQL + Traefik | docker-compose.yml, .env, backup.sh |
| Queue Mode | Horizontally scaled n8n with Redis workers | docker-compose.yml, .env |
| Custom Node | New community node package | package.json, tsconfig.json, node + credential templates |
| Workflow Template | Starter workflow JSON files | workflows/*.json |
What are you building?
|
+-- A new n8n server deployment?
| |
| +-- Single instance (dev/small team)?
| | --> DEPLOYMENT SCAFFOLD (PostgreSQL)
| |
| +-- High-traffic / horizontal scaling?
| --> QUEUE MODE SCAFFOLD (PostgreSQL + Redis + Workers)
|
+-- A custom n8n node package?
| --> CUSTOM NODE SCAFFOLD
|
+-- Starter workflow files?
--> WORKFLOW TEMPLATE SCAFFOLDn8n-deployment/
├── docker-compose.yml # n8n + PostgreSQL + Traefik
├── .env # Environment configuration
├── .env.example # Template with documentation
├── backup.sh # Automated backup script
├── restore.sh # Restore from backup
├── local-files/ # Shared file directory
└── backups/ # Backup output directorypostgres_data)n8n_data) mounted at /home/node/.n8n./local-files:/files)N8N_ENCRYPTION_KEY (NEVER rely on auto-generated key)N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=trueN8N_RUNNERS_ENABLED=trueNODE_ENV=productionrestart: always on all servicespg_isreadydepends_on PostgreSQL with condition: service_healthy# === DOMAIN ===
DOMAIN_NAME=example.com
SUBDOMAIN=n8n
[email protected]
# === TIMEZONE ===
GENERIC_TIMEZONE=Europe/Amsterdam
TZ=Europe/Amsterdam
# === DATABASE ===
POSTGRES_USER=n8n
POSTGRES_PASSWORD=CHANGE_ME_STRONG_PASSWORD
POSTGRES_DB=n8n
# === SECURITY (CRITICAL) ===
N8N_ENCRYPTION_KEY=GENERATE_WITH_openssl_rand_hex_32
# === EXECUTION ===
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=336
EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000N8N_ENCRYPTION_KEY (losing it = losing ALL credential access)Full Docker Compose template: references/methods.md
n8n-queue-deployment/
├── docker-compose.yml # n8n main + workers + PostgreSQL + Redis
├── .env # Shared environment configuration
├── .env.example # Template with documentation
├── backup.sh # Automated backup script
└── local-files/ # Shared file directoryEXECUTIONS_MODE=queue on ALL n8n services (main + workers)n8n-worker service using command: workerN8N_ENCRYPTION_KEY on ALL instancesN8N_DEFAULT_BINARY_DATA_MODE=s3)QUEUE_BULL_REDIS_HOST pointing to Redis service name--concurrency=5)Full Queue Mode template: references/methods.md
n8n-nodes-<your-name>/
├── package.json # Node registration with n8n block
├── tsconfig.json # TypeScript configuration
├── .eslintrc.js # Linting configuration
├── LICENSE # MIT license
├── README.md # Package documentation
├── credentials/
│ └── ExampleApi.credentials.ts
├── nodes/
│ └── ExampleNode/
│ ├── ExampleNode.node.ts
│ └── ExampleNode.node.json
└── icons/
└── example.svg{
"name": "n8n-nodes-<your-name>",
"version": "0.1.0",
"keywords": ["n8n-community-node-package"],
"n8n": {
"n8nNodesApiVersion": 1,
"credentials": ["dist/credentials/ExampleApi.credentials.js"],
"nodes": ["dist/nodes/ExampleNode/ExampleNode.node.js"]
},
"scripts": {
"build": "n8n-node build",
"dev": "n8n-node dev",
"lint": "n8n-node lint",
"lint:fix": "n8n-node lint --fix"
},
"files": ["dist"],
"devDependencies": {
"@n8n/node-cli": "*",
"typescript": "5.9.2"
},
"peerDependencies": {
"n8n-workflow": "*"
}
}n8n.nodes and n8n.credentials MUST point to compiled .js files in dist/n8n-nodes-keywords MUST include "n8n-community-node-package"n8n-workflow as a peer dependency (NEVER as a direct dependency)@n8n/node-cli as a dev dependency for build toolingthis.getInputData() directly; clone firstFull custom node templates: references/methods.md
| Template | Trigger | Purpose |
|---|---|---|
| Webhook Workflow | Webhook node | Receive HTTP requests, process, respond |
| Scheduled Workflow | Schedule Trigger | Periodic data processing |
| Error Handler | Error Trigger | Centralized error notifications |
| Sub-Workflow | Execute Workflow Trigger | Reusable processing module |
{
"name": "Workflow Name",
"nodes": [
{
"id": "unique-uuid",
"name": "Node Display Name",
"type": "n8n-nodes-base.nodeType",
"typeVersion": 1,
"position": [250, 300],
"parameters": {}
}
],
"connections": {
"Source Node Name": {
"main": [[{ "node": "Target Node Name", "type": "main", "index": 0 }]]
}
},
"settings": {
"executionOrder": "v1",
"saveDataErrorExecution": "all",
"saveDataSuccessExecution": "all"
}
}"executionOrder": "v1" in settingscontinueOnFail or error workflow referenceFull workflow templates: references/examples.md
| Variable | Purpose | Example |
|---|---|---|
N8N_ENCRYPTION_KEY | Credential encryption | openssl rand -hex 32 |
N8N_HOST | Hostname | n8n.example.com |
N8N_PORT | HTTP port | 5678 |
N8N_PROTOCOL | Protocol | https |
NODE_ENV | Environment | production |
WEBHOOK_URL | Public webhook URL | https://n8n.example.com/ |
DB_TYPE | Database type | postgresdb |
GENERIC_TIMEZONE | Timezone | Europe/Amsterdam |
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS | File security | true |
N8N_RUNNERS_ENABLED | Task runners | true |
| Variable | Default | Recommended |
|---|---|---|
N8N_BLOCK_ENV_ACCESS_IN_NODE | false | true in shared environments |
N8N_SECURE_COOKIE | true | Keep true with HTTPS |
N8N_COMMUNITY_PACKAGES_ENABLED | true | false if not needed |
NODES_EXCLUDE | See docs | Exclude executeCommand, localFileTrigger |
pg_dump (or docker exec equivalent)n8n export:workflow --backupn8n export:credentials --backup--decrypted flag in automated scriptsN8N_ENCRYPTION_KEYFull backup script template: references/methods.md
ALWAYS apply these security defaults when scaffolding ANY n8n project:
N8N_ENCRYPTION_KEY with openssl rand -hex 32N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=trueN8N_RUNNERS_ENABLED=true (sandboxed Code node execution)NODE_ENV=productionN8N_BLOCK_ENV_ACCESS_IN_NODE=true (shared environments)NODES_EXCLUDE=["n8n-nodes-base.executeCommand"]~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.