{
    "archive_path": "archive/1765896383.448852",
    "base_url": "lucumr.pocoo.org/2025/1/24/build-it-yourself",
    "basename": "",
    "bookmarked_date": "2025-12-16 14:46",
    "canonical": {
        "archive_org_path": "https://web.archive.org/web/lucumr.pocoo.org/2025/1/24/build-it-yourself",
        "dom_path": "output.html",
        "favicon_path": "favicon.ico",
        "git_path": "git/",
        "google_favicon_path": "https://www.google.com/s2/favicons?domain=lucumr.pocoo.org",
        "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": "lucumr.pocoo.org",
    "downloaded_at": "2025-12-16T14:46:29.221402+00:00",
    "downloaded_datestr": "2025-12-16 14:46",
    "extension": "",
    "hash": "1FX1CPR18S1SFT7WCZMD",
    "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://lucumr.pocoo.org/2025/1/24/build-it-yourself/"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-16T14:49:32.604672+00:00",
                "index_texts": null,
                "output": "TimeoutExpired: Command '['/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://lucumr.pocoo.org/2025/1/24/build-it-yourself/']' timed out after 60 seconds",
                "pwd": "/data/archive/1765896383.448852",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T14:48:32.499108+00:00",
                "status": "failed"
            }
        ],
        "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://lucumr.pocoo.org/2025/1/24/build-it-yourself/"
                ],
                "cmd_version": "131.0.6778",
                "end_ts": "2025-12-16T14:47:20.565160+00:00",
                "index_texts": null,
                "output": "output.html",
                "pwd": "/data/archive/1765896383.448852",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T14:46:55.898394+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=lucumr.pocoo.org"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-16T14:46:33.911169+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1765896383.448852",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T14:46:30.699410+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://lucumr.pocoo.org/2025/1/24/build-it-yourself/"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-16T14:46:34.475763+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1765896383.448852",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T14:46:34.052886+00:00",
                "status": "succeeded"
            }
        ],
        "htmltotext": [
            {
                "cmd": [
                    "(internal) archivebox.extractors.htmltotext",
                    "./{singlefile,dom}.html"
                ],
                "cmd_version": "0.8.5rc51",
                "end_ts": "2025-12-16T14:48:14.174276+00:00",
                "index_texts": [
                    "Build It Yourself | Armin Ronacher's Thoughts and Writings (/feed.atom) (Armin Ronacher's Thoughts and Writings) (/feed.xml) (Armin Ronacher's Thoughts and Writings) (/static/avatar-tiny.jpg) (/static/avatar-small.jpg) (/static/avatar-small.jpg) (/static/fonts.css) (/static/style-2025.css) (/static/_pygments.css) (https://lucumr.pocoo.org/2025/1/24/build-it-yourself/) (https://hachyderm.io/@mitsuhiko)    (/about/) Armin Ronacher 's Thoughts and Writings  (/) blog  (/archive/) archive  (/projects/) projects  (/travel/) travel  (/talks/) talks  (/about/) about    Build It Yourself written on January 24, 2025 Another day, another (/2016/3/24/open-source-trust-scaling/) rant (/2022/1/10/dependency-risk-and-funding/) about (/2024/3/26/rust-cdo/) dependencies . from me.  This time I will ask you that we\nstart and support a vibe shift when it comes to dependencies. You\u2019re probably familiar with the concept of \u201cdependency churn.\u201d  It\u2019s that\nnever-ending treadmill of updates, patches, audits, and transitive\ndependencies that we as developers love to casually install in the name of\nproductivity.  Who doesn\u2019t enjoy waiting for yet another cargo upgrade just so you can get that fix for a bug you don\u2019t even have? It\u2019s a plague in most ecosystems with good packaging solutions.\nJavaScript and Rust are particularly badly affected by that.  A brand new\nTokio project drags in 28 crates, a new Rocket project balloons that to\n172, and a little template engine like MiniJinja can exist with just a\nsingle dependency \u2014 while its CLI variant slurps up 142. If that doesn\u2019t sound like a big deal, let\u2019s consider (https://crates.io/crates/terminal_size) terminal_size .  It is a crate that does\nexactly what its name suggests: it figures out your terminal dimensions.\nThe underlying APIs it uses have effectively been stable since the earliest days of computing\nterminals\u2014what, 50 years or so? And yet, for one function, terminal-size\nmanages to introduce three or four additional crates, depending on your\noperating system.  That triggers a whole chain reaction, so you end up\ncompiling thousands of other functions just to figure out if your terminal\nis 80x25 or 120x40.  That crate had 26 releases.  My own version of that\nthat I have stuck away in a project from 10 years ago still works without\na single update.  Because shocker: nothing about figuring out terminal\nsizes has changed. 1   So why does terminal-size have so many updates if it\u2019s so stable?\nBecause it\u2019s build on top of platform abstraction libraries that\nconstantly churn, so it needs to update to avoid code duplication and\nblowing up compile times even more. But \u201cbig supply chain\u201d will tell you that you must do it this way.  Don\u2019t\nyou dare to copy paste that function into your library.  Or don\u2019t you dare\nto use \u201cunsafe\u201d yourself.  You\u2019re not qualified enough to write unsafe\ncode, let the platform abstraction architects do that.  Otherwise someone (https://github.com/geiger-rs/cargo-geiger) will slap you .  There are\nentire companies who are making a living of supplying you with the tools\nneeded to deal with your dependency mess.  In the name of security, we\u2019re\npushed to having dependencies and keeping them up to date, despite most of\nthose dependencies being the primary source of security problems. The goal of code in many ways should be to be written in a way that it\ndoes not need updates.  It should eventually achieve some level of\nstability.  In the Rust ecosystem stable code is punished.  If you have a\nperfectly working dependency but you have a somewhat inactive bug tracker,\nRUSTSEC will come by and (/2024/3/26/rust-cdo/) give you a junk rating . But there is a simpler path.  You write code yourself.  Sure, it\u2019s more\nwork up front, but once it\u2019s written, it\u2019s done. No new crates, no waiting\nfor upsteam authors to fix that edge case.  If it\u2019s broken for you, you\nfix it yourself.  Code that works doesn\u2019t necessarily need the\nmaintenance treadmill.  Your code has a corner case?  Who cares.  This is\nthat vibe shift we need in the Rust world: celebrating fewer dependencies\nrather than more. We\u2019re at a point in the most ecosystems where pulling in libraries is not\njust the default action, it\u2019s seen positively: \u201cLook how modular and\ncomposable my code is!\u201d  Actually, it might just be a symptom of never\nwanting to type out more than a few lines. Now one will make the argument that it takes so much time to write all of\nthis.  It\u2019s 2025 and it\u2019s faster for me to have ChatGPT or Cursor whip up\na dependency free implementation of these common functions, than it is for\nme to start figuring out a dependency.  And it makes sense as for many\nsuch small functions the maintenance overhead is tiny and much lower than\nactually dealing with constant upgrading of dependencies.  The code is just\na few lines and you also get the benefit of no longer need to compile\nthousands of lines of other people\u2019s code for a single function. But let\u2019s face it: corporate code review culture has also has infected\nOpen Source software.  Companies are more likely to reward engineers than\nscold them for pulling in that new \u201cshiny library\u201d that solves the problem\nthey never actually had.  That creates problems, so dependabot and friends\nwere born.  Today I just dread getting dependabot pull requests but on\nprojects but I have to accept it.  I\u2019m part of an ecosystem with my stuff\nand that ecosystem is all about churn, churn, churn.  In companies you can\nalso keep entire internal engineering teams busy with vendoring\ndependencies, internal audits and upgrading things throughout the company. Fighting this fight is incredibly hard!  Every new hire has been trained\non the idea that dependencies are great, that code reuse is great.  That\nhaving old code sitting around is a sign of bad engineering culture. It\u2019s also hard to fight this in Open Source.  Years ago I wrote (https://crates.io/crates/sha1_smol) sha1-smol which originally was just called sha1 .  It became the standard crate to calculate SHA1 hashes.\nEventually I was pressured to donate that package name to rust-crypto and\nto depend on the rest of the crypto ecosystem as it was so established.\nIf you want to use the new sha1 crate, you get to enjoy 10 dependencies.\nBut there was just no way around it, because that name in the registry is\nprecious and people also wanted to have trait compatibility.  It feels\ntiring to be the only person in a conversation pushing to keep the churn\ndown and dependencies low. It\u2019s time to have a new perspective: we should give kudos to engineers who\nwrite a small function themselves instead of hooking in a transitive web\nof crates.  We should be suspicious of big crate graphs.  Celebrated are\nthe minimal dependencies, the humble function that just quietly does the\njob, the code that doesn\u2019t need to be touched for years because it was\ndone right once. And sure, it\u2019s not black and white.  There are the important libraries\nthat solve hard problems.  Graphics libraries that abstract over complex\ndrivers, implementations of protocols like HTTP and QUIC.  I won\u2019t be able\nto get rid of tokio and I have no desire to.  But when you end up using\none function, but you compile hundreds, some alarm bell should go off. We need that vibe shift.  To celebrate building it yourself when it\u2019s\nappropriate to do so.  To give credit to library authors who build low to\nno-dependency Open Source libraries. For instance minijinja celebrates it in the readme:  $ cargo tree\nminimal v0.1.0 (examples/minimal)\n\u2514\u2500\u2500 minijinja v2.6.0 (minijinja)\n    \u2514\u2500\u2500 serde v1.0.144   And it has a PR to eventually (https://github.com/mitsuhiko/minijinja/pull/539) get rid of the last dependency .  And sometime this\nyear I will make it my goal to go ahead proudly and trim down all that fat\nin my projects. Disclaimer: you will need one dependency for UNIX: libc .  That\u2019s\nbecause Rust does not expose the platform\u2019s libc constants to you, and\nthey are not standarized.  That however is such a common and\nlightweight dependency that you won\u2019t be able to avoid it anyways.\u21a9     This entry was tagged (/tags/rust/) rust and (/tags/thoughts/) thoughts  (/2025/1/24/build-it-yourself.md) copy as / (/2025/1/24/build-it-yourself.md) view markdown   \u00a9 Copyright 2025 by Armin Ronacher.  Content licensed under the Creative Commons\n          attribution-noncommercial-sharealike License.  Contact me via (mailto:armin.ronacher@active-4.com) mail , (https://bsky.app/profile/mitsuhiko.at) bluesky , (http://x.com/mitsuhiko) x , or (http://github.com/mitsuhiko) github .  You can (https://github.com/sponsors/mitsuhiko/) sponsor me on github .  More info: (/about#imprint) imprint & (/ai-transparency) AI transparency .\n          Subscribe via (/feed.atom) (Armin Ronacher's\n            Thoughts and Writings) atom / (/feed.xml) (Armin Ronacher's\n            Thoughts and Writings) RSS .  Color scheme: (system) auto  , (light) light  , (dark) dark  .        "
                ],
                "output": "htmltotext.txt",
                "pwd": "/data/archive/1765896383.448852",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T14:48:14.100565+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://lucumr.pocoo.org/2025/1/24/build-it-yourself/"
                ],
                "cmd_version": "2024.10.7",
                "end_ts": "2025-12-16T14:48:32.395200+00:00",
                "index_texts": [],
                "output": "media/",
                "pwd": "/data/archive/1765896383.448852",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T14:48:23.167405+00:00",
                "status": "succeeded"
            }
        ],
        "mercury": [
            {
                "cmd": [
                    "/home/archivebox/.npm/bin/postlight-parser",
                    "https://lucumr.pocoo.org/2025/1/24/build-it-yourself/"
                ],
                "cmd_version": "999.999.999",
                "end_ts": "2025-12-16T14:48:13.994936+00:00",
                "index_texts": null,
                "output": "mercury/",
                "pwd": "/data/archive/1765896383.448852",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T14:48:03.649773+00:00",
                "status": "succeeded"
            }
        ],
        "pdf": [],
        "readability": [
            {
                "cmd": [
                    "/home/archivebox/.npm/bin/readability-extractor",
                    "/tmp/tmpvtjyx66f",
                    "https://lucumr.pocoo.org/2025/1/24/build-it-yourself/"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2025-12-16T14:47:35.200642+00:00",
                "index_texts": [
                    "Build It Yourself\n\n  \n  written on January 24, 2025\n  \n\n  Another day, another rant\nabout dependencies. from me.  This time I will ask you that we\nstart and support a vibe shift when it comes to dependencies.\nYou\u2019re probably familiar with the concept of \u201cdependency churn.\u201d  It\u2019s that\nnever-ending treadmill of updates, patches, audits, and transitive\ndependencies that we as developers love to casually install in the name of\nproductivity.  Who doesn\u2019t enjoy waiting for yet another cargo upgrade\njust so you can get that fix for a bug you don\u2019t even have?\nIt\u2019s a plague in most ecosystems with good packaging solutions.\nJavaScript and Rust are particularly badly affected by that.  A brand new\nTokio project drags in 28 crates, a new Rocket project balloons that to\n172, and a little template engine like MiniJinja can exist with just a\nsingle dependency \u2014 while its CLI variant slurps up 142.\nIf that doesn\u2019t sound like a big deal, let\u2019s consider terminal_size.  It is a crate that does\nexactly what its name suggests: it figures out your terminal dimensions.\nThe underlying APIs it uses have effectively been stable since the earliest days of computing\nterminals\u2014what, 50 years or so? And yet, for one function, terminal-size\nmanages to introduce three or four additional crates, depending on your\noperating system.  That triggers a whole chain reaction, so you end up\ncompiling thousands of other functions just to figure out if your terminal\nis 80x25 or 120x40.  That crate had 26 releases.  My own version of that\nthat I have stuck away in a project from 10 years ago still works without\na single update.  Because shocker: nothing about figuring out terminal\nsizes has changed.  1\nSo why does terminal-size have so many updates if it\u2019s so stable?\nBecause it\u2019s build on top of platform abstraction libraries that\nconstantly churn, so it needs to update to avoid code duplication and\nblowing up compile times even more.\nBut \u201cbig supply chain\u201d will tell you that you must do it this way.  Don\u2019t\nyou dare to copy paste that function into your library.  Or don\u2019t you dare\nto use \u201cunsafe\u201d yourself.  You\u2019re not qualified enough to write unsafe\ncode, let the platform abstraction architects do that.  Otherwise someone\nwill slap you.  There are\nentire companies who are making a living of supplying you with the tools\nneeded to deal with your dependency mess.  In the name of security, we\u2019re\npushed to having dependencies and keeping them up to date, despite most of\nthose dependencies being the primary source of security problems.\nThe goal of code in many ways should be to be written in a way that it\ndoes not need updates.  It should eventually achieve some level of\nstability.  In the Rust ecosystem stable code is punished.  If you have a\nperfectly working dependency but you have a somewhat inactive bug tracker,\nRUSTSEC will come by and give you a junk rating.\nBut there is a simpler path.  You write code yourself.  Sure, it\u2019s more\nwork up front, but once it\u2019s written, it\u2019s done. No new crates, no waiting\nfor upsteam authors to fix that edge case.  If it\u2019s broken for you, you\nfix it yourself.  Code that works doesn\u2019t necessarily need the\nmaintenance treadmill.  Your code has a corner case?  Who cares.  This is\nthat vibe shift we need in the Rust world: celebrating fewer dependencies\nrather than more.\nWe\u2019re at a point in the most ecosystems where pulling in libraries is not\njust the default action, it\u2019s seen positively: \u201cLook how modular and\ncomposable my code is!\u201d  Actually, it might just be a symptom of never\nwanting to type out more than a few lines.\nNow one will make the argument that it takes so much time to write all of\nthis.  It\u2019s 2025 and it\u2019s faster for me to have ChatGPT or Cursor whip up\na dependency free implementation of these common functions, than it is for\nme to start figuring out a dependency.  And it makes sense as for many\nsuch small functions the maintenance overhead is tiny and much lower than\nactually dealing with constant upgrading of dependencies.  The code is just\na few lines and you also get the benefit of no longer need to compile\nthousands of lines of other people\u2019s code for a single function.\nBut let\u2019s face it: corporate code review culture has also has infected\nOpen Source software.  Companies are more likely to reward engineers than\nscold them for pulling in that new \u201cshiny library\u201d that solves the problem\nthey never actually had.  That creates problems, so dependabot and friends\nwere born.  Today I just dread getting dependabot pull requests but on\nprojects but I have to accept it.  I\u2019m part of an ecosystem with my stuff\nand that ecosystem is all about churn, churn, churn.  In companies you can\nalso keep entire internal engineering teams busy with vendoring\ndependencies, internal audits and upgrading things throughout the company.\nFighting this fight is incredibly hard!  Every new hire has been trained\non the idea that dependencies are great, that code reuse is great.  That\nhaving old code sitting around is a sign of bad engineering culture.\nIt\u2019s also hard to fight this in Open Source.  Years ago I wrote sha1-smol which originally was just called\nsha1.  It became the standard crate to calculate SHA1 hashes.\nEventually I was pressured to donate that package name to rust-crypto and\nto depend on the rest of the crypto ecosystem as it was so established.\nIf you want to use the new sha1 crate, you get to enjoy 10 dependencies.\nBut there was just no way around it, because that name in the registry is\nprecious and people also wanted to have trait compatibility.  It feels\ntiring to be the only person in a conversation pushing to keep the churn\ndown and dependencies low.\nIt\u2019s time to have a new perspective: we should give kudos to engineers who\nwrite a small function themselves instead of hooking in a transitive web\nof crates.  We should be suspicious of big crate graphs.  Celebrated are\nthe minimal dependencies, the humble function that just quietly does the\njob, the code that doesn\u2019t need to be touched for years because it was\ndone right once.\nAnd sure, it\u2019s not black and white.  There are the important libraries\nthat solve hard problems.  Graphics libraries that abstract over complex\ndrivers, implementations of protocols like HTTP and QUIC.  I won\u2019t be able\nto get rid of tokio and I have no desire to.  But when you end up using\none function, but you compile hundreds, some alarm bell should go off.\nWe need that vibe shift.  To celebrate building it yourself when it\u2019s\nappropriate to do so.  To give credit to library authors who build low to\nno-dependency Open Source libraries.\nFor instance minijinja celebrates it in the readme:\n$ cargo tree\nminimal v0.1.0 (examples/minimal)\n\u2514\u2500\u2500 minijinja v2.6.0 (minijinja)\n    \u2514\u2500\u2500 serde v1.0.144\n\nAnd it has a PR to eventually get rid of the last dependency.  And sometime this\nyear I will make it my goal to go ahead proudly and trim down all that fat\nin my projects.\n\n\n\n  \n  This entry was tagged\n    \n      rust and \n      thoughts\n  \n\n  \n    copy as / view markdown"
                ],
                "output": "readability/",
                "pwd": "/data/archive/1765896383.448852",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T14:47:23.339714+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://lucumr.pocoo.org/2025/1/24/build-it-yourself/"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-16T14:47:22.065455+00:00",
                "index_texts": null,
                "output": "Build It Yourself | Armin Ronacher's Thoughts and Writings",
                "pwd": "/data/archive/1765896383.448852",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T14:47:21.535879+00:00",
                "status": "succeeded"
            }
        ],
        "wget": []
    },
    "icons": null,
    "is_archived": true,
    "is_static": false,
    "latest": {
        "archive_org": "TimeoutExpired: Command '['/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://lucumr.pocoo.org/2025/1/24/build-it-yourself/']' timed out after 60 seconds",
        "dom": "output.html",
        "favicon": "favicon.ico",
        "git": null,
        "media": "media/",
        "pdf": null,
        "screenshot": null,
        "singlefile": null,
        "title": "Build It Yourself | Armin Ronacher's Thoughts and Writings",
        "warc": null,
        "wget": null
    },
    "link_dir": "/data/archive/1765896383.448852",
    "newest_archive_date": "2025-12-16T14:48:32.499108+00:00",
    "num_failures": 1,
    "num_outputs": 8,
    "oldest_archive_date": "2025-12-16T14:46:30.699410+00:00",
    "path": "/2025/1/24/build-it-yourself/",
    "schema": "Link",
    "scheme": "https",
    "snapshot_abid": "snp_01KCKT0V7Z6248AD8D018WT6Z3",
    "snapshot_id": "a43c19ed-4f5f-4d41-806f-e82291cd1be3",
    "sources": [
        "/data/sources/1765896381-import.txt"
    ],
    "tags": null,
    "tags_str": "",
    "timestamp": "1765896383.448852",
    "title": "Build It Yourself | Armin Ronacher's Thoughts and Writings",
    "url": "https://lucumr.pocoo.org/2025/1/24/build-it-yourself/"
}