DEV Community

Cover image for NFSFU234 Open Source Day: Three Tools, One Scope
Nyuiring-yoh R. Shifu-Nfor for NFORSHIFU234 Dev

Posted on Originally published at nforshifu234dev.com

NFSFU234 Open Source Day: Three Tools, One Scope

Today's NFSFU234 Open Source Day — the first one we've run. FormValidation and TourGuide, previously two separate unscoped npm packages built years apart, are moving under the @nfsfu234 scope. ShotSweep, a new CLI for visual regression testing, launches scoped from day one. For the first time, all three live under one namespace.

Here's what's actually in each release.

ShotSweep — new, v1.0.0

A CLI that captures screenshots of a site and diffs them between runs. A build can pass, every test can pass, a page can return 200 — and still look broken visually. This closes that gap.

npm install -g @nfsfu234/shotsweep

shotsweep capture --sitemap https://example.com/sitemap.xml --viewport 1440x900 --dark
shotsweep diff before/manifest.json after/manifest.json
Enter fullscreen mode Exit fullscreen mode
  • Full sitemap capture, including sitemap indexes
  • Full-page or sectioned screenshots, multiple viewports, light/dark emulation per run
  • Auth support: form login with saved sessions, bearer tokens, custom headers, cookies
  • --replace-origin to point a production sitemap at localhost/staging without maintaining a second URL list
  • Deterministic pixel diffing (shotsweep diff) with configurable thresholds, non-zero exit on a real regression — built to gate CI
  • --resume, --concurrency, --retries for large sites; --describe for an AI-ready run summary (the diff decision itself stays fully deterministic)

We ran it against our own docs site before shipping: 28 routes, light and dark mode, 136 manifest entries per run, 0 capture errors on either run.

Docs: https://shotsweep.nforshifu234dev.com
Repo: https://github.com/nforshifu234dev/shotsweep

TourGuide v2

npm install @nfsfu234/tour-guide
Enter fullscreen mode Exit fullscreen mode
  • defineConfig() + <TourProvider> for shared config across multiple tours instead of repeating props per instance
  • Real accessibility pass: focus trapping, keyboard nav, ARIA roles, screen-reader announcements
  • First real automated test suite (Vitest)
  • Tooltip positioning fixes near viewport edges; highlight cleanup now correctly restores a target element's original inline styles after a tour ends

⚠️ Breaking: package renamed from nfsfu234-tour-guide to @nfsfu234/tour-guide.

Docs: https://tourguide.nforshifu234dev.com
Repo: https://github.com/nforshifu234dev/nfsfu234-tour-guide

FormValidation v3

npm install @nfsfu234/form-validation
Enter fullscreen mode Exit fullscreen mode

The largest release in this library's history:

  • .submit(), .validate(), and .validateInput() are now consistently async
  • File/image upload validation (type, size, dimensions)
  • configureForms() / autoInit() for site-wide validation rules across multiple forms from one config
  • Real Jest test suite, CI-gated releases

The change worth calling out on its own: we removed client-side password hashing (.hashPassword(), .verifyPassword(), .passwordMatch(), and the bcryptjs dependency) entirely. It never protected a password in transit — that's what TLS and your backend are for — so it was providing the appearance of security without the substance. Not a bugfix. A feature we decided shouldn't have existed.

Docs: https://formvalidation.nforshifu234dev.com
Repo: https://github.com/nforshifu234dev/nfsfu234-form-validation

Why one scope matters more than any single feature here

These three tools were built at different points over several years as separate, unrelated packages. Getting them under one @nfsfu234 namespace isn't a technical achievement so much as a bookkeeping one — but it's the thing that turns "three tools I happened to build" into "an ecosystem," and that distinction is doing real work for how we plan what comes next.

All three are MIT licensed and open for issues/PRs starting today. If you try one and something's broken, that's useful — open an issue.

Top comments (0)