Node scripts that build a content site and a city directory out of JSON files
This is the code that runs blackfoxvr.com, packaged so you can run it on your own domain. About a thousand lines of Node (ES modules, one npm dependency) plus two small PHP files: you feed it JSON, it writes plain HTML, a sitemap, an Atom feed and a social image. No CMS, no database, no build framework, no admin panel.
What it actually is
A set of command line scripts, not a product with a UI. You run node tools/new-article.mjs article.json and a finished HTML page appears, linked from the homepage, listed in the sitemap and the feed, with its own OG image. You edit the template by editing a JavaScript file. That is the whole model.
- One command publishes an article. Page HTML with OG tags, JSON-LD (Article, BreadcrumbList, FAQPage), a table of contents with anchor links, an FAQ section, an analytics beacon. Plus the card on the homepage, the sitemap entry, the feed entry and the OG image.
- One JSON array builds a directory section. A hub page and one page per city, with cards, phone and site buttons, ItemList JSON-LD, and a per record status so unverified entries are labelled as unverified instead of quietly pretending to be facts.
- A validator you run before deploying. It walks every page on the site and fails on a missing canonical, missing OG tags, a stale CSS version query, an OG image referenced but absent from disk, or an article missing from the sitemap, the feed or the homepage.
- Two PHP extras. Telegram autoposting on cron, and cookieless traffic stats. Optional, the site publishes fine without them.
Output is static files. Any shared host with Apache works, and the included .htaccess handles canonical redirects, cache policy and security headers.
What each script does
| File | Size | Job |
|---|---|---|
new-article.mjs | 85 lines | Reads an article JSON, writes the page, inserts the homepage card, then triggers the OG, sitemap and feed generators. --check runs the whole site validator. |
build-article.mjs | 102 lines | The page template itself, as a template literal. This is where you change markup, class names and wording. |
build-clubs.mjs | 222 lines | The directory generator: city map, card rendering, hub page, structured data, source and status fields per record. |
og-generate.mjs | 93 lines | 1200x630 social images. Composes an SVG (gradient background, brand mark, tag line, title wrapped and auto shrunk to fit) and rasterizes it with resvg. |
build-sitemap.mjsbuild-feed.mjs | 33 + 47 | Sitemap and Atom feed built from the files actually on disk and the JSON-LD inside them, so they cannot drift from reality. |
check-clubs-links.mjs | 33 lines | Requests every external link in the directory and prints the dead ones. |
site-lib.mjs | 90 lines | Shared helpers: slugify with a transliteration table, the OG block, the three JSON-LD builders, page read and write. |
lib/tg-post.php | PHP, cron | Posts to a Telegram channel. A queue of .txt files published in name order and moved to a sent folder. When the queue empties it rotates evergreen articles in a loop from a state file, so the channel never goes silent. At two posts remaining it emails you once a day. |
lib/stats.php + t.php | PHP | Page views and funnel events. Uniques are stored as sha1(date + IP + user agent), which rotates daily and cannot be turned back into an IP. One JSON file per day, obvious bots filtered, private dashboard behind a key. |
Who it is for, and who should not buy it
Buy it if:
- You are comfortable running
node script.mjsand editing a JavaScript template literal. - You want a niche content site, a local directory, or both on the same domain.
- You would rather own seven small files than maintain a CMS, its plugins and its update treadmill.
- You host on a cheap shared plan and want pages that need no cache layer, because there is nothing dynamic to cache.
Do not buy it if:
- You want a drag and drop admin panel or a WYSIWYG editor. There is none, and adding one is not on any roadmap.
- You have non technical authors who need to publish without you.
- You need comments, user accounts, site search, ecommerce, memberships or a theme marketplace.
- You expect it to write content. It does not generate a single sentence. You bring the JSON.
- You have never run a script from a terminal. It will be a frustrating evening. Skip it.
What is in the zip, and what you will have to edit
Included:
- The
tools/folder: all generators and the shared library, unminified and commented. lib/tg-post.phpwith a sample config,lib/stats.php,t.php, and the stats dashboard page.- The full working site as an example: stylesheet, homepage, about page, 21 article pages, a 17 page directory, an interactive quiz page in vanilla JS. Delete the content, keep the skeleton.
- The sample directory dataset (53 records), so you can see the intended shape before writing your own.
.htaccesswith the canonical redirect, cache rules and security headers.- A README in English: the article JSON schema, the publish flow, the cron line, the deploy checklist.
Honest list of what you will hit in the first hour:
- Templates and sample content are in Ukrainian. Nav labels, the contents heading, the FAQ heading and the call to action strings live inside
build-article.mjsandbuild-clubs.mjs. You translate them once, then never again. - The slug helper transliterates Cyrillic. Latin text passes through untouched, but the table is there, and it is fifteen lines if you want to replace it.
- og-generate.mjs points at Windows font paths in its first ten lines. On macOS or Linux, change two strings to your own TTF files.
- There is no config file. Site origin and paths are constants at the top of
site-lib.mjs. Design lives in the templates and one stylesheet, not in a theme system. - Requirements: Node 20.11 or newer (the scripts use
import.meta.dirname) and one npm package for image rendering. PHP 8 and cron only if you want the Telegram poster and the stats. - Page weight is roughly 17 to 20 KB of HTML including inline JSON-LD. Small, not microscopic. Anyone advertising 2 KB pages with structured data is rounding creatively.
Live proof: the site you are reading
blackfoxvr.com is not a demo build. It is the production site, running this exact code, and every number below comes from it.
- 21 articles, each with structured data, a generated table of contents and an FAQ block.
- A venue directory: 53 records across 17 city pages, generated from a single JSON file. 36 records verified against a live source, 17 marked unverified on the page, because that is what the data supports.
- An OG image for every page, an Atom feed and a sitemap, all regenerated automatically on publish.
- Time to first byte around 0.3 seconds from an ordinary shared host, with no cache plugin and no CDN.
- A+ on security headers, produced by the included
.htaccessand nothing else. - A Telegram channel that has posted three times a week on cron since July 2026 without anyone opening a terminal.
What this is not proof of: traffic. The site launched in July 2026 and its search numbers are still small. Buy the engine because the publishing workflow saves you an hour per article, not because someone showed you a graph.
Price, license, support
- $39, once. No subscription, no license key, no phone home, no seat count.
- License: use it on as many sites as you own or build for clients. Do not resell the scripts themselves as a product.
- Updates: you get the files as they exist today. If I improve something meaningful, buyers get an email with the new zip. I am not promising a roadmap I might not keep.
- Support: email admin@blackfoxvr.com. One person, usually a reply within a day or two. I will help you get the scripts running. I will not build your site for you at this price.
- Refund: within 14 days, ask and you get it back. If the scripts do not run on your machine and I cannot fix that, the refund is the right outcome and I would rather hear about the bug.
One zip: the Node generators, the PHP cron and stats scripts, the full example site, the .htaccess and an English README. Instant download, full source, no subscription. Refund within 14 days if it does not work for you.
Get the engine, $39