{
    "archive_path": "archive/1765607955.358946",
    "base_url": "entropicthoughts.com/you-want-technology-with-warts",
    "basename": "you-want-technology-with-warts",
    "bookmarked_date": "2025-12-13 06:39",
    "canonical": {
        "archive_org_path": "https://web.archive.org/web/entropicthoughts.com/you-want-technology-with-warts",
        "dom_path": "output.html",
        "favicon_path": "favicon.ico",
        "git_path": "git/",
        "google_favicon_path": "https://www.google.com/s2/favicons?domain=entropicthoughts.com",
        "headers_path": "headers.json",
        "htmltotext_path": "htmltotext.txt",
        "index_path": "index.html",
        "media_path": "media/",
        "mercury_path": "mercury/content.html",
        "pdf_path": "output.pdf",
        "readability_path": "readability/content.html",
        "screenshot_path": "screenshot.png",
        "singlefile_path": "singlefile.html",
        "warc_path": "warc/",
        "wget_path": null
    },
    "domain": "entropicthoughts.com",
    "downloaded_at": "2025-12-13T06:39:22.960751+00:00",
    "downloaded_datestr": "2025-12-13 06:39",
    "extension": "",
    "hash": "N248YK49HQHMZMMER0DS",
    "history": {
        "archive_org": [
            {
                "cmd": [
                    "/usr/bin/curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--proxy",
                    "socks5://tor-socks-proxy:9150",
                    "--head",
                    "--max-time",
                    "60",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "https://web.archive.org/save/https://entropicthoughts.com/you-want-technology-with-warts"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-13T06:40:19.977725+00:00",
                "index_texts": null,
                "output": "https://web.archive.org/web/20251213064003/https://entropicthoughts.com/you-want-technology-with-warts",
                "pwd": "/data/archive/1765607955.358946",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-13T06:39:58.857781+00:00",
                "status": "succeeded"
            }
        ],
        "dom": [
            {
                "cmd": [
                    "/usr/bin/chromium-browser",
                    "--proxy-server=socks5://tor-socks-proxy:9150",
                    "--disable-features=DarkMode",
                    "--run-all-compositor-stages-before-draw",
                    "--hide-scrollbars",
                    "--autoplay-policy=no-user-gesture-required",
                    "--no-first-run",
                    "--use-fake-ui-for-media-stream",
                    "--use-fake-device-for-media-stream",
                    "--simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT'",
                    "--headless=new",
                    "--no-sandbox",
                    "--no-zygote",
                    "--disable-dev-shm-usage",
                    "--disable-software-rasterizer",
                    "--disable-sync",
                    "--window-size=1440,2000",
                    "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "--user-data-dir=/data/personas/Default/chrome_profile",
                    "--profile-directory=Default",
                    "--dump-dom",
                    "https://entropicthoughts.com/you-want-technology-with-warts"
                ],
                "cmd_version": "131.0.6778",
                "end_ts": "2025-12-13T06:39:38.854443+00:00",
                "index_texts": null,
                "output": "output.html",
                "pwd": "/data/archive/1765607955.358946",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-13T06:39:32.797367+00:00",
                "status": "succeeded"
            }
        ],
        "favicon": [
            {
                "cmd": [
                    "/usr/bin/curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--proxy",
                    "socks5://tor-socks-proxy:9150",
                    "--max-time",
                    "60",
                    "--output",
                    "favicon.ico",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "https://www.google.com/s2/favicons?domain=entropicthoughts.com"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-13T06:39:26.245991+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1765607955.358946",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-13T06:39:23.171162+00:00",
                "status": "succeeded"
            }
        ],
        "git": [],
        "headers": [
            {
                "cmd": [
                    "/usr/bin/curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--proxy",
                    "socks5://tor-socks-proxy:9150",
                    "--head",
                    "--max-time",
                    "60",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "https://entropicthoughts.com/you-want-technology-with-warts"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-13T06:39:26.887199+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1765607955.358946",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-13T06:39:26.324106+00:00",
                "status": "succeeded"
            }
        ],
        "htmltotext": [
            {
                "cmd": [
                    "(internal) archivebox.extractors.htmltotext",
                    "./{singlefile,dom}.html"
                ],
                "cmd_version": "0.8.5rc51",
                "end_ts": "2025-12-13T06:39:51.985389+00:00",
                "index_texts": [
                    "You Want Technology With Warts (Atom Feed) (/feed) (/image/favicon/favicon-48x48.png) (/image/favicon/apple-touch-icon.png) (/etc/style/css/htmlize-classes.css) (/etc/style/css/main.css?v=13) (/lib/katex/katex.min.css)  (/) Entropic Thoughts  You Want Technology With Warts  (/) Home  (/archive) Archive  (/tags) Tags  (/about) About  (https://xkqr.org/) xkqr.org     You Want Technology With Warts by kqr , \npublished 2025-09-16  Tags: (tags.html#programming) programming  (tags.html#unix) unix  (tags.html#web) web      I normally skip presentations because I prefer reading, but (https://www.youtube.com/watch?v=lASLZ9TgXyc) Building the\nHundred-Year Web Service (YouTube) was worth the time.1 1 Note that despite\n\u201chtmx\u201d featuring in the title, very little of the presentation is actually about\nhtmx. It is about choosing and using technology in such a way that it won\u2019t\nrequire maintenance suddenly due to external factors changing. That\u2019s a drum\nI\u2019ve been banging for the last few years too, although less visibly.  Petros observes that we know how to build bridges that last hundreds of years:\nstone, concrete, and steel can all do this with the right engineering. We also\nknow how to build hypertext that is likely to last at least a few decades: use\nplain html and css . But, Petros asks, how do we create database-y web\nservices that lasts for decades?  Where do we store the data? Where do we perform business logic? He answers\nthusly:  sql ite for data storage, sql queries for most of the application logic, Express-on-Node.js for routing and presentation logic, Jinja2 templates for additional presentation logic, and html and vanilla js for triggering http requests.  I won\u2019t debate the specifics here. 2 2 I\u2019d be tempted to jam Perl into the\nbackend instead of Node.js if I wanted truly low maintenance. I have a feeling a\nPerl script is more likely to run unmodified 20 years from now than some Node.js\nthing. But maybe I\u2019m wrong on this. But there were other nuggets in the\npresentation. For example:  I\u2019ve frequently wondered why I turn to the web browser when I want to make\ncross-platform software. There\u2019s a chart in the presentation that shows how\nenvironmental churn and api deprecation leads desktop applications to have\nan expected lifetime of maybe a decade, and phone apps closer to a couple of\nyears. On the other hand, simple web pages have worked unmodified for over 40\nyears! That\u2019s a good reason to default to the web as a technology. When a page load is fast enough, the browser does not do the whole\nflicker-a-blank-page-before-doing-a-full-repaint, it just shows the new\ncontent right away as a sort of partial update. This is apparently a recent\nbrowser innovation, but it is what allows e.g. (https://xkqr.org/decision/) Decision Drill to do a full\npage reload when a user interacts with it, and it still feels like one of them\nsmooth xml HttpRequest things. Rest assured, it\u2019s a full page reload.  But then the thing that triggered this article: sql ite. One of the more\npowerful arguments I\u2019ve read against sql ite is that it has a few warts in its\ndefaults, such tables being flexibly typed, foreign keys not being enforced,\nprimary keys being nullable, etc.  I\u2019ve usually thought of these warts as a bad thing. Haskell has them too, like\nhow the built in String type is bad data structure for storing text, and how\nwe\u2019re stuck with a bunch of misnamed functions (mapM, ap, msum, etc.) because we\ndidn\u2019t know better. Oh and the list of Perl\u2019s warts is probably longer than its\nimplementation.  Petros reframes this problem. Every single wart that annoys us today, used to be\na reasonable feature that someone relied on in their production code. Every wart\nwe see today is a testament to the care the maintainers put into backward\ncompatibility. If we choose a technology today, we want one that saves us from\nfuture maintenance by keeping our wartful code running \u2013 even if we don\u2019t yet\nknow it is wartful. The best indicator of this is whether the technology has\nwarts today.  I would much rather, the first time I install an application, \u201cenable foreign\nkeys\u201d \u2013 it\u2019s just one line of config \u2013 I\u2019d rather do that once, build the thing\ncorrectly, and then be confident that if there\u2019s any other built-in behaviour\nthat I didn\u2019t account for, that behaviour isn\u2019t going to change on me and break\nmy application at some point in the future.   Right on.  Sidenotes 1  Note that despite\n\u201chtmx\u201d featuring in the title, very little of the presentation is actually about\nhtmx.   2  I\u2019d be tempted to jam Perl into the\nbackend instead of Node.js if I wanted truly low maintenance. I have a feeling a\nPerl script is more likely to run unmodified 20 years from now than some Node.js\nthing. But maybe I\u2019m wrong on this.      If you liked this and want more you should (https://buymeacoff.ee/kqr) buy me a coffee .\n                    That helps me turn my 110+ ideas backlog into articles.  Shoutout to my amazing wife  without whose support I would never\n                    make it past the first sentence. \u2665  S = k log W.Comments? (/about) Send\n                    me an email .You can also (https://buttondown.email/entropicthoughts) subscribe for updates .      "
                ],
                "output": "htmltotext.txt",
                "pwd": "/data/archive/1765607955.358946",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-13T06:39:51.968513+00:00",
                "status": "succeeded"
            }
        ],
        "media": [
            {
                "cmd": [
                    "/usr/local/bin/yt-dlp",
                    "--restrict-filenames",
                    "--trim-filenames",
                    "128",
                    "--write-description",
                    "--write-info-json",
                    "--write-annotations",
                    "--write-thumbnail",
                    "--no-call-home",
                    "--write-sub",
                    "--write-auto-subs",
                    "--convert-subs=srt",
                    "--yes-playlist",
                    "--continue",
                    "--no-abort-on-error",
                    "--ignore-errors",
                    "--geo-bypass",
                    "--add-metadata",
                    "--format=(bv*+ba/b)[filesize<=750m][filesize_approx<=?750m]/(bv*+ba/b)",
                    "--skip-download",
                    "--cache-dir=/data/yt-dlp-cache/",
                    "--cookies=/data/yt-dlp-cache/cookies.txt",
                    "--proxy=socks5://tor-socks-proxy:9150",
                    "--no-playlist",
                    "https://entropicthoughts.com/you-want-technology-with-warts"
                ],
                "cmd_version": "2024.10.7",
                "end_ts": "2025-12-13T06:39:58.813279+00:00",
                "index_texts": [],
                "output": "media/",
                "pwd": "/data/archive/1765607955.358946",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-13T06:39:53.780410+00:00",
                "status": "succeeded"
            }
        ],
        "mercury": [
            {
                "cmd": [
                    "/home/archivebox/.npm/bin/postlight-parser",
                    "https://entropicthoughts.com/you-want-technology-with-warts"
                ],
                "cmd_version": "2.2.3",
                "end_ts": "2025-12-13T06:39:51.942977+00:00",
                "index_texts": null,
                "output": "mercury/",
                "pwd": "/data/archive/1765607955.358946",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-13T06:39:48.886912+00:00",
                "status": "succeeded"
            }
        ],
        "pdf": [],
        "readability": [
            {
                "cmd": [
                    "/home/archivebox/.npm/bin/readability-extractor",
                    "/tmp/tmp6tbp_y2f",
                    "https://entropicthoughts.com/you-want-technology-with-warts"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2025-12-13T06:39:41.543817+00:00",
                "index_texts": [
                    "I normally skip presentations because I prefer reading, but Building the\nHundred-Year Web Service (YouTube) was worth the time.11 Note that despite\n\u201chtmx\u201d featuring in the title, very little of the presentation is actually about\nhtmx. It is about choosing and using technology in such a way that it won\u2019t\nrequire maintenance suddenly due to external factors changing. That\u2019s a drum\nI\u2019ve been banging for the last few years too, although less visibly.\n\n\n\n\n\nPetros observes that we know how to build bridges that last hundreds of years:\nstone, concrete, and steel can all do this with the right engineering. We also\nknow how to build hypertext that is likely to last at least a few decades: use\nplain html and css. But, Petros asks, how do we create database-y web\nservices that lasts for decades?\n\n\n\nWhere do we store the data? Where do we perform business logic? He answers\nthusly:\n\n\n\nsqlite for data storage,\nsql queries for most of the application logic,\nExpress-on-Node.js for routing and presentation logic,\nJinja2 templates for additional presentation logic, and\nhtml and vanilla js for triggering http requests.\n\n\n\nI won\u2019t debate the specifics here. 22 I\u2019d be tempted to jam Perl into the\nbackend instead of Node.js if I wanted truly low maintenance. I have a feeling a\nPerl script is more likely to run unmodified 20 years from now than some Node.js\nthing. But maybe I\u2019m wrong on this. But there were other nuggets in the\npresentation. For example:\n\n\n\nI\u2019ve frequently wondered why I turn to the web browser when I want to make\ncross-platform software. There\u2019s a chart in the presentation that shows how\nenvironmental churn and api deprecation leads desktop applications to have\nan expected lifetime of maybe a decade, and phone apps closer to a couple of\nyears. On the other hand, simple web pages have worked unmodified for over 40\nyears! That\u2019s a good reason to default to the web as a technology.\n\nWhen a page load is fast enough, the browser does not do the whole\nflicker-a-blank-page-before-doing-a-full-repaint, it just shows the new\ncontent right away as a sort of partial update. This is apparently a recent\nbrowser innovation, but it is what allows e.g. Decision Drill to do a full\npage reload when a user interacts with it, and it still feels like one of them\nsmooth xmlHttpRequest things. Rest assured, it\u2019s a full page reload.\n\n\n\nBut then the thing that triggered this article: sqlite. One of the more\npowerful arguments I\u2019ve read against sqlite is that it has a few warts in its\ndefaults, such tables being flexibly typed, foreign keys not being enforced,\nprimary keys being nullable, etc.\n\n\n\nI\u2019ve usually thought of these warts as a bad thing. Haskell has them too, like\nhow the built in String type is bad data structure for storing text, and how\nwe\u2019re stuck with a bunch of misnamed functions (mapM, ap, msum, etc.) because we\ndidn\u2019t know better. Oh and the list of Perl\u2019s warts is probably longer than its\nimplementation.\n\n\n\nPetros reframes this problem. Every single wart that annoys us today, used to be\na reasonable feature that someone relied on in their production code. Every wart\nwe see today is a testament to the care the maintainers put into backward\ncompatibility. If we choose a technology today, we want one that saves us from\nfuture maintenance by keeping our wartful code running \u2013 even if we don\u2019t yet\nknow it is wartful. The best indicator of this is whether the technology has\nwarts today.\n\n\n\n\nI would much rather, the first time I install an application, \u201cenable foreign\nkeys\u201d \u2013 it\u2019s just one line of config \u2013 I\u2019d rather do that once, build the thing\ncorrectly, and then be confident that if there\u2019s any other built-in behaviour\nthat I didn\u2019t account for, that behaviour isn\u2019t going to change on me and break\nmy application at some point in the future.\n\n\n\n\nRight on."
                ],
                "output": "readability/",
                "pwd": "/data/archive/1765607955.358946",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-13T06:39:39.637741+00:00",
                "status": "succeeded"
            }
        ],
        "screenshot": [],
        "singlefile": [],
        "title": [
            {
                "cmd": [
                    "/usr/bin/curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--proxy",
                    "socks5://tor-socks-proxy:9150",
                    "--max-time",
                    "60",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "https://entropicthoughts.com/you-want-technology-with-warts"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-13T06:39:38.914343+00:00",
                "index_texts": null,
                "output": "You Want Technology With Warts",
                "pwd": "/data/archive/1765607955.358946",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-13T06:39:38.905445+00:00",
                "status": "succeeded"
            }
        ],
        "wget": []
    },
    "icons": null,
    "is_archived": true,
    "is_static": false,
    "latest": {
        "archive_org": "https://web.archive.org/web/20251213064003/https://entropicthoughts.com/you-want-technology-with-warts",
        "dom": "output.html",
        "favicon": "favicon.ico",
        "git": null,
        "media": "media/",
        "pdf": null,
        "screenshot": null,
        "singlefile": null,
        "title": "You Want Technology With Warts",
        "warc": null,
        "wget": null
    },
    "link_dir": "/data/archive/1765607955.358946",
    "newest_archive_date": "2025-12-13T06:39:58.857781+00:00",
    "num_failures": 0,
    "num_outputs": 9,
    "oldest_archive_date": "2025-12-13T06:39:23.171162+00:00",
    "path": "/you-want-technology-with-warts",
    "schema": "Link",
    "scheme": "https",
    "snapshot_abid": "snp_01KCB6YQ1G56BEBA1401W7TM4B",
    "snapshot_id": "7a9f0356-db73-4533-b131-95e4f87d508b",
    "sources": [
        "/data/sources/1765607953-import.txt"
    ],
    "tags": null,
    "tags_str": "",
    "timestamp": "1765607955.358946",
    "title": "You Want Technology With Warts",
    "url": "https://entropicthoughts.com/you-want-technology-with-warts"
}