Design fix rather than a type fix: make the function take what it needs. send(email: string) instead of send(user) reaching three levels into an object. Roughly half the narrowing pain I review comes from functions that accept a big object and then have to defend against every optional field on it.
Mitch Varela
@deadbug_wiring
I build small analog circuits on perfboard because I like the way they look. Op amps, power supplies, and a mild fear of anything above 48 volts.
53 credit Contributor
- From answers
- 0
- From questions
- 54
- Lifetime
- 54
The build break is the clue. In a file with 'use server' at the top, every export has to be an async function, so exporting a const of any kind fails by design. maxDuration is route segment config, which means it belongs in the page, layout or route handler that the request goes through, not in the module where the action is defined. A server action runs inside the request for the route that invoked it, so it inherits that route's duration, and putting the export on the page that hosts the form is what actually changes anything.
Once the fire is out, check whether the bad bundle wrote anything persistent. If 1.5.0 migrated the shape of anything in local storage, rolling the JS back leaves those 812 devices holding data from the future, and the old code will read it and do something interesting.
That is the part that shows up three days later as a mysterious crash on a small number of devices you cannot reproduce.
Local is green because you have an android/ folder that was generated at some point in the past and has been carrying stale merged resources and a warm Gradle cache ever since. EAS prebuilds from nothing every single time, so it is seeing your actual current dependency graph and you are not.
Reproduce it properly:
npx expo prebuild --clean
npx expo run:android --variant release
You will get the same failure, on your machine, with a debugger and no queue.
Then the real work is finding the two packages shipping the same drawable name. ./gradlew :app:dependencies and look for the same library appearing at two versions, which is usually one direct dependency and one dragged in transitively by something that has not been updated in a while.
It is not, and in a managed project you should not be setting that directly anyway - expo-build-properties exists precisely so the SDK levels stay consistent across prebuilds.
Changing platform SDK levels to resolve a filename collision is rolling dice. Sometimes the dice land right and then you have a project configured by accident.
Adding one: check whether the SSD is a real NVMe drive or a cheap cacheless one. Mine crawled once the write cache filled, which you notice the first time you move a Blender project folder around.
This is the actual answer. I went from about 12 builds a week to 3 purely by being honest about what needed a binary, and I stopped caring about queue times entirely.
Numbers from a 16GB card so you know what the arithmetic looks like:
- 32B Q4_K_M: 19.9GB of weights. Does not fit, 14 layers to CPU, about 4 tok/s.
- 14B Q8_0: 15.7GB. Also does not fit once you add the cache, about 9 tok/s.
- 14B Q6_K: 12.1GB. Fits with 8k context, 34 tok/s.
- 14B Q4_K_M: 9.0GB. Fits with 32k context, 41 tok/s.
Q5_K_M and Q6_K are where most people settle - the measurable quality loss against Q8 is small and the memory saving is what lets you keep the whole thing resident.
Going to defend the webcam mic slightly. For meetings - not recordings, not streams - modern noise suppression in the major conferencing apps is genuinely good, and nobody on a work call is listening for tone, they are listening for words. If nobody has complained in ten calls a week, you may be solving a problem that only exists when you compare yourself to two hobbyists. Spend the money if you want to enjoy your own voice, not because the calls are failing.
I reinforced a bad chaturadanga for about a year - elbows flaring wide, shoulders dropping below the elbows - because it let me get through the sequence and nothing hurt at the time.
Then my shoulder started clicking and complaining on anything overhead, and it took a physio, six weeks off pressing, and relearning the pose on my knees to sort out. The video teachers all said the right words about it. Hearing the cue and doing the thing turned out to be very different.
So: home practice works, and the repeated load-bearing poses are the ones worth having checked.
v4 emits the whole utility set now, that is the design change. The size is expected and you cannot tree-shake it.
Same conclusion here. The dashboard is for alarms, the note is for decisions, and mixing the two produces a wall of charts nobody acts on.
And check it after an unplanned reboot specifically. Everything looks perfect until the power blips, then the machine boots with last known time and half your schedule slides.
Do not rule out power just because the CPU stays up. Wifi transmit bursts are where the current spikes, and a thin micro USB cable dropping half a volt will crash the wifi firmware while the rest of the board carries on writing files. That matches your symptom better than most software explanations. Try a short thick cable and a supply you trust before you go deeper.
If you have exactly two contexts and you know which one you are in at the route level, honestly just pass compact. Container queries are great, and this specific problem might be a boolean.
Anything importing next/headers or your database is server only, mark it as such and let the build tell you. Data down as props, directive at the leaves, children as the escape hatch.
Twice a day misting at 80 percent with a fresh tank and no animal is probably more water than you need. You can back off to once a day, or once every other day, and let the substrate handle the humidity. Constant surface wetness on the wood feeds exactly what you are seeing, and cresteds do better with a proper wet and dry cycle than with permanently damp.
The nobody could say why line is exactly the fear. Booking a day and doing four songs.
Not quite. The interop layer lets old-style modules run under the new architecture, which is a different thing from running two architectures side by side. It is one flag for the whole app, and then a per-library question of whether that library survives the transition. Worth being precise about because "per module" makes it sound like there is a safe partial state, and there is not.
Find out what "not supported" means for that specific library before you decide anything, because the phrase covers two very different situations.
If it is a native module with no UI - which most bluetooth libraries are - the interop layer usually carries it fine and the readme is just a sentence nobody updated in eighteen months. If it ships a custom view manager that reaches into internals, that is the genuinely broken case.
Branch, flip newArchEnabled, build, run your bluetooth flow on a real device. One hour. That hour is cheaper than either decision made blind, and you will spend more than an hour reading opinions about it.
Alkaline in a cold garage is a bad time generally. I switched every outdoor and garage sensor to lithium two winters ago and the mystery dropouts stopped even where I never changed anything else.
Self-hosting is always cheaper. It is a users table and a sessions table, that is the whole thing.
You can shrink a free tier later for new signups and grandfather everyone existing, and you can grow it later for everyone at once. Both directions are survivable. So the cost of picking wrong is much lower than the cost of spending another three weeks deciding. Ship the 3 and watch where people stop.
Skill first makes obvious sense now it's written down. I've been doing my best ring work in the most tired twenty minutes of the week and then wondering why the holds never improve.
This is the answer I was quietly afraid of. I'm doing rows heavy and then ring rows and pull-ups after. So that's three pulling exercises in one evening, twice a week.