My website is one binary (2022)(j3s.sh) |
My website is one binary (2022)(j3s.sh) |
You get all the power of templating and minimal cost
<link rel="stylesheet" href="/static/style.css" type="text/css">
Well then...
In this case, the content served in response to the identifier "/static/style.css" can very easily (and according to the author, is) baked directly into the (single) binary.
It just uses go's built-in http.FileServer(..) to serve files from a directory.
Seriously, people should try doing a lot more inlining than they do.
Then again, for 3KB the overhead of doing a cache check after parsing the HTML for the first time and then rendering it again may already be too much :)
I admire the determination to “own” and control the entire stack.
Equally parts of this smell of “not invented here” syndrome.
A bunch of html, css and js files will work in 100 year’s time and if no there will be an archeological AI bot to convert them!
For the short term, say 10 years Wordpress ain’t a bad choice for most.
https://gogs.io/docs/installation/install_from_binary.html#d...
So, thank you I guess. I would like to see more of your stuff and your approaches.
I agree it would be "great" a complete website in the ZIP. I think this is technically possible, someone just have to code it.
As said before BTW the format in Mobile is horrible!
Don’t get me wrong I would absolutely separate my content and my “webserver” but I suspect from the cron job that the author has done so. A single binary doesn’t mean single file.
It reminds me of the guy who coded and compiled his impressive crypto exchange in c by hand to get the attack surface low and the performance extremely high. Does anyone remember the name of the site? I think he mentioned (years ago) he was on the brink of giving up.
Apparently latency is not one of them.
It has been great.
This doesn't fly at clients/customers usually but what you control needs to be highly maintainable and simple. Whatever works for you to achieve this is good. In regards to personal projects or internal products, in that case a framework with massive dependencies just isn't easier to maintain long term over simple web standards and market standard formats like HTML/CSS/JSON/Markdown/etc.
My only complaint is the lack of capitalization on the content, so many tech/devs do this, just don't. Even Sam Altman...
How dare you not capitalize in a capitalist system. /s
Seriously though, just capitalize your sentences.
[0] I would be in favor of getting rid of the modern atrocities of website design that frequently make the front page of HN. Simpler, more effective designs without distractions should be boosted.
Also, however way you spin it, mobile is a hostile environment compared to desktop. It's inconvenient to have to deal with tiny screen and defective keyboard. So, any usability defect that also exists on the desktop risks overflowing the cup of patience.
The problem is that OP probably doesn’t know the basics of HTML so they’re shoehorning whatever they know onto a webpage.
It’s very common to find amateurish websites that work correctly only if you delete code they added.
But, you sort of confirm what I wrote: mobile display, interactions, navigation are a lot worse in general, so any small detail that goes wrong has larger impact in the already painful environment.
> i have very high and unusual standards,
Which was kind of funny TBH :)
I’ve often seen _weird_ formatting, but _zero_ formatting is a new one for me.
<meta name="viewport" content="width=device-width, initial-scale=1.0" />Proper capitalization of letters didn't make the cut either.
If it fit the screen that would be better, but I’ve seen worse failure modes.
I certainly think that "mobile first" was a mistake that got everyone addicted, and made kids oblivious about tech.
I agree that designing for mobile first is annoying for the web in general. But... This is text! Most of the website is text, and it doesn't wrap or resize properly for a small screen.
Here, it's likely just a bug with the window width calculation, not a "mobile first" argument.
If a website is 99% text and it can't be read from every screen size from a phone to an ultrawide monitor... Than it's a bug, not a design choice.
In 2023, there's no technical reason websites should be inaccessible on any device. Doing so intentionally is needlessly user-hostile.
But I think it was very intentional
If you are presented with the option of an abstraction – perhaps a library or framework, perhaps a service or API – is it "simpler" to use it or to not?
If you don't use it, and you build the alternative, you know more about how the system works as a whole, and therefore arguably it's simpler. But complexity is still introduced, and in some cases the abstraction layers still need to be built (but maybe not all of them).
If you do use it, you can consider the system to be simpler because you hide the complexity, and on the happy-path of usage that may be true, but the complexity still exists and you don't understand it because it's hidden. Arguably it's simpler, but it's easy to point to how it's more complex.
I've met engineers who strongly prioritise one or the other of these sorts, and to them that way is obviously simpler, but the problem is that both approaches are obviously simpler when you look at them in a certain way, you have to get past the obvious to realise that there are trade-offs.
> you should do this too!
Absolutely not :)
Maintainability is one of my core values too, down to doing my own bike maintenance, like you! But it is far from being #1 to such a degree that this would make sense for me.
The Framework laptop is a good divergence point for us. Whereas you continue to eke out 9s on the DIY side, I realize resilience by having a spare decade old ThinkPad lying around at all times on which I can run Linux and Neovim in a pinch, and trusting there will be a lot of sub-$100 ThinkPads in the future should that one break on me too. I carry around the bits of CS and mathematics needed to trust myself to write a slow, informal, bug ridden parser with Haskell's combinators from Markdown to HTML if I ever have to. I don't see that day coming any time soon.
I'd hire you if I could. You'd be the perfect counterweight to a great many folks who tilt in the opposite direction.
The author is honest with themself and earnest with the reader. They're unapologetically themself, and figuring out how to achieve their goals in ways that align with their values and bring them joy. If those values do not align with yours, that is okay. That is beautiful! Now you have a clue as to what path you might explore.
The article is kind and humble and authentic, and I think that the author and the article make the world a better place. Thank you for writing it, and thank you for sharing it.
Earnest certainly, but being honest with themselves? Very much the opposite. And humble? Very much the opposite. The whole piece is self-congratulatory with the occasional /r/confidentlyincorrect nugget here and there.
How so? The author just describes their values and how they shape their workflow. How are they not honest with themselves?
The little HTML and CSS it uses actively renders the website worse. The poster is a troll.
> this script runs every minute on a cronjob, and rebuilds my site if the git repo has been updated.
He is pulling the git repo 525,600 times a year for the few commits he'll be making in that year... I guess that explains the "unusual" word?
Tell, don't ask.
my git repositories are all on the same server that hosts my website - git is not doing a remote fetch - it's a local fetch, which makes it basically instantaneous.
even if it were a remote fetch, i would be fine with it. 525,600 http requests per year is less wasteful than NetworkManager's heartbeat (which defaults to 1 heartbeat request per _30 seconds_ on Arch)
for some context, a stock nginx server with 8 cpus can handle ~500k+ http requests _per second_.
I see a lot of very critical posts on here.
With all due respect… screw them.
Perhaps they may be right in their critiques, but as an industry we’re rapidly heading off into mass stupidity in order to follow a bunch of collective “ought to”s and “shoulds”. Many of which have the current validity of an urban myth.
What passes for “engineering” these days would be laughable if we weren’t actively building our future on it. My father was an aerospace engineer and I feel I can hear him rolling over in his grave at was passes for engineering in modern software development.
Yes, this is a comment section so everyone is free to comment. But personally it’s taken me 25 years in the industry to finally ignore all those chattering voices and actually do what I feel makes sense for those few opportunities where I can.
And on a personal site no less? That old “here’s to the crazy ones” line in the Apple commercial sure rings far from true. Given what the internet has become and that once startups are now literally the largest corporate behemoths on the landscape- it should not be a surprise.
Teddy Roosevelt’s quote about “the man in the arena” is so true these days.
I say rock on, OP, rock on…
my website is my sacred & unique playground, not a perfectly optimized website. i write it all myself, and it evolves over time.
my style definitely strikes people the wrong way sometimes - i'm used to people being critical about it. i make some weird decisions for the sake of contorting my content into a form that i like, but i think that's what makes my content endearing. it's not like everything else out there. some rough edges, sure, but i'll get better over time as i explore my "personal form" :)
to me, a website is like a long-term art project. it should represent the author - and in my case, my site represents me, unabashedly.
My website, game engine, and webserver is one binary. The source has 1000 lines of C code. The binary has a size of 164k (I don't know why it is so damned big).
I included my own webserver. The existing servers add way too much (hidden) complexity.
You can check out the result, an interactive fiction game in German, here: http://vmd34232.contaboserver.net/ (no tracking, no ads, not commercial)
Mine is not a single binary though. It's asp.net
- The website is "one binary", but the deploy strategy involves compiling it instead of running a binary artifact
- Won't rely on github pages, but depends on external resource at openlibrary.org
- Writing your own stuff lets you take advantage of open standards, but the .html files in thoughts/ are structured as plaintext with a false file extension
- When people go this route, they usually try to cram everything into the initial page load. This has several static files served dynamically.
- The Golang code does not cache any responses, and does not store templates in memory.
- Several dependencies in the go.mod file, all of them seem unused?
Most importantly: No discussion about the technical benefits of the "single-binary" ethos compared to modern infrastructure.
It's my humble opinion that it's a great idea, and this is a poor example.
It's a single binary working with the filesystem.
All content is on the filesystem.
The "single binary" is a lightweight golang webserver that serves content from the filesystem.
Unusual yes, but very low given the awful resulting design of the website that can't even present text to fit your screen properly
For my personal blog, I wrote a simple static site generator in Python. It converts markdown files into articles, an index page, and an RSS feed. The HTML templates and CSS are written by hand. It's required minimal maintenance over the years, and for the most part Just Works. After an edit, I rebuild the site on my local machine, and deploy with `rsync`.
I do have a couple of "dynamic" things hosted behind the same domain. For those, I configure nginx to reverse-proxy to a local service - which could be a python script, or anything else.
The only real advantage I can see to my setup, beyond personal preference, is that redeploys come with precisely 0 downtime. Presumably, if you're updating a binary, there's a brief moment where the old one shuts down and the new one starts up (unless you're doing some kind of clever reverse-proxy switchover)
Apparently accessibility isn’t one of them, given that increasing zoom level on Safari does jack shit.
I wonder if the author owns a car, and if he does, which?
Locking my Hugo build with something like Nix makes that comfortable. I can upgrade as I discover bugs but can always go back if it ain't broke. I do wish sometimes they would stop adding features.
What it's driving me to do in this same vein is build my own Hugo theme.
Also, tend to agree about dynamic sites vs JavaScript behemoths.
Disagree with the authors styling, and am a big fan of classless lightweight CSS, of which there are a number to choose from these days (I keep a list).
I think they missed the point of a static site generator: you "compile" your site once, and then you have static assets that never need any maintenance ever again (unless you decide to change something) and which can be served by anything, anywhere.
This approach seems to take the worst aspects of static site generators and dynamic sites and bundle them together: you now have a binary to maintain (that has to generate the HTML et al anyway) and you have the potential for security/other bugs and you now have extra CPU/RAM/IO load on your server and you need specific hosting that allows you to run your binary.
Don't get me wrong this is fun and all and nice that it works for the author, but I don't think it is a sensible way to make things simpler, more reliable, or easier maintain (the opposite in my mind).
I will agree that Hugo is terrible IME - so so so much complexity for very little benefit when compared to Jekyll et al.
Thanks to the odd scroll container i cannot zoom to a view where i do not have to side-scroll anymore.
[edit: with hindsight, looking at the other content on their site, I don’t think the date being April Fool’s day is particularly relevant.]
> the web needs more weirdness. and more excitement. and more personality. SO GET OUT THERE AND MAKE A FUCKING DYNAMIC WEBSITE. THERE'S NOTHING STOPPING YOU. YOU WILL BE GLAD YOU DID. 10/10 WOULD RECOMMEND. WITH MUCH LOVE. JES ~2022-04-01
A lot of people here are criticizing this article as if they too hadn’t been through a phase like the author’s. I very much doubt it’s the case that the commenters have all been forever wise — that they have never had a partly formed, more naive, sophomoric era of their lives. A lot of people just aren’t brave enough to document them online. Kudos to JES for that, honestly.
Where I do think the article misses the ball is on static vs. dynamic websites. If you need a dynamic website (for example, to display the user's IP), build a dynamic website. If you don't, build a static website. There really isn't another argument presented here beyond "some things you can't do with a static website", which is really just the fundamental tradeoff of a static site.
Anyways, a neat glimpse into a particular development philosophy that I will very likely never do but I will share with some similarly-minded friends :)
Src code: https://github.com/Ono-Sendai/blog
i recently rewrote the backend, i didn't realize there was a zoom & scroll issue. happy to fix it when i find the time.
You can do your fancy build process, single binary, whatever. The bottom line is if you want to call yourself a (good/strong/solid) web developer, your site needs to be accessible across all form factors.
I'm on mobile so I can't check, but I would bet this thing doesn't get even close to a good score on a tool like Lighthouse. Then the fact that some people are applauding OP and turning around making fun of "modern" software development (whatever that means) don't even realize they're part of perpetuating that problem (applauding sites which are missing key peices of accessibility and functionality)
This isn't really opinion or up for discussion either, this is quite literally the benchmark of living in our reality. We have accesibility guidelines and standards built over the years by hundreds of dedicated folks who worked hard to make those standards and guidelines clear - SO USE THEM! (meaning HTML5/CSS3/WCAG) Software is for humans, to be used by humans. Sure, I get the aspect that there is a bit of artistic freedom which OP has taken and by no means has to follow any guidelines at all. But this is definitively NOT a high standard or normal in any sense of what decent modern web development is.
Nope. Just a static HTML website... Cool...?
I’ve been fiddling with my own 2D canvas UI, and would like to get WebGL thrown in the mix but that’s a learning curve of it’s own.
The effort to build my own input widgets and intercept click events, etc was actually less then I would have imagined.
I find WebAssembly a fairly odd duck though and highly disappointing. As the quote goes, there’s little actually “web” or “assembly” about it. Performance seems on average no faster than JS- sometimes worse. The driving factor being how and how much you need to serialize/deserialize into its TypedArray memory space. And while you can port legacy codebases over, they then will be using various kludges to use the existing JS API’s instead of the POSIX-style interface they’re likely expecting.
If anything, I have a newfound respect for the performance of current JS engines. And am about to go all in on HTML Custom Elements for the UI. Once I ignored the various features most tutorials talk you through and looked at them as just a class overriding HTMLElement, they made a lot more sense to me.
Just my 20 cents…
—— edited for spelling ——
Yeah, haha I am eagerly waiting on these additions. I'm following the spec quite closely and would love it if one day an index.wasm could replace index.html as a web application entry point.
> I find WebAssembly a fairly odd duck though and highly disappointing.
100% agree. It was introduced about 8 years ago and we still can't use it to make a div appear (without heavy JS thunking). The consortium is discussing how to use web assembly in serverless functions and to replace docker - meanwhile in the web world, it's essentially a faster Web Worker.
But hey, I'm still hopeful
That said, compiling your web content into your server? That's a step too far. Data and the application that process that data are two very different things, and (imho) should remain separate.
But for a blog that's a collection of couple dozens of text blobs few Kilobytes each -- meh, whatever. You'll get tired of your blog before it becomes a technical problem.
While I don't have the same hesitations about depending on a small chain of open-source projects, I really didn't like the idea of caddy-exec despite my basic precautions, so I abandoned this approach until I can ponder it a bit more.
But if you want to make an apple pie from scratch, you first need to create a Universe, and you likely go for the simplest Universe that supports apple pies. The overall stack would be simpler (especially if you pursue simplicity and ease of understanding as a goal), but the last step, making the actual pie, may be more involved, and the taste of the resulting pie may be not top-notch. In exchange, you have a pie which you completely understand from first principles.
If you ever get to it, with trying to create a Universe and all. It’s like the drum loops joke:
> I thought that using loops was cheating, so I programmed my own using samples. I then thought that using samples was cheating, so I recorded real drums. I then thought that programming them was cheating, so I learned to play the drums for real. I then thought that using purchased drums was cheating, so I learned to make my own. I then thought that using pre-made skins was cheating, so I killed a goat and skinned it. I then thought that was cheating too, so I grew my own goat from a baby goat. I also think that this is cheating, but I’m not sure where to go from here. I haven’t made any music lately, what with the goat farming and all.
You can add stuff to make something easier to build or deploy (faster, more automated), while the addition makes the whole more complex (less understandable, harder to troubleshoot).
The author finishes by very explicitly saying do your own thing your way. Moreover, they suggest they're not happy using systems that they find understanding obscure/a burden.
I suggest reading beyond the opening paragraph.
I think this article is a fairly clear example of one side of the debate, and while it's somewhat open to the idea that there are other ways of doing things, it is also somewhat dismissive of using other peoples' abstractions.
#!/bin/sh
BUILDDIR=/home/buildhook/.ib-build
BUILD=`grep build |cut -d" " -f2`
if [ -n "$BUILD" ]
then
touch $BUILDDIR/$BUILD
fi
And then the buildhook user has a job that runs every minute by cron: #!/bin/sh
BUILDDIR=/home/buildhook/.ib-build
BUILD=`ls -t $BUILDDIR | head -1`
if [ -n "$BUILD" ]
then
rm -f $BUILDDIR/$BUILD
(
echo Building $BUILD on builder...
ssh builder time ./build $BUILD
) 2>&1 | mail -s "Building $BUILD on builder" build@example.com
fi
For my use case, on this repo, pushing to a branch with the word "build" in its name will trigger a build of that commit, which builds and packages it into a dpkg, and the build server hosts a private apt repository so I can just `apt-get update; apt-get install blah` on all the servers.An alternative strategy is pushing to a different repo on a build server, etc.
If you want to use a callback for this I'd recommend still polling periodically anyway.
(assuming that since HN is mentioned in git repo [0] for the site, the author does read this occasionally)
i'm in my 30s & have been in tech for a decade, how long is this "phase" expected to last? ;)
> I very much doubt it’s the case that the commenters have all been forever wise
representing and sharing my internal, authentic self with the world _is wise_ imo. i think the world deserves more expressions of authenticity.
i don't stuff of my personality into a shoebox before presenting myself to the world on _my own website_. if it seems a little manic or expressive, well, that's because i am a little manic and expressive.
To be honest the next phase could well be described as old and boring. It’s certainly a phase in which the positive side is being more confident in oneself, but on the other hand being much less malleable to the dynamics of the world around you.
The next change will come from within so one could argue it’s almost deterministic from here onwards. Set your course well!
You are right that nobody is beholden to creating pages that can be viewed on any device. However, it is not unreasonable to say that a person has mismatched interests when they say they care a lot about quality, interoperability and values in general, but then don't care about making the document explaining this viewable on most devices.
Yes, ultimately it's not important. But if you only publish your website using Gopher, at some point you have to accept that you're interested by making cool things rather than the other things mentioned.
That’s irrelevant. Most of the Web users are using mobiles, so if you decide to set a website up, the very basic thing is to ensure it’s readable on mobile. And since plain HTML is already readable on any device by default, it would be quite strange to voluntarily make it unusable on these devices.