OneShot

← All packs

Secrets & Config Starter

verified

Stop your app booting with a missing setting, and stop passwords leaking into your logs.

Any Node or TypeScript service. Free, and the fastest way to see how a pack works.

How you actually use this

You don’t install a library or wire up an SDK. Your own coding agent builds the code in your project, and you keep it — no runtime dependency on us.

  1. Step 1

    Download and unzip

    You get a folder: the docs that tell an agent what to build, a starting skeleton, and the test suite that decides when it's done.

  2. Step 2

    Open it in Claude Code or Cursor

    Point your coding agent at the folder. Nothing to install, no account with us, no API key.

  3. Step 3

    Paste one prompt

    The pack contains the exact prompt. Paste it as your first message and leave it alone — it works through the build itself, choosing a cheaper or stronger model per task.

  4. Step 4

    Run ./verify.sh

    One command. It prints a pass or fail for every check. Green means the build is done — the same script we ran to produce the receipt on this page.

Typical build: about 6 minutes of your agent working, mostly unattended. Then you integrate the working module into your app the way you would any code you’d written yourself.

Technically: Config that fails closed at boot, logs that cannot carry a secret, ignore files proven against a real git repo, and a pre-commit credential scan — for any Node/TypeScript service.

Execution receipt3 of 3 runs passed
Model
claude-sonnet-5
Run at
2026-08-03T15:43:56+00:00
Pack version
8a45aa5c9a1e
Tokens in / out
2,879,592 / 29,989 · per-run mean · billed input includes 2,678,969 cache reads, priced far below fresh input
Wall time
6.1 min · per-run mean
Run cost
$1.81 · what this verification run cost us at API pricing, per build pass · your plan and model prices differ
Deploy
not deployed

Acceptance checks

  • prerequisitesPASS
  • config-single-env-readerPASS
  • ignore-env-not-trackedPASS
  • ignore-example-trackedPASS
  • ignore-build-artifactsPASS
  • ignore-docker-contextPASS
  • ignore-railway-contextPASS
  • scan-detects-planted-credentialsPASS
  • scan-clean-code-no-false-positivesPASS
  • scan-allows-env-examplePASS
  • scan-precommit-hook-blocks-commitPASS
  • config-missing-var-refuses-bootPASS
  • config-blank-var-refuses-bootPASS
  • config-malformed-var-refuses-bootPASS
  • config-error-names-every-problemPASS
  • config-valid-env-bootsPASS
  • server-error-path-redactedPASS
  • redact-known-secret-valuesPASS
  • redact-sensitive-keysPASS
  • redact-error-objectsPASS
  • redact-connection-stringPASS
  • redact-url-queryPASS
  • redact-log-output-still-jsonPASS

Versions lock

node-typescript

node24.18.1

Scaffold integrity

3 scaffold files changed, all of them declared by the pack — nothing unexpected

This pack ships working code the build adapts, so these changes are the design. Any file outside the declared list would appear as unexpected, and verify.sh can never be declared.

  • .env.example
  • src/config.ts
  • src/server.ts

Every service reads configuration and holds credentials, and almost none of them get both right on the first pass — a process.env read that is undefined in one environment, an error object that carries the connection string into the log aggregator, a .env that was never actually ignored. This pack ships the layer that closes all three: a typed schema that refuses to let the process start on a missing or malformed variable, a redaction layer nothing logs around, ignore files proven correct against a real git repo, and a pre-commit scan that blocks thirteen credential shapes. The receipt proves it: 23 checks, hermetic — no network, no accounts, no Docker — running in about two seconds, and every one of them exists because something specific went wrong.

Three of those checks exist because they went wrong here, in OneShot's own repository, on 2026-08-02 and 2026-08-03: a migration script that printed a live database password into the build log (psql prints result rows regardless of -q, and set_config() returns the value it sets); a scaffold that shipped a real .env with no ignore file; and a repository left public for about 28 hours with paid content in it. We would rather tell you that than imply we write software that has never leaked anything.

Example use cases

  • A solo founder deploying to Railway for the first time, who wants a bad environment variable to block the deploy with DATABASE_URL is blank rather than produce a running service that 500s on every request.
  • An agency starting its fifth client project this year, dropping the same proven config-and-secrets layer into each one instead of re-deciding it — and wiring the pre-commit scan before a contractor's first commit rather than after.
  • A team that just had an incident: a credential turned up in a log aggregator or a CI build log. The redaction layer plus the "one file reads process.env" rule is the smallest change that makes it structurally hard to repeat.
  • Anyone auditing an agent-generated scaffold. Agents routinely produce projects with a real .env and no ignore file. One command tells you whether yours is one of them, instead of reading .gitignore and assuming.
  • A repo adding pre-commit hygiene without adding a Python toolchain. The scanner is grep in a bash script; it installs and runs anywhere git does.

Why this pack

Bare agent, no packA secret-scanning SaaS / hosted scannerHand-rolling itThis pack
What it's forSame goal, no pre-made decisionsFinding credentials already committed, across an orgThe same four properties, built from scratchConfig that fails closed + logs that cannot carry a secret + ignore files + a commit-time scan
CostToken spend, repeated per projectPer-seat or per-repo subscriptionEngineer time — a day to get right, longer to get the false-positive rate livableFree. Token spend for one adoption pass.
TimeAn hour to something plausibleFast to enable, ongoing triageSlow; the scanner's false-positive tuning is most of itOne session
Correctness riskHigh — agents reliably produce the exact defects listed belowLow for its own job, but it does not touch config validation or log redaction at allUnknown until proven, and proving it is the work23 checks, including 13 credential shapes detected and a false-positive suite of near-misses (templated DSNs, password variables, commit SHAs, SRI digests)
Lock-inNone, undocumented and untestedYour source is scanned by a third partyNone, risk is yoursNone — MIT, zero dependencies, no runtime dependency on OneShot

On the bare-agent column, specifically — these are the defects this pack pre-solves, all observed rather than imagined:

  • A scaffold with a real .env and no ignore file. We shipped one on 2026-08-02. Nothing was wrong with the code; nobody had written the four lines.
  • A tool echoing back the secret you just gave it. Our migration script set a database password through a set_config() bridge. set_config returns the value it sets, and psql prints result rows even with -q, so a live password went into stdout and into CI. No key-name-based redactor would have caught it — the value came back under a result-row key. Value-based redaction does.
  • JSON.stringify(err){}. The reflex fix is String(err), which is precisely what puts the connection string in the log.
  • **An over-broad .env* rule that swallows .env.example.** Silent, and everyone who clones the repo has to guess the variable names.
  • A pre-commit hook installed into .git/hooks in a repo with core.hooksPath set. It never runs. Nothing tells you.

On the scanner-SaaS column — hosted secret scanners are good at what they do and solve a genuinely different problem: finding credentials that are already committed, across an organisation, retroactively. This pack is about the three places a secret gets in before that: the config layer, the log line, and the commit. They compose fine. This one costs nothing and does not require sending your source anywhere.

On hand-rolling — the redaction and validation code is a few hundred lines and is not the hard part. The hard parts are knowing that blank is missing, that set_config echoes, that .dockerignore needs .git, that railway up uploads uncommitted files, that hooks live wherever core.hooksPath says, and that a scanner which flags const password = user.password gets uninstalled in week two. That knowledge is what is encoded here, and the check suite is what keeps it encoded.

We will not claim this makes you unleakable. What the checks back is narrower and true: the specific failure modes above are closed, and the suite proves it in two seconds without touching the network.

Scale envelope

There is no runtime load story here worth inflating — this is boot-time validation plus a per-log-line transform — so the honest numbers are about codebase size and developer friction:

  • Config validation cost: one pass over the schema at process start. With a few dozen variables it is microseconds; it happens once, before the first socket opens. There is no ceiling worth naming.
  • Redaction cost per log line: a bounded walk (depth capped at 8, cycles detected) plus a string pass per registered secret and roughly a dozen regex passes over each string field. That is real work — noticeable if you log megabyte payloads at debug level in a hot loop. The mitigation is the one you want anyway: log level info in production and log identifiers, not payloads. If you genuinely need to log large blobs at high frequency, redact at the edge and pass the result through as a pre-redacted string.
  • Scanner cost: grep across the staged file list. On a normal commit (a handful of files) it is milliseconds. Across a whole repository (--all, ~13 grep passes per file) expect seconds for thousands of files, minutes for a very large monorepo — which is why the pre-commit path scans only staged files and the full sweep belongs in CI.
  • First ceiling: the schema is a single object literal in one file. Past roughly 50 variables that file wants splitting by domain (the loader does not care — pass it a merged object). Past that, the honest answer is that you have outgrown environment variables and want a secrets manager, which this pack deliberately does not implement: it is one async loader in front of loadConfig().
  • Not load-tested. These are reasoned from the shipped code, not benchmark results, and are labelled that way on purpose.

Economics: the pack is free, so there is no saving to claim and none is claimed. The only cost is the tokens of one adoption pass — an author estimate of ~231k fresh tokens, not yet a measurement, because this pack is status: draft and has no receipt. That number will be replaced with the measured one, and the receipt is where you should look for it rather than here.

Verified against

  • claude-opus-5
  • claude-sonnet-5
  • claude-haiku-4-5

Supported stacks

Estimated buyer token cost

231,000 tokens for one build pass (estimate, not a guarantee).

FAQ

What if the build fails?

Run bash verify.sh. It is deterministic, non-interactive, needs no network, and prints one CHECK: <name> PASS|FAIL line per check; ACCEPTANCE.md maps every name to what it asserts, and GETTING-STARTED.md §3 has a failure→cause table. prompts/02-verify.md gives your agent a fix-forward loop that writes FAILURE-REPORT.md rather than stopping silently. There is no refund policy because there is no purchase — if it fails on a supported configuration (Node 24.x, git, pack followed as written), open an issue on the public repository with the CHECK output attached.

What models does this need?

claude-haiku-4-5 for setup and the ignore-file task, claude-sonnet-5 for the adoption tasks and verification, and claude-opus-5 only as an escalation path after two failed fix attempts on the same check. There is no capable-tier task on the happy path, which is the main reason this fits one session. Plan on ~231k fresh tokens for one adoption pass — an author estimate; no receipt exists yet.

Can I customize it after the build?

That is the design. SCHEMA in src/config.ts is meant to be replaced with your variables — it is the one file the task graph tells the agent to edit. src/server.ts is a demonstration you replace with your service. The redaction key pattern and the scanner's shape list are each one array. What you should not loosen is the "one file reads process.env" rule; a check enforces it, and it is the property everything else rests on.

Do I own the code?

Yes. MIT, zero dependencies, no runtime license check, no phone-home. It is plain TypeScript and bash — run it anywhere Node 24 and git run.

Why does it have no dependencies? Isn't that reinventing wheels?

Partly, deliberately. A module whose job is guarding your credentials is the worst possible place for a transitive dependency tree: every package in it is a path to the thing being guarded, and secret-adjacent packages are a known supply-chain target. The absence of dependencies is also what makes the acceptance suite hermetic — no registry, no lockfile, no npm ci. The cost is that validation is ~120 lines instead of a zod schema, and that the scanner is grep instead of a Go binary with entropy analysis. Both trades are stated in ARCHITECTURE.md.

Is this enough for SOC 2 / a security review?

No, and it would be dishonest to imply otherwise. It closes specific technical failure modes and gives you a machine-checkable assertion that they are closed. Compliance frameworks also want documented controls, access reviews, audit logging, incident response, and usually an auditor. This is one strong, verifiable technical answer to "can a credential end up in your logs or your repo" — not a certification.

Will the scanner catch everything?

No. It matches credential shapes and assignments, not randomness. A bare high-entropy string with no distinguishing format is missed, on purpose: entropy scanning false-positives on hashes, UUIDs and lockfile integrity strings, and a hook people disable protects nothing. It also cannot help with a secret already pushed — that needs rotation, and history rewriting, both covered in GETTING-STARTED §4.

What is this pack's ceiling? What does the paid one do?

This pack keeps your secrets out of your logs and out of your repository. It does not keep tenant A out of tenant B's data. Database-level tenant isolation (Postgres row-level security with WITH CHECK on writes), the non-owner-role posture that managed hosts get wrong by default — Railway's default Postgres connection is a full superuser with BYPASSRLS, for which RLS is simply off — and session and permission enforcement are a different problem, solved by OneShot's Multi-Tenant Auth & RBAC Core ($149), whose suite includes cross-tenant probes run directly against the database as the app's own role. The two compose: this pack keeps that database's credentials out of your logs and commits; that one keeps the database from handing over the wrong rows.

Why is it free?

It is top-of-funnel and we would rather say so than pretend otherwise. Free packs sit in public repositories, get indexed by skill directories, and prescribe a stack we may earn a referral credit on (Railway — disclosed in GETTING-STARTED.md). None of that changes what the pack has to do to be worth installing, and a free pack that does not work is worse than no free pack, because the receipt is the brand.

Prescribed services

Disclosure: some links on this page are affiliate links. We may earn a commission if you sign up through them, at no extra cost to you. We only link to services the pack actually verified against.