I build automation and full-stack tools for real operations, and I ship them tested, documented, and CI-green — not as demos.
IT Manager with an AS & BS in Computer Science (Full Sail). I blend hands-on engineering with leadership: pricing and vendor data, message and photo archives, video and market-data pipelines, Android apps, and the homelab they all run on.
- 💼 IT Manager passionate about technology, infrastructure, and people — and about removing the manual work in between.
- 🎓 AS & BS in Computer Science, with weight in Mobile Application Development.
- 🛠️ Builds automation and full-stack tools for real operations: pricing and vendor data, message and photo archives, video and market-data pipelines.
- 🧪 Ships tested, documented tools with CI. The numbers in Featured Projects below are from the repos themselves, not marketing copy.
- 🏠 Runs a homelab stack (Unraid, Docker) for media, backups, and automation, plus functional 3D printing on a Bambu Lab P1S.
- 📍 Fredericksburg / Spotsylvania, Virginia. See the work live at justinlyons.dev.
Leadership, in one line: Agile delivery, team building, project management, and mentorship — the work above is what that looks like in practice.
| Project | What it does | Proof |
|---|---|---|
| repo-sync | Dozens of repos on GitHub, dozens of folders on disk — tells you which is which, with metadata reports and Markdown export. | Python, GitHub API · 132 tests |
| sms-toolkit | Your backup app copies everything, every day. This keeps only what's new — deduplicated SMS/MMS archives in a chat-style viewer. | 1,146,266 items processed, 99.78% duplicates dropped · 184/184 tests |
| gas-auditor | Google hides some of your scripts from Drive. This finds them anyway — inventory and audit for Google Apps Script projects. | Python, Flask, Google APIs · CLI + dashboard + Apps Script app |
| google_maps_poi | Drop a marker, add a photo and category, search, edit, get directions. A POI is a real database row, not EXIF hidden in a JPEG. | Kotlin, Compose, Room, Maps SDK |
| video-optimizer-suite | HEVC video-library optimizer: scan, convert, verify, then replace — only if verified. DVD and camcorder ingest included. | Python, ffmpeg/x265, SQLite, Flask dashboard |
| voxel-portfolio | A portfolio you walk through: a voxel world in the browser, with real projects to open. | TypeScript, Svelte 5, Three.js |
More, in the same spirit: photo-stitcher (FastFoto scan wizard, with a real demo GIF in the repo), gsa-vendor-toolkit (GSA vendor price-list pipeline), and kalshi-recorder (Kalshi order-book recorder to Parquet). Full list on justinlyons.dev.
As of Nov 03, 2026: 85 public repos counted (2 forks excluded) · 9,630,117 bytes of code across 17 languages. Shares below are share of code by bytes — not share of repos.
▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▃▂█▄▅▆▇▆▆▁▁
Oct 05 - Nov 03, 2026 · 246 public events · busiest day Oct 26 (46)
Python ██████████ 51.4% 4,952,614 bytes · 44 repos
JavaScript ██████ 27.5% 2,649,528 bytes · 22 repos
Kotlin █ 5.8% 554,218 bytes · 14 repos
HTML █ 5.6% 535,872 bytes · 30 repos
PowerShell █ 2.4% 230,632 bytes · 4 repos
CSS █ 1.7% 163,618 bytes · 21 repos
Swift █ 1.6% 157,555 bytes · 5 repos
TypeScript █ 1.3% 128,206 bytes · 3 repos
C# █ 1.3% 124,239 bytes · 3 repos
C++ █ 0.5% 51,111 bytes · 2 repos
Other █ 0.9% 82,524 bytes · 11 repos
Stats are refreshed by automation (see “About this repository” below). The Oct 29, 2026 clone audit (code files only, 5,475,378 bytes / 150,017 lines) cross-checked exact for 3 of 5 sampled repos, within 9% for jpl-dev (generated CSS) and 2% for voxel-portfolio; method and the Oct 31 live-API note are in docs/REVIEW.md.
Beyond code, I maintain a home server environment running Unraid and Docker for media, backups, and automation. I'm also heavily involved in functional 3D printing using a Bambu Lab P1S to design parametric models and custom organizers — see openscad-toolkit for the calibration prints and the sliding-lid box that actually fits.
- 📦 Pushed to
enonymous1/floorplan-studioonmain— Nov 01, 2026 - 📦 Pushed to
enonymous1/face-stretch-playgroundonmain— Nov 01, 2026 - 📦 Pushed to
enonymous1/pdf-toolkitonmain— Nov 01, 2026 - 📦 Pushed to
enonymous1/tech6-cv-generatoronmain— Nov 01, 2026 - 📦 Pushed to
enonymous1/jpl-devonmain— Nov 01, 2026
This section is for maintainers of the repo. Everything above it is the profile page itself; everything here is how that page is built and kept up to date.
This is a GitHub special repository: a repo named enonymous1 whose
README.md on main renders as the profile page at
https://github.com/enonymous1. The README is the product.
Separation of concerns, stated plainly because getting it wrong caused
real bugs: profileforge is the updater, this repo houses the
content. profileforge (separate repo, enonymous1/profileforge)
runs its Refresh workflow daily at 04:17 UTC, syncs both generated
sections — Recent Activity and “This month in code” — into their
<!--START_SECTION:…--> markers, and commits as
github-actions[bot] with [skip ci]. This repo deliberately
contains no updater script and no workflow: an earlier in-repo
activity updater ran on a different schedule with a different output
format (“Pushed 0 commits” vs profileforge's “Pushed to”), and the
two writers kept overwriting each other. It was deleted, not fixed,
for exactly that reason. Do not re-add an updater here; fix the
updater in profileforge instead.
The animated header at the top, header.gif, is a content asset, so
its generator does live here: see scripts/build_header.py. The
stats and activity sections are profileforge-owned — do not hand-edit
inside their markers, or the next refresh run will overwrite your
edit.
- A GitHub account, and
giton your machine, for cloning and pushing. - Python 3.10 or newer, only if you want to regenerate the header GIF locally. The header generator uses the standard library plus Pillow. There is no other code in this repo to install or run.
- No token is required to read this repo. Updating the generated
sections is profileforge's job and uses its own
PROFILE_PATsecret in the profileforge repo, not anything in this repo.
git clone https://github.com/enonymous1/enonymous1.git
cd enonymous1That is the whole install. There is no build step, no package, and no
server. If you only want to edit the profile text, edit README.md
directly; if you want to change what the automations write, change
profileforge, not this repo.
Edit profile text in README.md and preview it in a Markdown viewer
or on a branch. Regenerate the animated header after any change to
its design:
python scripts/build_header.pyThat writes header.gif in the repo root. Commit the GIF, not just
the script: GitHub renders the committed file, and the script alone
does not reproduce it on the profile page.
To preview an updater change, run profileforge locally against a
copy (see the profileforge README for its exact flags — the
--dry-run previews exist for exactly this), never by adding a
workflow to this repo. To check what the refresh last did, look at
the profileforge repo's Actions runs and at the chore: refresh profile data [skip ci] commits here, which land shortly after
04:17 UTC when the daily run succeeds.
Deployment is a push to main. There is no separate hosting step:
GitHub renders the profile from main within minutes of the push.
git add README.md header.gif
git commit -m "docs: describe the change"
git pushIf the push is rejected as non-fast-forward, the refresh moved first
(a daily profileforge commit). Do not force-push: git fetch origin,
then git pull --rebase origin main and resolve in favour of the
refresh's newer generated lines, or rebuild your change on top of
the fresh remote README.
Verify after pushing: open https://github.com/enonymous1 and confirm
the header animates, the stats section shows the latest snapshot, and
the activity lines look sane. Generated sections refresh on
profileforge's daily schedule, not on push — if activity looks stale,
check profileforge's Actions or dispatch its Refresh workflow there.
Rollback is a normal revert: git revert <commit> and push again —
nothing here is destructive, because every generated section can be
regenerated by the next refresh run.
"Code is like humor. When you have to explain it, it's bad."
— Cory House


