This is also how I build most of my static sites, usually deployed to GitHub Pages. For example, here’s the demo page for a library I recently developed: https://exogen.github.io/turbo-colormap/
Are all of Next.js’ features overkill for such sites? Sure, but the convenience such frameworks provide is worth it. And the reason to prefer it over something like Vite is simply routing, which Vite doesn’t cover out of the box, so as soon as I want to add a second page, I now have another problem to solve.
Next.js’ best feature is simply that you’re up and running with `npm i react react-dom next` and step two is just writing the pages.
Location: Seattle, WA
Remote: preferred
Willing to relocate: no
Technologies: TypeScript, Python, React, Next.js, Django, Postgres
Resume: upon request
Email: exogen@gmail.com
Your classic web and open source hacker with over 20 years of experience, most fluent in JS/TS and Python. I've tackled a wide variety of interesting problems and domains, e.g. graph isomorphism, query expansion, geocoding, dev tools, performance, data visualization, API design, server-side rendering, entity matching/record linkage, web scraping, games, reverse engineering binary formats, typography, codebase migrations, and more. Both startup and big-corp experience, but I prefer working with small teams.
Ask me about the time a stolen bike led to creating an arbitrary-precision math library and discovering a bug in Mathemetica...
`JSON.parse` actually does give you that option via the `reviver` parameter, which gives you access to the original string of digits (to pass to `BigInt` or the number type of your choosing) – so per this conversation fits the "good parser" criteria.
To be specific (if anyone was curious), you can force BigInt with something like this:
//MAX_SAFE_INTEGER is actually 9007199254740991 which is 16 digits
//you can instead check if exactly 16 and compare size one string digit at a time if absolute precision is desired.
const bigIntReviver = (key, value, context) => typeof value === 'number' && Math.floor(value) === value && context.source.length > 15 ? BigInt(context.source) : value
const jsonWithBigInt = x => JSON.parse(x, bigIntReviver)
Generally, I'd rather throw if a number is unexpectedly too big otherwise you will mess up the types throughout the system (the field may not be monomorphic) and will outright fail if you try to use math functions not available to BigInts.
Sorry yes, i was thinking of the context object with source parameter.
The issue it solves is a big one though, since without it the JSON.parse functionality cannot parse numbers that are larger than 64bit float numbers (f.ex. bigints).
A comment I made when I started noticing the magenta gradient at the end of the progress bar: it's a bit anxiety-inducing for those who remember needing to degauss their monitors, because it looks almost exactly like when you mess up a CRT with a magnet.
(Aside from that: not a fan, it makes the chrome of the video player more distracting.)
I know I sound silly and dumb for feeling so strongly about something so small, but the gradient really gets on my nerves. It is indeed so subtle as to make it feel like something is wrong with the display, but not subtle enough that I don't notice it _every time_.
Similarly, the "glow" they introduced a while back makes it feel like I'm getting the worlds worst backlight bleed.
Mercifully I use FreeTube to watch YouTube which saves me from these design choices.
That glow I think you're referring to is "theater mode" and fortunately it can be disabled on the gear menu. It's incredibly distracting, especially in Firefox it can sometimes be laggy.
I think you mean "ambient mode". Theater mode is like the halfway point between normal-size an fullscreen-size.
As an aside, does anyone know of any good YouTube settings extensions? I usually open YouTube in incognito tabs to avoid the personalization "features", but this means none of my preferences around ambient mode and "stable volume" are saved.
Oh, thankyou for finally naming it. I've had a vague sense of anxiety for months seeing that gradient - like something is wrong and I need to fix it somehow. I just had no idea why I felt that way until I read your comment just now.
It's more overwhelming than underwhelming. There are many more views now than just "photo grid" and "photo detail" and lots of annoying "smart" albums, which have more special treatments than just a grid of album photos. It feels unresponsive and I often get stuck in a view with no idea how to just get back to the camera roll. I often quit the app in frustration hoping it'll just get me back to my latest photos. Probably the most unnecessary update I've ever seen on iOS.
MusicBrainz is great! Every now and then I'll get an email notification that someone has updated an attribute on some obscure local band that I put on there.
ca. 2017 I undertook the considerable task of building a GraphQL interface to MusicBrainz, to support a side project of mine. This was a great experience for learning the breadth of MusicBrainz and how to design things with GraphQL. Sometimes I look at the documentation generated from the resulting schema and wonder when I ever had that much time: https://github.com/exogen/graphbrainz/blob/master/docs/types...
Unfortunately it doesn't seem to support Instagram stories, which is the type of media I find myself wanting to save the most.
OP: in case you weren't aware, websites that do this have been facing legal challenges recently, with some being shut down. I suspect that's part of the reason there's room in the market for yours... while it lasts :(
Sometimes it works, sometimes it doesn’t — I remember seeing a post on Cobalt’s Twitter saying they fixed Instagram support, and then just a few hours later a post saying it broke again…
I don't find reads to be very fast either. I have a lot of photos on my network drive, and opening or previewing them feels like I'm on dial-up or worse. On Windows, scrolling the folder in thumbnail mode renders them pretty smoothly on-demand, while macOS takes ages. Even just trying to open a single JPG from the network often takes 5-10 seconds. I can't even imagine why. I noticed that if I split up the folder into smaller batches and browse those subfolders instead, it's better.
A few months ago I also painstakingly went through and added tags and comments to many of these files. Later, when the network drive was remounted, the comments were all wiped out while the tags remained (presumably, because of the different attribute storage mechanisms the different fields use, combined with the changing mount ID). Maybe that's recoverable somehow, but I simply don't have the patience. To me, it's as good as lost. Thanks, macOS!
At the risk of only being tangentially on topic, I want to recount a story about how sleazy financial institutions will be with their fees if given the opportunity. This happened to me with Fifth Third Bank; I knew it was sketchy as hell and it infuriated me at the time.
On several occasions I would overdraw my debit account, notice the issue and deposit money, and then continue to make purchases with the newly available funds. Despite having sufficient funds, at the end of each day, Fifth Third Bank would reorder the day's transactions to maximize the overdraft penalties, as if all of them had been settled while overdrawn. Their customer support team would pretend this was actually beneficial to customers and launch into a nonsensical explanation where one of the terms involved was, literally, "the matrix." So you'd be sitting on the phone in disbelief as they talked about "the matrix."
Anyway, there was eventually a class action lawsuit over it. Ever since then, my inclination is to regulate the hell out of these sleazy institutions. They clearly can't be trusted to act in good faith.
Or a more complicated app: https://exogen.github.io/t2-model-skinner/
Are all of Next.js’ features overkill for such sites? Sure, but the convenience such frameworks provide is worth it. And the reason to prefer it over something like Vite is simply routing, which Vite doesn’t cover out of the box, so as soon as I want to add a second page, I now have another problem to solve.
Next.js’ best feature is simply that you’re up and running with `npm i react react-dom next` and step two is just writing the pages.