Shell, Python, and Perl scripts I wrote/use on a daily basis; i.e. eating my own dog food.
The summary/index below was generated by local AI (DSv4 Flash); keep in mind that many utilities below are probably WAY out of date... Use your own judgement about them - that is, check whether they fit your own needs before using them.
Mostly, this repo establishes a common baseline in any machine I work in; a baseline that I've muscle-memoried over the years.
Even if none of the utilities below are useful to you, the approach itself - i.e. building a publicly accessible arsenal you can 'git clone' at a moment's notice... that is definitely recommended :-)
| Script | What it does |
|---|---|
isolate.sh |
Firejail-based sandbox: network allowlisting, read-only $HOME, per-path rw/hide. The core isolation engine |
vimisolated.sh |
Launch vim inside isolate.sh, auto-detecting writable paths |
pi.isolated.sh |
Run pi (AI coding agent) inside isolate.sh, tunneling through a Unix socket to reach a local LLM. Symlinked as pi.sh |
desert_island_container_execution.sh |
Run untrusted TCP server code in a Docker container that the host can reach, but the container can't reach outside the LAN |
dockerme.sh |
Launch a Docker container with the current folder mapped, optional X11/PulseAudio passthrough, network toggle, root toggle |
dockerClearRunningContainersAndNoneImages.sh |
Nuke all containers and <none> images |
parse-isolation-options-common.sh |
Shared argument parser for isolate.sh / pi.isolated.sh (sourced, not standalone) |
Example usage of isolation (vimisolated.sh is much better, but this works as a basic example:
# Read-only $HOME, no network
isolate.sh -- vim ~/bin/pi.sh
# Allow specific servers, make some paths writable, hide SSH keys from any vim-spawned subprocesses (Language servers, etc)
isolate.sh --rw ~/bin --rw ~/.viminfo --hide ~/.ssh \
--servers servers.txt --dns 1.1.1.1 -- vim ~/bin/pi.shExample usage of isolated pi.dev harness:
# Assumes a local LLM at localhost:8081
pi.isolated.sh [--port PORT] [isolate.sh options] [-- pi options]| Script | What it does |
|---|---|
indexer.py |
Scan folders, store MD5s in SQLite, detect changes. Parallel MD5 with ProcessPoolExecutor |
syncer.py |
Cross-reference a new folder against an existing indexer.db: finds already-existing files (by MD5) and similar filenames (Levenshtein distance) |
vidir |
Make the moreutils/vidir work properly with my isolated vim) |
cmpDir1andDir2andRemoveIdenticalFromDir1 |
Remove from dir1 files that are identical (size+MD5) in dir2 |
cmpDir1andDir2andRemoveIdenticalFromDir1BasedOnSizeAndTimestamp |
Same, but uses size + timestamp (faster, no MD5) |
Example usage:
# Scan folders, store MD5s
indexer.py /mnt/photos| Script | What it does |
|---|---|
find_dup_videos.py |
Detect duplicate videos by duration + perceptual hash (imagehash) |
find_dup_images.py |
Find duplicate images via perceptual hashing |
# Requires ffmpeg/ffprobe + python3 -m pip install ImageHash pillow
find_dup_videos.py /path/to/videos/| Script | What it does |
|---|---|
minimalVideo.py |
Transcode any video to x264 at ~0.06 b/p, mux with original audio via mkvmerge |
minimalVideo265.py |
Same concept, but using HEVC (x265) |
minimalVideoCRF_265.sh |
HEVC encode with CRF mode (quality-based), copy audio |
minimalVideoCRF_265_copy_audio.sh |
HEVC CRF encode, copy audio track directly |
minimalVideoCRF_265_forQuest.sh |
HEVC CRF encode variant for VR headsets (Quest) |
vaapi_encode.sh |
VAAPI hardware-accelerated HEVC encode |
vaapi_encode.just_encode.sh |
Minimal VAAPI HEVC encode (no rescaling) |
cuda_encode_hevc.sh |
NVENC HEVC encode (NVIDIA GPU) |
cuda_encode_av1.sh |
NVENC AV1 encode (NVIDIA GPU) |
fps_2x.sh |
Double frame-rate via VAAPI motion interpolation (60fps) |
fps_2x_vapoursynth/ |
Vapoursynth-based 2x FPS scripts |
any2mp3.sh |
Extract audio track to LAME mp3 from any media file |
transcode.sh |
Generic ffmpeg transcode wrapper |
show_video_bpp.py |
Show bits-per-pixel stats for a video |
show_video_details.py |
Dump codec/res/fps/bitrate of a video file |
m4a2aac.sh |
Extract AAC from M4A container |
mpvYoutubeNoVideo.sh |
Play YouTube audio-only (no video, saves CPU) |
jpg2lep.sh |
Lossless JPEG recompression via Dropbox Lepton |
png2webp.sh |
Convert PNG to WebP via ffmpeg |
recordX11.sh |
Losslessly compressed X11 screen recording |
flashVideo.sh |
Extract flash video from browser plugin's pipe |
misc.py |
Shared utility module for video scripts |
| Script | What it does |
|---|---|
pi.isolated.sh |
Primary launcher: sandboxed pi session with local LLM via Unix socket tunnel. Symlinked as pi.sh |
pi.google.sh |
Pi launcher using Google AI Studio (Gemini) |
pi.google_run.sh |
Quick one-shot Google AI Studio run |
pi.dockerized.vllm.sh |
Run vLLM model server in Docker, then launch pi connected to it |
pi_parse_stream.py |
Shared parser for pi's streaming JSON responses |
cclog.sh |
Run cclog Docker image to convert a JSONL conversation log to Markdown |
localAI/ |
Dockerfiles, configs, and launch scripts for local LLM serving (vLLM, llama.cpp, etc.) |
Dockerfiles/ |
Dockerfiles for cclog and yt-dlp binary images |
| Script | What it does |
|---|---|
dstat |
Enhanced dstat binary (system resource monitor) |
dstat.sh |
Wrapper: dstat -clnv --fs --vm |
stats.py |
Pipe in numbers → colored statistics (mean, stddev, median, min/max) |
statsLive.py |
Real-time mean+stddev over stdin stream (Welford's online algorithm) |
histogram.py |
Generate histogram + percentiles from piped data |
histogram.sh |
Bash wrapper for histogram.py with outlier detection |
_histogram.py |
Internal histogram module |
asciigraph.py |
ASCII line graph from piped data (matplotlib) |
crystaldiskmark.sh |
CrystalDiskMark clone for Linux using fio |
benchmark.nvme.via.io.uring.sh |
NVMe sequential read benchmark via io_uring |
percentile.sh |
Quick percentile calculator |
barChartTimes.sh |
Horizontal bar chart of execution times (from time output) |
performance |
Performance tuning wrapper |
ondemand |
CPU governor toggle (ondemand vs performance) |
# Colored stats
for i in {1..100}; do echo $i; done | stats.py
# Histogram
cat numbers.txt | histogram.py| Script | What it does |
|---|---|
block_user_via_iptables.sh |
Block a Unix user's outgoing traffic via iptables |
unblock_user_via_iptables.sh |
Remove the iptables block for a user |
sync_NIC_HW_timestamping_clock_from_host.py |
Sync NIC hardware timestamp clock (phc2sys) for accurate tcpdump timestamps |
tcpdump2binary.py |
Extract raw Ethernet frames from a pcap into binary files (uses scapy) |
myip.sh |
Show my public IP |
mydu.sh |
Better du: sums file sizes (filesystem-agnostic) per directory |
nointernet.for.genymotion.sh |
Block Genymotion VM from internet access |
youtubeFromClipboard.sh |
Download YouTube video from clipboard URL |
yt-dlp.sh |
Wrapper around Dockerfiles/Dockerfile.yt-dlp container (sandbox the madness) |
| Script | What it does |
|---|---|
get_subs_tmux.sh |
Download YouTube subtitles, convert to text, launch interactive pi session to summarize. Symlinked as zz |
vtt2text.py |
Convert VTT subtitle files to clean text |
subrip.sh |
Subtitle RIP/conversion utility |
sub_auto_fixer.py |
Match subtitle files to video files by Dice coefficient + LCS |
| Script | What it does |
|---|---|
latest.py |
List recently modified files in a directory, sorted by timestamp |
latest.sh |
Bash-only poor-mans-version of latest.py |
exclude.sh |
Interactively filter lines from a file by regex (used with latest.py) |
excludeFilter.sh |
Same, but via stdin pipe |
greedy.py |
Pack files to maximally fit a target size |
lost_my_space.py |
Find what's consuming disk space in a filesystem |
lost_my_space.sh |
Bash wrapper |
logDurations.py |
Parse timestamped logs and show duration of each run |
sortXML.py |
Sort XML elements while preserving structure |
csvToHTML_bootstrap.py |
CSV → styled HTML table (Bootstrap) |
csvToHTML_barebones.py |
CSV → minimal HTML table |
excelToCsv.py |
Convert Excel (.xls/.xlsx) to CSV |
countMoviesLength.py |
Sum total duration of video files in a folder |
rmdirRecursive.sh |
Remove all empty directories recursively (post-cleanup) |
inlineDataInHTML.sh |
Generate data: URI for embedding files in HTML |
nocolor.sh |
Strip ANSI color codes from pipe |
quote.sh |
Wrap each line in double-quotes, escaping inner quotes |
| Script | What it does |
|---|---|
clipboardDaemon.py |
Clipboard monitoring daemon |
execOnChange.sh |
Run a command whenever files matching a pattern change (like make for file changes) |
batch.SMP.processing.with.bash |
Simple parallel processing with bash |
lock.sh |
Lock screen (i3lock) |
setTitle.sh |
Set XTerm title |
tmux-attach.sh |
Attach to a tmux session |
tmux-restore.sh |
Restore tmux sessions from saved state |
tmux_colors.sh |
Show tmux color palette for config |
fzf-preview.sh |
File preview while browsing with fzf + bat |
timestamped_logger.sh |
Run a command, log stdout+stderr with timestamps |
| Script | What it does |
|---|---|
cpptypefmt |
C++ type formatting helper |
clean-template-mess.py |
Pretty-print C++ template instantiations with indentation |
findClassInJars.sh |
Find a class name inside a collection of JAR files |
findIn |
Flexible file content search |
git-lg |
Git log with graph (one-line) |
diffIgnoreCaseAndWS.sh |
diff -u -i -b wrapper |
diffu |
Unified diff shortcut |
diffu.meld |
Diff with meld |
xmlprettyprint.sh |
XML pretty-printer (symlink to tidyXML.sh) |
tidyXML.sh |
XML tidy/format |
html5check.py |
HTML5 validation |
make_ada_tags.py |
Generate ctags for Ada sources (gnatxref) |
pylintAll.sh |
Run pylint on all Python scripts in current dir |
showBashCmdline.sh |
Show the currently executing command line inside a bash shell |
vimcat.sh |
Cat a file with vim-based ANSI syntax highlighting |
svndiff |
SVN diff wrapper |
svndiffMELD |
SVN diff via Meld |
svndiffWS |
SVN diff (whitespace-aware) |
svndiffXXDIFF |
SVN diff via xxdiff |
| Script | What it does |
|---|---|
ansi2html.sh |
Convert ANSI-colored terminal output to HTML |
htmlEntities.pl |
HTML-encode text (Perl) |
unicodeUnescape.py |
Decode \uXXXX escape sequences |
hex2utf.py |
Hex → UTF-8 converter |
mime_decoder_inplace_pipe.sh |
Decode MIME-encoded files in-place |
epochToHuman.pl |
Convert Unix epoch to human date |
tohex |
Decimal → hex |
todec |
Hex → decimal |
tozero.sh |
feed safely from a pipe to xargs -0 |
256color.pl |
Display 256-color terminal palette |
href.pl |
Extract href links from HTML |
img.pl |
Extract img src links from HTML |
unescape.pl |
Decode URL-encoded (%XX) and HTML entities |
speed.pl |
Monitor download speed/progress of a file |
| Script | What it does |
|---|---|
swap.usage.sh |
Show swap usage per process |
zswapStatus.sh |
Check zswap status |
hyperthreading |
Toggle hyperthreading |
brightScreen.sh |
Set backlight brightness to max |
waitForCoolCPU.sh |
Wait until CPU temperature drops |
waitForProcToDie.pl |
Wait for a process to exit, then run a command |
dumpMemoryOfPID.sh |
Dump all memory pages of a PID (as root) |
dump_all_thread_callstacks_for_pid.sh |
Dump all thread callstacks of a PID via GDB |
callstacks_of_threads.sh |
Symlink to above |
thread_callstacks.sh |
Symlink to above |
snap_remove_old_versions.sh |
Clean old snap package versions |
archLinux.orphans.ordered.by.size.sh |
List orphaned pacman packages sorted by size |
x11.off.sh |
Turn off display (DPMS) |
x11.off.saver |
Screen saver variant |
fixClock.sh |
Sync system clock via NTP (pool.ntp.org) |
7z-ttsiod-compress |
7z compression wrapper |
makeSelfSignedCertificate.sh |
Generate self-signed SSL certificate (legacy, use Let's Encrypt instead) |
bcmp.sh |
Binary compare two files (shows offset + hex bytes) |
setSubtract.pl |
Subtract one list of strings from another |
setUnversionedToSVNignore.sh |
Mark all ? files as svn:ignore |
USB_drives_need_no_sleep.py |
Keep USB drives awake (prevent spin-down on ZFS server) |
loopaesmount.py |
Mount loopback AES-encrypted containers |
pulseaudio_record.sh |
Record PulseAudio output to OGG |
sync_music_to_android_with_m3u_for_folder_symlinks.sh |
Sync music to Android with .m3u playlist files |
mergefs_show_realpath.sh |
Show mergerfs real path for files |
pdfCountPages.sh |
Sum page counts of PDF files |
yq_outliers.sh |
Flatten YAML to dot-notation for grepping |
x16.py |
GDB helper: dump 16-column memory (vs default 8) |
unchroot.pl |
Break out of a chroot jail (security testing) |
- Most scripts: bash, standard POSIX tools
- Python scripts: Python 3, various modules (see docstrings)
- Video scripts:
ffmpeg/ffprobe,mkvmerge,x264/x265, VAAPI or NVENC drivers isolate.sh:firejail,ip,getentdockerme.sh: Dockerpi.isolated.sh: A locally running LLM endpoint (llama.cpp, vLLM, etc.)cclog.sh: Docker imagecclog(build fromlocalAI/)