npp (new pentest project) is your personal project manager that automates the boring shit you always do at the start of an engagement. No more manually creating 47 folders, no more losing notes in random directories, no more "where did I save that screenshot?"
It handles:
- Project metadata (client, type, rules of engagement, bounty platforms, etc.)
- Directory structure (organized by apex domains, subdomains, reports, evidences)
- Scope processing (domains, URLs, wildcards โ from file or stdin)
- DNS resolution (basic A record checks with retries, custom resolvers)
- JSON databases (global project index + perโproject detailed data)
- Updates (add scope, reports, notes, users)
- Status tracking (project state, domain/subdomain alive/working/inscope)
- Listing (filtered by alive/inscope, show stats, current work)
- Archiving (tar, tar.gz, tar.bz2, 7z, zip, rar โ with password support)
- Removal (project, apex, subdomain, user โ with confirmation)
- Trilium integration (create notes in your favourite noteโtaking app)
- Config file support (for those who hate typing)
# Clone the repo
git clone https://github.com/a-mashhoor/npp.git npp && cd npp/src
# Make it executable
chmod +x npp.zsh
# Move it to your PATH (pick one)
sudo ln -sf `pwd`/npp.zsh /usr/local/bin/npp # system-wide
ln -sf `pwd`/npp.zsh $HOME/.local/bin/npp # user only (add to PATH if needed)npp init -n myproject -t bounty -bp "hacker1:https://hackerone.com/foo" -d "Critical API testing" --note t --trilium-server http://localhost:8080 --trilium-api-key your-keyThis only creates a global entry (no directories yet). The real structure comes later with new.
npp new -p myproject -s @scope.txt -rc 30 -t-pproject name (must already exist)-sscope (file with@prefix, or spaceโseparated list)-rcnumber of report folders (default 20)-tshow directory tree
npp add -p myproject -as -s newdomain.com -dr --resolver 8.8.8.8
npp add -p myproject -ar 5
npp add -p myproject -an "quick_notes"
npp add -p myproject -au admin:password123npp update -p myproject --status completed
npp update -p myproject -ux example.com --alive false --workingon true
npp update -p myproject -us sub.example.com --auto-alive -drnpp list -P # all project names
npp list -p myproject -a # all domains & subdomains
npp list -p myproject -ax # only apex domains
npp list -p myproject -sd # only subdomains
npp list -p myproject -cs # statistics
npp list -p myproject -c # currently working on
npp list -p myproject -a -f alive # only alive entriescd $(npp cd -p myproject)npp archive -p myproject -f 7z -s # passwordโprotected 7z
npp archive -p myproject -f tar.bz2 # good ol' tarballnpp rm -p myproject # delete entire project
npp rm -p myproject -ax example.com # remove apex + all subs
npp rm -p myproject -su sub.example.com # remove single subdomain
npp rm -p myproject -u admin:password123 # remove user line
npp rm -p myproject -y # skip confirmationmyproject/
โโโ burp_project/ # Burp session files
โโโ target_data/
โ โโโ scope/ # original scope files
โ โโโ credentials/ # users.txt (passwords optional)
โ โโโ api_documents/ # API docs from client
โ โโโ general_data/ # general description, etc.
โโโ reports/
โ โโโ templates/ # report templates (you'll never use them)
โ โโโ all_reports/
โ โโโ No.01/ # first attempt
โ โ โโโ evidences/
โ โ โโโ edited_media/
โ โ โโโ ...
โ โโโ No.02/ # second attempt
โ โโโ ...
โโโ my_evaluation/ # your personal notes
โโโ gathered_info/
โ โโโ network/ # ASNs, CIDRs, CDN, whois
โ โโโ screen_shots/ # pictures of your pwns
โ โโโ crawlers_results/ # katana, etc.
โ โโโ dns_results/ # raw DNS output
โ โโโ fuzzing_results/ # ffuf, feroxbuster
โ โโโ RBAC/ # roleโbased access control stuff
โ โโโ apex_domains/
โ โโโ example-com/ # apex domain dir
โ โโโ apex_domain.txt
โ โโโ subdomains/
โ โโโ www-example-com/
โ โ โโโ subdomain.txt
โ โ โโโ tech_stack/ # technologies.json
โ โ โโโ URLs/ # wayback/gathered URLs
โ โโโ api-example-com/
โโโ tmp_exploits/ # your 0โdays (keep them safe)
โ โโโ custom_src/
โ โโโ payloads/
โ โโโ bin/
โ โโโ files2u/
โโโ myproject_local_notes/ # local markdown notes (if --note l)
โ โโโ observations.md
โ โโโ tmp.md
โโโ .local.data.json # perโproject JSON (don't touch if you do you will f up the tool)
| Option | Description |
|---|---|
-h, --help |
Show this help |
--version |
Show version |
--check-config FILE |
Validate a config file |
| Command | Description |
|---|---|
init |
Initialize project (metadata only) |
new |
Create directory structure |
add |
Add scope/reports/notes/users |
update |
Update status (project/apex/subdomain) |
rm |
Remove project/apex/subdomain/user |
list |
List projects/domains/subdomains |
cd |
Print project path |
archive |
Archive project |
Run npp <command> --help for commandโspecific options.
-
Use config files for repetitive options. Example
~/.npprc:type=bounty note=t trilium-server=http://localhost:8080 trilium-api-key=your-key trilium-parent=team-projectsThen:
npp init -n myproject -c ~/.npprc -
DNS resolution with
-dris reliable (5 retries). Use--resolverto specify a custom DNS server. -
Autoโalive in
updatereโresolves the domain and updatesis_aliveand IPs. -
Wildcard domains (
*.example.com) are handled properly: directorywildcard-subdomain, files indicate wildcard. -
Trilium integration creates a book note for the project and child notes
notes_tmpandobservations. Make sure the parent note exists. -
Global JSON lives in
~/.local/share/npp/global.json. Back it up if you care.
- GPG encryption for sensitive reports
- Backup/restore projects (export/import)
- More recon integrations (subfinder, httpx, nuclei)
- Template system for custom directory layouts
- Web UI (maybe, if I get bored)
- ZSH ONLY โ This script uses zshโisms. Don't try with bash.
- No spaces in project names โ
npp init -n "my project"will break. Use underscores or hyphens. - Always validate your scope โ
process_scopedoes its best, but garbage in = garbage out. - Backup your global JSON โ It's the brain of the tool. Lose it, lose your project index.
rmis destructive โ Confirmation is there for a reason. Don't-yunless you're sure.
Arshia Mashhoor โ "I made this because I kept losing my screenshots."
GitHub: @a-mashhoor
WTFPL โ Do whatever the f..k you want with it. No warranties, no liabilities, just code.
Stop being a disorganized mess. Use this tool. Save your time for actual hacking.
# This is the way
npp init -n "$(whoami)_is_organized" -t bounty -bp "hacker1:https://hackerone.com/foo"
npp new -p "$(whoami)_is_organized" -s @scope.txt -rc 30 -tHappy hacking, you beautiful chaotic bastard. ๐ดโโ ๏ธ
Found a bug? Open an issue. Want a feature? Submit a PR. Don't just complain.