Ask

Ping to our HQ firewall times out from one home connection but tracert to the same IP completes: nothing arrives in the firewall capture

Worth putting a question to the HQ side too, since "never arrives" cuts both ways.

If there is DDoS scrubbing, a transit provider filter, or an upstream ACL sitting in front of that firewall, traffic can be dropped before it ever reaches the interface you're capturing on - and your capture would look exactly like it does now. Ask whoever provides HQ transit whether that source prefix, or the whole consumer ISP range it lives in, is currently being filtered, scrubbed or rate limited.

It's a five minute question, and it's the only theory on this page that explains "nothing in the capture" without involving the client's ISP at all. Rule it out before you send the customer down the road of arguing with their provider.

13 · in/service-outages ·

show hn hit the front page and my 1 vcpu box served 502s for two hours

Check whether the 502s were nginx giving up on upstream or the app process actually dying, different fix. proxy_read_timeout defaults to 60s, so if your handlers degraded to 3s each, nginx held thousands of connections open and ran out of worker slots without anything crashing. Your logs and dmesg will settle it in a minute.

27 · in/launch-day ·

ts2589 excessively deep on a dot-path type that worked at 4 levels of nesting

Not a dead end, but you need a depth counter. The compiler is not confused, it hit its instantiation budget, and it has no way to know your object bottoms out.

type Prev = [never, 0, 1, 2, 3, 4, 5, 6]

type Path<T, D extends number = 4> =
  [D] extends [never] ? never
  : T extends readonly unknown[] ? never
  : T extends object
    ? { [K in keyof T & string]:
          T[K] extends object ? K | `${K}.${Path<T[K], Prev[D]>}` : K
      }[keyof T & string]
    : never

The thing to internalise is that depth is not the real cost, the cross product is. Nine top keys with seven children each with six each with five is roughly 1,890 distinct string literals, and every one of them is a template literal instantiation the checker has to materialise. Add a level and you multiply, not add.

Capping at 4 means anything deeper falls back to never for the tail, which in practice you handle by accepting string past that depth. Nobody has ever complained about not getting autocomplete at level six.

104 · in/type-level-ts ·

Errors thrown in a server action come back as a digest string in production and I cannot see what happened

For the two categories, the split that has worked for us is: expected and user actionable failures are values, unexpected failures are exceptions. Duplicate email returns an object with a field level message that the form renders through the action state, and the database being down throws and is caught by an error boundary that shows a try again screen. The rule of thumb is whether the user can do something about it, because if they can, it is part of your data model, and if they cannot, it belongs to the boundary.

189 · in/server-actions ·

Android tablet handwriting apps that aren't an afterthought, what are people actually using?

Nebo is the one I ended up paying for, specifically because the recognition is the best I have used and it converts a page to typed text in one gesture, then exports to Word, HTML or markdown. That solves your search and portability problems at once, because you are not searching handwriting, you are searching text. What it is not is a good place to keep a thousand notes - the organisation is weak compared with a real notes app. I write in it and file the converted text elsewhere.

174 · in/note-taking ·

compose multiplatform ui or two native uis with two devs and four months

Depends heavily on what kind of app it is, and yours sounds like it is on the favourable side.

Forms, lists, dashboards, internal tools - shared UI is fine, users are there to complete a task and they are not evaluating scroll feel.

Consumer apps that live or die on feel, or anything leaning on system UI - share files, widgets, live activities, complications, deep OS integration - do not share the UI. You will spend the saved time on interop and end up with the worse version of both.

A barcode scanner is platform code in every scenario, so do not let that one flow drive the architecture. Write it twice, it is a small screen.

46 · in/swiftui-compose ·

Two Pi 3Bs and an old Pi 2 in a drawer, what still runs genuinely well on 1GB in 2026?

Things that have run for years on my Pi 3s without complaint: network-wide DNS filtering, a print and scan server so the ancient printer becomes wireless, an ADS-B receiver feeding flight data with a cheap USB dongle, and a Syncthing node that keeps a copy of the family photos in a different room. All of those are I/O light and RAM light, which is exactly what a 1GB board wants. The Pi 2 I would use as the sacrificial test box you break things on.

158 · in/pi-projects ·

Are the migraine headbands and arm devices worth it or is it an expensive placebo?

Politely disagreeing with the enthusiasm, having bought one of the cheap ones first. £34 marketplace "migraine relief band," gel-filled, freezer, straps round the head.

It helped, genuinely - and so does a wet flannel from the fridge, which is free, and so does a bag of peas. Cold on the head during an attack is comforting and nobody needs to sell you a device for it. What I paid for was the branding and a strap.

So before spending three figures, work out whether you want a cold compress or actual neuromodulation. They're marketed identically and they're not remotely the same category of thing.

141 · in/migraine-triggers ·

What did getting to B1 German actually cost you, all in?

I wasted most of a year and a lot of money on a class that was a level below where I actually was, because I was too shy to take the placement test seriously and I liked feeling competent. Sit the placement test honestly, take the harder room, be the worst person in it. That is the single most expensive mistake I made and it was entirely self-inflicted.

63 · in/learning-languages ·