Serve a website from TXT records.
CNAME or ALIAS your root hostname to point to serv.from.zone.
Then you can add html hostnames containing HTML, which will be served.
example.com. 3600 IN CNAME serv.from.zone.
html.example.com. 3600 IN TXT "<p>Hello world!</p>"
JS and CSS urls can be dropped in to the TXT record and they will be included in the <head> element.
https://cdn.jsdelivr.net/npm/water.css@2/out/dark.css
It's possible to supply raw HTML, assuming your DNS provider allows suspicious input:
<script type=module src=https://cdn.jsdelivr.net/npm/@shoelace-style/[email protected]/dist/shoelace-autoloader.js></script>But if your DNS provider doesn't allow suspicous input, then you can remove the arrows and it will get reconstructed:
script type=module src=https://cdn.jsdelivr.net/npm/@shoelace-style/[email protected]/dist/shoelace-autoloader.js
meta name=theme-color content=#4285f4
Everything that's not detected as a <head> element gets added as the body.
You can make your input less suspicious by base64 encoding it.
echo "<p>Let's run a script in the body\!</p><script>alert('I cannot be stopped\!')</script>" | base64 --wrap=0
PHA+TGV0J3MgcnVuIGEgc2NyaXB0IGluIHRoZSBib2R5ITwvcD48c2NyaXB0PmFsZXJ0KCdJIGNhbm5vdCBiZSBzdG9wcGVkIScpPC9zY3JpcHQ+Cg==
Base64 encoding may also help with unexpected quoting (", ') problems.
You may want to split up your body HTML into multiple TXT records. You can specify the order TXT records should appear in using an integer prefix.
1=<h1>First</h1>
2=<h2>Second</h2>
Base64 decoding happens prior to ordering, so if you use base64, be sure to include the i= prefix in the encoded string.
- It's kinda neat.
- It's free hosting.
- No signup, login, or personal data required.
- You can get a simple website running from the comfort of your domain registrar's admin panel.
- Reduce the need for dedicated machines by serving many sites from 1 generalized server.
serv.from.zone is dogfooded!
dig +short TXT html.serv.from.zone