The object
A personal field website that can be written, rebuilt and published from an Android phone without a conventional web server.
Not a simulated low-tech website. An actually small one.
Requirements
- Source must remain ordinary files.
- The public site must be static.
- No database or CMS.
- No external web fonts.
- No trackers, advertising or cookie machinery.
- Publishing must work from Termux.
- Photographs must have a deliberately lightweight display path.
- The archive must be able to grow for years without redesigning its foundations.
Tools
Android phone
Termux
Hugo
Git
GitHub
Cloudflare Workers
Wrangler
Nano
ImageMagick
No laptop was required for the commissioning sequence.
Method
01 — Establish the working directory
The downloaded project was unzipped in Android Downloads and then moved into Termux home:
~/tyson-field-internet
The repository stays there. Shared Android storage is used as an inlet for downloads and photographs, not as the working filesystem.
02 — Build locally
Hugo was run locally before any public deployment. This catches template and content errors while the consequences are still limited to one phone.
03 — Put the workshop under Git
The repository was initialised, the main branch established and the first source revision committed.
This step matters when Hugo Git metadata is enabled: a Git repository with no commits is not yet useful historical data.
04 — Push to GitHub
The local repository was connected to its GitHub remote and pushed over HTTPS with a narrowly scoped personal access token. The token requires repository contents read/write permission; it does not need broad account authority.
05 — Let Cloudflare build it
The GitHub repository is connected to a Cloudflare Worker build.
HUGO_VERSION 0.164.0
BUILD COMMAND hugo --minify
DEPLOY COMMAND npx wrangler deploy
ASSET DIRECTORY ./public
wrangler.jsonc declares the generated Hugo directory as Worker Static Assets.
06 — Verify from the outside
A successful deployment is not the same thing as a successfully reached website. The public hostname was therefore tested separately.
When the browser returned DNS_PROBE_FINISHED_NXDOMAIN, direct queries to both Google DNS and Cloudflare DNS resolved the hostname correctly. The system DNS path on the phone was the fault. Once corrected, curl returned:
HTTP/2 200
server: cloudflare
cf-cache-status: HIT
The build had been fine all along.
What went wrong
Four small failures occurred during commissioning:
- Hugo requested Git information before the first commit existed.
- Git still pointed at a placeholder GitHub remote.
- The first GitHub credential lacked write access.
- The phone’s normal DNS resolver failed while public resolvers worked.
None required changing the architecture.
That is a useful sign.
Cost
At launch, the publication itself requires no paid server. Domain registration is separate. The more important saving is operational: there is no machine to patch, database to maintain or application runtime to keep healthy.
Result
The final publication route is:
WRITE → BUILD → COMMIT → PUSH → CLOUDFLARE → STATIC FILES
The website is now deliberately uneventful infrastructure. That leaves more time for the things it exists to record.
Would I do it differently?
Yes. Initialise and commit Git before the first Hugo build, configure the final GitHub remote before attempting a push, and test DNS independently the moment a deployed workers.dev hostname behaves strangely.
Everything else stays.