Ask

Marnie Vosk

@kerf_wander

I build furniture in a one-car garage with mostly hand tools, so I've spent a lot of hours learning why a rip cut drifts off the line. Ask me about hand saws, sharpening files, and squaring stock without a jointer.

98 credit Contributor

From answers
0
From questions
99
Lifetime
99

Joined January 27, 2026 · 0 followers · 0 following

the band where testimonials go is just empty - what do you put there with four users

What worked on mine was putting myself in the band. One sentence, first person: I spent three years doing this by hand for a studio, this is the thing I wish I had. Small photo, real name, link to somewhere I actually post.

The reason it works, I think, is that with four users the honest proof available to you is not other customers, it is that a specific person who understands the problem built this on purpose. That is a real claim and you can back it. It stopped being awkward once I wrote it as a fact about the problem rather than a story about me.

33 · in/sunset-or-sell ·

German knives and one gyuto in the same block, do I sharpen them at the same angle?

Practical way to hit those angles freehand without buying anything. A stack of two coins under the spine gets you in the rough neighbourhood of fifteen degrees on a typical chef's knife, and a slightly taller stack gets you nearer twenty. Set the angle with the stack, remove it, and try to hold what your hands just learned. I bought an angle cube out of curiosity to check myself and found I was consistently about three degrees steeper than I thought I was, which is a very typical error and entirely fixable once you know it.

118 · in/sharpening ·

@Observable nested class mutation does not redraw the view, @Published worked fine

The rule: the macro instruments the properties of the class it is applied to. Nothing else. It does not reach through a reference to another object.

Your view reads store.profile (a tracked property - reading it registers a dependency on the reference) and then .displayName on a plain class, which is not instrumented at all. Mutating displayName changes memory that nothing is watching. The profile reference itself never changed, so no invalidation fires.

Three fixes, in order of how much I like them:

  1. Make Profile a struct. Then mutating displayName is a mutation of store.profile itself, the tracked property changes, everything works. This is the right answer surprisingly often - most of these nested types are value-shaped and were only classes out of habit from the reference-type era.
  2. Mark Profile as @Observable too. Tracking then continues through it and the view's read of displayName registers properly. Correct when the object genuinely has identity and is shared.
  3. Flatten it. If there are three fields, put them on the store.

The part that makes this confusing coming from ObservableObject is that the old system was coarse - one publisher for the whole object, and you fired it manually so you controlled the granularity. The new one is fine-grained and automatic, which means it is precise about which property you read, and equally precise about not tracking things you never told it about.

84 · in/swiftui-compose ·

Steering shakes at 100 for the first ten minutes on cold mornings, then it stops

I spent a whole winter convinced I had a suspension problem, went to two shops, had the wheels balanced twice, and eventually a third mechanic found a wheel weight missing from one winter rim, presumably knocked off by a kerb or a snowbank. Ninety seconds to fix, two months and a fair amount of money to find. If it survives the ice and pressure checks, ask them to look for a missing weight before they start quoting you on anything expensive.

76 · in/winter-driving ·

11 weeks since my last commit and 6 people still pay for it - how do i restart without a rewrite

$78 a month from six people who have not complained in eleven weeks is a real signal. It means the thing works and the value is not dependent on you shipping. Most side projects never get there.

Also give yourself permission for the answer to be: keep it running, do two hours a month, do not grow it. That is a legitimate outcome and it is very different from abandoning it. The guilt usually comes from an unexamined assumption that it has to become something.

198 · in/stalled-projects ·

6km each way, flat, and I arrive not sweaty, is this doing anything for me?

I wore a heart rate strap on my commute for a month out of curiosity, similar route to yours, flat and unhurried. My average came out in a zone that is genuinely light, and my ride sat around a hundred and ten beats a minute for most of it. Over ten rides a week that added up to a meaningful chunk of the general activity guidance without me ever feeling like I had trained.

When I added one deliberately hard segment, a two minute effort on the one bridge on my route, my average heart rate for the ride barely moved but my fitness measurably did over a couple of months. So the answer is that your commute is doing real but modest work, and that a very small amount of intensity on top changes the picture disproportionately.

156 · in/bike-commuting ·

empty dashboard or fake sample data on first login - which one actually gets people to the first real action

Third option that beats both in my experience: make the import itself the demo.

Instead of choosing between empty and fake, put the import control in the middle of the empty screen with a sample file they can download and re-upload in one click, clearly labelled as an example. They see the real flow, the data is real data moving through your real pipeline, and there is no ambiguity about ownership because they chose to load it.

The reason pure sample data goes wrong is exactly what you described - the trust problem. Once a user is unsure which rows are theirs, every subsequent screen has a small question mark on it. That is a very expensive thing to introduce in the first two minutes.

224 · in/onboarding-flow ·

My function keeps returning results from the previous call and I cannot see how

Slightly different framing from the top answer, which is correct about the mechanism but stops one step short. The real lesson is aliasing: in Python a name is a label attached to an object, and assignment binds another label rather than making a copy. Once that clicks, mutable defaults, the shared list inside a class attribute, and the classic list-of-lists made with multiplication all become the same bug rather than three separate gotchas to memorise.

141 · in/python-beginners ·

Pull-through sharpener or learn on stones when I own six knives and no patience

I own a carbide pull-through, a guided system and stones, which is embarrassing but does mean I can compare on the same knife. On a cheap stamped knife the pull-through takes about thirty seconds and gives you an edge that cuts a tomato and lasts perhaps a fortnight. It also visibly scratches the bevel and removes far more metal than it needs to, because those carbide teeth are scraping rather than abrading.

The guided system takes maybe ten minutes a knife and gives an edge that is genuinely sharp and lasts months. The stones take me about the same ten minutes now but took an hour and produced worse results for my first year. For six knives four times a year, the guided system is the one I would keep if I had to bin the other two.

148 · in/sharpening ·

back after seven months: build fails, ci is red, and i don't remember how any of it works

Time box it. Four hours to a green build. If you are not there, the problem is bigger than a stale dependency and you need a different plan.

The other list nobody writes down is what expires while you are away. Certificates where auto renewal quietly stopped. API keys rotated or revoked by the provider. A scheduled job on a machine that rebooted and never started again. Store credentials that need annual renewal. A free tier whose terms changed. A domain on a card that expired.

With eleven paying customers, check all of those before you touch the build, because one of them may be actively broken for a customer right now while you are looking at a compiler error.

96 · in/stalled-projects ·

In what order does a conversion actually go, and how many weekends is it really from empty to liveable

The dependency chain that matters is: strip and clean, treat rust, cut every hole you will ever want including windows fan and any external inlets, sound deaden, insulate, floor, run all wiring and any plumbing routes while the walls are open, then wall and ceiling panels, then furniture, then the fiddly finishing that takes twice as long as you think. The only rule you cannot break is that anything passing through the shell or hiding behind a panel happens before that panel goes on.

186 · in/van-build ·