diff --git a/.gitignore b/.gitignore
index 6027c84..ae118c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,24 @@
*.gz
*.pdf
dat/download.md
+dat/fu/changes.log
+dat/fu/changes.md
+dat/fu/man.md
+dat/fu/man.pod
+dat/fu/man/log.md
+dat/fu/man/log.pod
+dat/fu/man/mfd.md
+dat/fu/man/mfd.pod
+dat/fu/man/pg.md
+dat/fu/man/pg.pod
+dat/fu/man/sql.md
+dat/fu/man/sql.pod
+dat/fu/man/util.md
+dat/fu/man/util.pod
+dat/fu/man/validate.md
+dat/fu/man/validate.pod
+dat/fu/man/xmlwriter.md
+dat/fu/man/xmlwriter.pod
dat/globster/api.md
dat/globster/api.pod
dat/globster/ctl.md
@@ -145,6 +163,17 @@ pub/dump/grenamr.html
pub/dump/insbench.html
pub/dump/nccolour.html
pub/feed.atom
+pub/fu.html
+pub/fu/changes.html
+pub/fu/feed.atom
+pub/fu/man.html
+pub/fu/man/log.html
+pub/fu/man/mfd.html
+pub/fu/man/pg.html
+pub/fu/man/sql.html
+pub/fu/man/util.html
+pub/fu/man/validate.html
+pub/fu/man/xmlwriter.html
pub/globster.html
pub/globster/api.html
pub/globster/ctl.html
diff --git a/Makefile b/Makefile
index c817d92..5c9e9a4 100644
--- a/Makefile
+++ b/Makefile
@@ -35,6 +35,16 @@ PAGES=\
"dump/grenamr.md"\
"dump/insbench.md"\
"dump/nccolour.md"\
+ "fu.md"\
+ "fu/changes.log https://g.blicky.net/fu.git/plain/ChangeLog FU Release History"\
+ "fu/man.pod https://g.blicky.net/fu.git/plain/FU.pm FU"\
+ "fu/man/log.pod https://g.blicky.net/fu.git/plain/FU/Log.pm FU::Log"\
+ "fu/man/mfd.pod https://g.blicky.net/fu.git/plain/FU/MultipartFormData.pm FU::MultipartFormData"\
+ "fu/man/pg.pod https://g.blicky.net/fu.git/plain/FU/Pg.pm FU::Pg"\
+ "fu/man/sql.pod https://g.blicky.net/fu.git/plain/FU/SQL.pm FU::SQL"\
+ "fu/man/util.pod https://g.blicky.net/fu.git/plain/FU/Util.pm FU::Util"\
+ "fu/man/validate.pod https://g.blicky.net/fu.git/plain/FU/Validate.pm FU::Validate"\
+ "fu/man/xmlwriter.pod https://g.blicky.net/fu.git/plain/FU/XMLWriter.pm FU::XMLWriter"\
"guestbook.md"\
"guestbook/thanks.md"\
"globster.md"\
@@ -96,8 +106,8 @@ PAGES=\
"nginx-confgen/man/1_1.pod https://g.blicky.net/nginx-confgen.git/plain/nginx-confgen.pod?h=1.1 nginx-confgen 1.1 Manual"\
"nginx-confgen/man/1_0.pod https://g.blicky.net/nginx-confgen.git/plain/nginx-confgen.pod?h=1.0 nginx-confgen 1.0 Manual"\
"sqlbin.md"\
- "tuwf.md"\
"sqlbin/manual.md https://g.blicky.net/sqlbin.git/plain/manual.md"\
+ "tuwf.md"\
"tuwf/changes.log https://g.blicky.net/tuwf.git/plain/ChangeLog TUWF Release History"\
"tuwf/man.pod https://g.blicky.net/tuwf.git/plain/lib/TUWF.pod TUWF Documentation"\
"tuwf/man/db.pod https://g.blicky.net/tuwf.git/plain/lib/TUWF/DB.pod TUWF::DB Documentation"\
@@ -125,6 +135,7 @@ FEEDS=\
pub/ncdu/feed.atom\
pub/nginx-confgen/feed.atom\
pub/tuwf/feed.atom\
+ pub/fu/feed.atom\
pub/yxml/feed.atom\
pub/torreas/feed.atom
@@ -205,6 +216,7 @@ ${HTML_OUT}: pub/%.html: dat/%.md template.html Makefile
--metadata path3=$$(echo "$*" | sed 's/\//-/g') \
--variable menu-$$(case "$*" in\
globster*) echo "globster";;\
+ fu*) echo "fu";;\
ncdc*) echo "ncdc";;\
ncdu*) echo "ncdu";;\
nginx-confgen*) echo "nginx-confgen";;\
diff --git a/dat/fu.md b/dat/fu.md
new file mode 100644
index 0000000..7f0c987
--- /dev/null
+++ b/dat/fu.md
@@ -0,0 +1,55 @@
+% FU: Framework Ultimatum
+
+FU is the Perl backend web framework developed for
+[VNDB.org](https://vndb.org/) and [Manned.org](https://manned.org/). It is the
+successor of [TUWF](/tuwf).
+
+## Main features
+
+- Simple, conventional and synchronous architecture.
+- Powerful debugging facilities.
+- Includes a minimal HTTP server for local development and a more efficient
+ FastCGI server for production environments.
+- High-performance output compression through
+ [libdeflate](https://github.com/ebiggers/libdeflate),
+ [zlib-ng](https://github.com/zlib-ng/zlib-ng) and/or
+ [brotli](https://brotli.org/), whichever is available.
+- Includes a process supervisor with file change detection and zero-downtime
+ reloads.
+- Includes a [concise yet powerful schema-based input validation
+ module](/fu/man/validate).
+- Includes a small but high-performance JSON encoder and decoder.
+- Includes high-performance [HTML and XML generation
+ functions](/fu/man/xmlwriter).
+- Includes a custom [PostgreSQL client module](/fu/man/pg) with a high-level
+ API and flexible type configuration.
+- Includes a simple and safe [SQL query builder](/fu/man/sql).
+- Built on stable foundations, will keep working for decades.
+- It's FLOSS.
+
+## Main downsides
+
+- Simple, conventional and synchronous architecture.
+- Requires a recent version of Perl (5.36+).
+- Requires a C compiler and Perl development environment to build & install.
+- Will not work on Windows. Is that even a downside?
+- Does not work on 32-bit systems.
+- Doesn't have a fancy marketing page
+- Introductory documentation is lacking
+- "Suffers" from a healthy dose of [NIH](https://en.wikipedia.org/wiki/Not_invented_here).
+
+Check the [description](/fu/man#description) in the documentation for more
+information and details.
+
+## Download
+
+Latest version
+: 0.4 (2025-03-19 - [FU-0.4.tar.gz](/download/FU-0.4.tar.gz) \-
+ [CPAN mirror](https://metacpan.org/release/FU))
+
+Development version
+: Available on git at
+ [https://code.blicky.net/yorhel/fu](https://code.blicky.net/yorhel/fu).
+
+License
+: MIT.
diff --git a/dat/guestbook.md b/dat/guestbook.md
index c0f0e1f..cc27677 100644
--- a/dat/guestbook.md
+++ b/dat/guestbook.md
@@ -17,6 +17,16 @@ respective issue tracker or send a mail to
# Entries
+`2025-03-14` - ~
+: I don't know what to write here exactly, but I think saying thanks is due
+ for you having created VNDB. I really like how VNDB is and there is
+ something really soothing about browsing it for hours. Thanks very much for
+ that. Also I just found out the backend is free software, so that's cool
+ as well.
+
+`2025-03-07` - ~
+: I have used ncdu, ncdc, yxml and browsed vndb all before realising they were made by the same person! Thank you!
+
`2025-02-16` - ~
: ncdu is a great app. Keep up the great efforts! Respect from Canada! - Adeel Khan at Awake and Shangrila-VHP
diff --git a/dat/tuwf.md b/dat/tuwf.md
index 580ef84..ded75fb 100644
--- a/dat/tuwf.md
+++ b/dat/tuwf.md
@@ -29,12 +29,10 @@ information and details.
TUWF is also available on a git repository at
[https://code.blicky.net/yorhel/tuwf](https://code.blicky.net/yorhel/tuwf).
-## Websites using TUWF
-
-(Not a whole lot)
+## Websites that use(d) TUWF
- [VNDB.org](https://vndb.org/) (the site that spawned TUWF - [open source](https://g.blicky.net/vndb.git/))
- [Manned.org](https://manned.org/) ([open source](https://g.blicky.net/manned.git/))
- [Blicky.net Pastebin](https://p.blicky.net/) ([open source](https://g.blicky.net/bpaste.git/tree/index.cgi))
-- The website embedded in the [D&R Axum](http://www.d-r.nl/axum.html) mixing console.
-- [333networks](http://333networks.com/)
+- The website embedded in the [D&R Axum](https://www.dnrbroadcast.com/axum) mixing console.
+- [333networks](https://333networks.com/)
diff --git a/manproc.pl b/manproc.pl
index 93e50cc..7d5cb96 100755
--- a/manproc.pl
+++ b/manproc.pl
@@ -26,6 +26,14 @@ sub pod2url($page, $sect='') {
'TUWF::Response' => '/tuwf/man/response',
'TUWF::XML' => '/tuwf/man/xml',
'TUWF::Validate' => '/tuwf/man/validate',
+ 'FU' => '/fu/man',
+ 'FU::Log' => '/fu/man/log',
+ 'FU::MultipartFormData' => '/fu/man/mfd',
+ 'FU::Pg' => '/fu/man/pg',
+ 'FU::SQL' => '/fu/man/sql',
+ 'FU::Util' => '/fu/man/util',
+ 'FU::Validate' => '/fu/man/validate',
+ 'FU::XMLWriter' => '/fu/man/xmlwriter',
'' => '',
}->{$page||''} // "https://metacpan.org/pod/$page";
$lnk .= '#'.(lc $sect =~ s/\s+/-/gsr) if $sect;
diff --git a/mkchangelog.pl b/mkchangelog.pl
index c90858f..b0ad99c 100755
--- a/mkchangelog.pl
+++ b/mkchangelog.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl
($project) = (shift =~ /^([^ \/]+)/);
-$project = uc $project if $project eq 'tuwf';
+$project = uc $project if $project =~ /^(tuwf|fu)$/;
$title = shift;
print "---\ntitle: $title\npage-type: changelog\n...\n";
diff --git a/pub/download/FU-0.1.tar.gz.asc b/pub/download/FU-0.1.tar.gz.asc
new file mode 100644
index 0000000..77cfbc0
--- /dev/null
+++ b/pub/download/FU-0.1.tar.gz.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmgJFfcACgkQYjlMaYwn
+Ofr9Kw//c9jLCciB5HUnOb6KJsNARRxg2Abjc6TyOJewrCcD60lRYTqpOqln48ir
+7ubhOwBQ0El2zh5jyh20FMvY2y0iSeUO2JIPgElOgocmtyTpNRDrdNMcNutxqveO
+LxmXepLxnwcTi/Dqi4H/0vqLXL94mOyLlhhJ1r1cn2hsK/Cr5+UemU5gYKFT6NF2
+DJJiWp0vIttChMJEl/27SJ2QPUdri+s1dsT9nFf8YrZnafCNyO0NZcmVQ8nsoRdj
+lOxmcc5Fzy4LpiZy25mafLchD6MS7+IfaexxX9lfw10FE4sG8Ih2/dMIDvPnQYFy
+wM0GoBo1/XC4HDgfRSlOYwcwUFSkL5bd/3jTsRaUT10lt7yRLXqZ+BjlzgVhWWDM
+LFz3+w1LnSoOA9fxzBROsFaHSBW3yDURIW3tuBUmoafIrAguf5bnAJSwQbxxRH9C
+0yAWeLEZTH1EUOEe7J2Dw3ABdkbB19Ky8NuJjx0qWoRIqBPXKEyDRr1uf47t+mSp
+m0klWdtpmksW5toCMHQBcQOBfUtIMLRpXo6H62Lg2EpM2nMRVvBkO5NzyeedALUE
+hXSNX5WdDzchoBk8wNNOoyOPlG100k3kLVosu1Z/HJOBmx2dBceu7na04kM0tySF
+PlfcnyRfay8xzJBEVmHFhMxP2iIhphNt9p55mt7RKXX4wd05s7s=
+=mthf
+-----END PGP SIGNATURE-----
diff --git a/pub/download/FU-0.1.tar.gz.md5 b/pub/download/FU-0.1.tar.gz.md5
new file mode 100644
index 0000000..489e5aa
--- /dev/null
+++ b/pub/download/FU-0.1.tar.gz.md5
@@ -0,0 +1 @@
+f30b5ef614290ae2847051682575e48e FU-0.1.tar.gz
diff --git a/pub/download/FU-0.1.tar.gz.sha1 b/pub/download/FU-0.1.tar.gz.sha1
new file mode 100644
index 0000000..4ccfc52
--- /dev/null
+++ b/pub/download/FU-0.1.tar.gz.sha1
@@ -0,0 +1 @@
+603c0bf9e2c008cfdf6274a0cc43f36c7dd210f6 FU-0.1.tar.gz
diff --git a/pub/download/FU-0.1.tar.gz.sha256 b/pub/download/FU-0.1.tar.gz.sha256
new file mode 100644
index 0000000..74f56f0
--- /dev/null
+++ b/pub/download/FU-0.1.tar.gz.sha256
@@ -0,0 +1 @@
+c146eb45d2489319aade2f52105c04dec11c98cfc4e0902e1ff1a8731530e296 FU-0.1.tar.gz
diff --git a/pub/download/FU-0.2.tar.gz.asc b/pub/download/FU-0.2.tar.gz.asc
new file mode 100644
index 0000000..9721cbb
--- /dev/null
+++ b/pub/download/FU-0.2.tar.gz.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmgJFfoACgkQYjlMaYwn
+OfqbJxAA9RTDZnN9nbH0faQxgAAEjnj9s2G4XNfL91l6YD9VCgiTrzNR7np5upLR
+ratv5J9+PP/yMeS0xGBS9aoXWWCBmXDUrlqy3ooX9o+OEnqtEi+sWdo7nJKbuju4
+BTSE/4vejsUHJ1XHTtnqevRHhDRbcIlU5gX1D+lkC4pzvi/AHKRsLM+7AV1CrfX1
+d/VoEsqcvz6vyzJvvUivS7hxX/aUkYHy3WiZ29AwLJETSx58//nTARD8JybCuQEv
+E6BSHAxIxYNY+XHFXHONjw7yX+DOFnrxl/MFSQB/gumIPT53nG9J6PNlAdS8F+jH
+FPntf5cQW5z++6n9dLUnvi8/eoeyNPUv3bqhrrSI/TJRrsUNLSSjH3frNHfT7cqM
+WlaUCK3OtBOliJcR0lvUImKfdXL/yeUzhS2fdQsSG56RPdVfEgHWllvSYs6VEKtB
+V59IF8DrKd7wmzUSU4zZlanvEaiS/vVcu4UitQj9RHNQ5ziMwGpX0SPFause0sWh
+tJ9d299i0WVpJrngxIIRabZWSGHvgMc8oecNfvFLUQwiwwV5iSgAKp07QxlL7nVc
+bNCaVvN2qkb8M+DSYoBoohicrc5rbkbGx83rjMg9JHEVpo9gMWmhFr8pCrv2U+zH
+QaZdvaG9LJZppKMcEgSdAgSBBCo6QaJbC60SI/g1Zj8RwmTlDfw=
+=I1dP
+-----END PGP SIGNATURE-----
diff --git a/pub/download/FU-0.2.tar.gz.md5 b/pub/download/FU-0.2.tar.gz.md5
new file mode 100644
index 0000000..247fc51
--- /dev/null
+++ b/pub/download/FU-0.2.tar.gz.md5
@@ -0,0 +1 @@
+bd45dc39b161ead180e71ce7a16a7898 FU-0.2.tar.gz
diff --git a/pub/download/FU-0.2.tar.gz.sha1 b/pub/download/FU-0.2.tar.gz.sha1
new file mode 100644
index 0000000..20329ae
--- /dev/null
+++ b/pub/download/FU-0.2.tar.gz.sha1
@@ -0,0 +1 @@
+83d0e235f2791a47681c35b94048368d7ec414e5 FU-0.2.tar.gz
diff --git a/pub/download/FU-0.2.tar.gz.sha256 b/pub/download/FU-0.2.tar.gz.sha256
new file mode 100644
index 0000000..c7fd7a1
--- /dev/null
+++ b/pub/download/FU-0.2.tar.gz.sha256
@@ -0,0 +1 @@
+268d20f800d66392198eaab596f9da7cfd52297e5b50b3dc6e76023141af2d43 FU-0.2.tar.gz
diff --git a/pub/download/FU-0.3.tar.gz.asc b/pub/download/FU-0.3.tar.gz.asc
new file mode 100644
index 0000000..eaaf272
--- /dev/null
+++ b/pub/download/FU-0.3.tar.gz.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmgJFfoACgkQYjlMaYwn
+OfpHsBAA5K2LDuM+kUZsAePZzemH3S3S/SvVV3Bxn6EZUR+Hq7ytjOX5WbqslW7B
+d7bNlT/RLFgd4cP/ltZqzvrZTwW/tX4+lb/u5lStVeQOz8udxpijusCjcTA8hFzt
+I6aBNBgG2YHnj7h04sVVHm+ylVwqZa5I2BvYPhyTXTNKcushhEjxRco9573RMFj4
+fdUMHFFSPmFfRPfmXhtN4Z1BLC88Y/qCFozSD3I7EprRwBc+1xKOiRIQ1n4kzF5R
+zIYQtq7N6aI3MEJ2CdJtppSu3MvchqQbZKZ0OeqqmggH1YRAqtuYTyN8NIHdhriM
+4uXIqVeDD6dYGvWANSfngk1urE1qN3Mw2lP/TC8tByvkuQ+mky/rjXeXEaO5VDRl
+XmJhcBowMuUfkxXdgIQ0rX+4n/DYRZwZ5vZL6Yum1FbtTOf0EIXKA/jqtW8zPbsf
+4Tb6SpSuVY+1CQRX18Y6RXMufUuuBd8udkAXoOEJDco+hAdBEN22eH5H6ZU6myBh
+Plhl9D5oAtMiz0HGl6F3JaaO0Zxkzu+q3Ft9w7/GVN3nsM537xFiTnT57KgFoaHx
+iUO/QSEr7nuSSG63+xIHje581o3Mim5lrOSmrb1pJXT6Se1800q15ztxlQwYhADW
+x+4UcJG+KMaMsrWI/ElJ4UYR6XbAJUYEmmndwQlsSwyKETbrkAc=
+=zA8a
+-----END PGP SIGNATURE-----
diff --git a/pub/download/FU-0.3.tar.gz.md5 b/pub/download/FU-0.3.tar.gz.md5
new file mode 100644
index 0000000..7425e31
--- /dev/null
+++ b/pub/download/FU-0.3.tar.gz.md5
@@ -0,0 +1 @@
+3914221f1c7e914f989b8184b2f1e9a1 FU-0.3.tar.gz
diff --git a/pub/download/FU-0.3.tar.gz.sha1 b/pub/download/FU-0.3.tar.gz.sha1
new file mode 100644
index 0000000..bac3891
--- /dev/null
+++ b/pub/download/FU-0.3.tar.gz.sha1
@@ -0,0 +1 @@
+67c8bcdeb1e130dcded70755cfa3afcc8b6a4e62 FU-0.3.tar.gz
diff --git a/pub/download/FU-0.3.tar.gz.sha256 b/pub/download/FU-0.3.tar.gz.sha256
new file mode 100644
index 0000000..beec1c2
--- /dev/null
+++ b/pub/download/FU-0.3.tar.gz.sha256
@@ -0,0 +1 @@
+d8a034aaeb939d401603350e8e0741f3f4d636b47e7629494e956fdeb45af40a FU-0.3.tar.gz
diff --git a/pub/download/FU-0.4.tar.gz.asc b/pub/download/FU-0.4.tar.gz.asc
new file mode 100644
index 0000000..7b96aa9
--- /dev/null
+++ b/pub/download/FU-0.4.tar.gz.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEdEYNMrgIEOupr6LpYjlMaYwnOfoFAmgJFfoACgkQYjlMaYwn
+OfrZsw//T3sM9pjCYMSG9+KOFI9Y9f1oPjoElsXCzxWo+cfROj2MEAXAjzo5rYR2
+pp0Beo5SMWu1E0/Qtfosx5H+okxELckdMq7f/UuRk5Ap/+pE1hbAi217bHLDuIdB
+T/YIxExRbXEZbcmKWrSnxfXEM9B6t1iVsUrFRVZDK0YGbYGPOJqd2AXmUb7D3sTg
+d64ROToYga3U6l7K2oUGRGCCMN148OKa5rkdT8pW5vwUthuxwEs9lFmbZ5SwV8RU
+8FJANLFcZw1qqhx+v5AxxH4QL08ssGsLuPGI/smGcM6SpS1aWO8ACxYuxJBeI3J5
+tbnB8ZoY5fELJviIzYGt6d1TkLDTokTXTdcPW5vJw9x/ISc7r5uQsVi8Lv9uaBVO
+t7ellfR4H9l8lzW/mfI4CILY1RZ+OtnTfwA7wkSBQtAasJlVhamYgjB+9gsV89JO
+cRFE1oUB26PjGhztiZ+vs2Vl/08cNiWbw4YfMz/uVwwy2vMJPu95rdCChnd1hEz5
+zvTbwZ1KZJPNRN0U8NDh/lFmFjj88dcalcCpOp95KvWdX3h7R0w1WiWTuqtrhP9U
+FJFAQLN1VMHFqjZyXIztejj8O7ZUUyCsOI/5Jal7qctqxw4IzzLF41DxIYZVk/XJ
+KDbp4SxbecF4upYFjp22vn3rluGlLNUotnEOdZXi14A0iiw0hqs=
+=c2VR
+-----END PGP SIGNATURE-----
diff --git a/pub/download/FU-0.4.tar.gz.md5 b/pub/download/FU-0.4.tar.gz.md5
new file mode 100644
index 0000000..804136e
--- /dev/null
+++ b/pub/download/FU-0.4.tar.gz.md5
@@ -0,0 +1 @@
+fdf8834c8065f89895b3832de7ce61b1 FU-0.4.tar.gz
diff --git a/pub/download/FU-0.4.tar.gz.sha1 b/pub/download/FU-0.4.tar.gz.sha1
new file mode 100644
index 0000000..e22a15e
--- /dev/null
+++ b/pub/download/FU-0.4.tar.gz.sha1
@@ -0,0 +1 @@
+8a22bb5f21b6cf8098923be258b1c9d0d1ac6823 FU-0.4.tar.gz
diff --git a/pub/download/FU-0.4.tar.gz.sha256 b/pub/download/FU-0.4.tar.gz.sha256
new file mode 100644
index 0000000..53cacd9
--- /dev/null
+++ b/pub/download/FU-0.4.tar.gz.sha256
@@ -0,0 +1 @@
+04040aed292a9ad57c27e8d93afaff44238ecccee38bc529e18ff81377819f1b FU-0.4.tar.gz
diff --git a/template.html b/template.html
index b2ee2eb..0bea683 100644
--- a/template.html
+++ b/template.html
@@ -21,7 +21,7 @@