How many times have you started a new feature or microservice, only to spend the first 20 minutes copy-pasting .eslintrc, tsconfig.json, Dockerfiles, and boilerplate directory structures from an older project?
Or worseβyou find an awesome directory structure generated by Claude or ChatGPT, and you sit there manually mkdir-ing and touch-ing every single file?
We've all been there:
There has to be a better way to capture, store, and recreate developer resources without leaving the terminal.
Enter BScaff.
BScaff is a light, lightning-fast CLI tool designed to store, manage, and scaffold reusable developer resources. Think of it as a personal, command-line vault for:
tree) files) snippet) template) url)
Everything in BScaff revolves around a snapshotβa uniquely named key (-k) storing your saved content locally under ~/.bscaff.
Getting started takes seconds. Install BScaff globally via npm:
npm install -g @akashnag/bscaff
Verify the installation:
bscaff --version
Let's dive into three everyday workflows where BScaff instantly saves you time.
Say you have a starter React or Node.js template configured just the way you like it. Instead of creating a GitHub template repository or manually zip-copying folders, save it as a directory snapshot:
bscaff -k node-base --desc "Base Node.js Express setup" --tags node,express save tree ~/projects/my-node-starter
When you are ready to start a new service, extract it anywhere:
bscaff -k node-base extract ./my-new-api
Boom! Your full directory structure and file contents are instantly created.
AI coding assistants are great at generating project structures like this:
my-service/
βββ src/
β βββ controllers/
β β βββ user.controller.ts
β βββ routes/
β β βββ user.routes.ts
β βββ index.ts
βββ tests/
β βββ user.test.ts
βββ package.json
Instead of manually creating these folders and files, copy that ASCII diagram directly to your clipboard and run:
bscaff create tree ./my-service --prompt-for-content
BScaff parses the tree diagram directly from your clipboard, constructs the complete directory hierarchy on disk, and interactively prompts you to supply content for each generated file.
Need dynamic placeholders in your files? BScaff supports Mustache variable templates ({{ variable }}).
Suppose you have a component template containing:
// {{ componentName }}.tsx
export const {{ componentName }} = () => {
return <div>Hello from {{ componentName }}</div>;
};
When extracting or generating from this snapshot, BScaff will automatically detect {{ componentName }}, prompt you for its value, and replace it across file paths and file contents seamlessly!
Here is a quick command reference to keep in your back pocket:
| Action | Command Syntax |
|---|---|
| Save Directory Tree | bscaff -k <key> save tree <path> |
| Save Git Repo | bscaff -k <key> save tree <repo-url> --git |
| Save Snippet from File | bscaff -k <key> save snippet <file-path> |
| Save Clipboard Snippet | bscaff -k <key> save snippet --memory --type ts |
| Extract Snapshot | bscaff -k <key> extract <dest-path> |
| Dry Run Extraction | bscaff -k <key> extract <dest-path> --dry-run |
| List Saved Snapshots | bscaff list |
| Search Snapshots | bscaff search --tags react |
| Copy Snippet to Clipboard | bscaff -k <key> copy |
| Delete Snapshot | bscaff -k <key> delete |
BScaff isn't just for project scaffoldingβit has a few unexpected capabilities that can streamline your daily workflow.
Stop cluttering your browser bookmark bar with docs you only use during development. Save URLs straight in BScaff:
bscaff -k go-docs save url https://go.dev/doc/
Whenever you need to jump back in, run:
bscaff -k go-docs open
You can use BScaff as a persistent, zero-friction markdown scratchpad:
bscaff -k sprint-notes save snippet --type md
Whenever you want to view or edit your notes, use the update content or open commands:
bscaff -k sprint-notes update content
BScaff was built to eradicate repetitive setup tasks so you can focus on writing actual code.
Give it a try on your next project:
If you find it helpful, drop a star on GitHub, share it with your team, and happy scaffolding! π