HNHacker News
TopNewBestAskShowJobs

dceddia

3,334 karma · joined March 5, 2014

Making video editing faster with Recut https://getrecut.com

Blogging about React and JS at https://daveceddia.com.

Author of Pure React.

dave@daveceddia.com or @dceddia on Twitter

submissionscomments
dceddia··on Building a Waitlist (The Wrong Way)
> applying Adobe Lightroom presets (image filters) on many images quickly and cheaply

This sounds to me like a thing people might pay for.

But I would (strongly) guess most photographers don’t know what an “API” is or why they’d want to pay monthly for one, or how to wire up “curl” to it somehow. People who know that stuff will cobble this together in a script.

As a simple desktop app I could see a utility like this doing well in that audience though. $29-49 one time payment, apply all the presets you want, save lots of time.

dceddia··on Building a Waitlist (The Wrong Way)
I’ve signed up for waitlists and bought things from some of them, and I’ve launched products to waitlists I built (and made some sales on launch day).

I think a few things helped with that, but one difference that stands out is where the subscribers came from. Mine were mainly from Twitter or people already reading my blog, so they already knew who I was to some degree and had some reason to believe I could help them. It’s a much harder job to sell to random people who came from an ad, who start off with a lot less trust. Any missteps in the copy/problem you solve/etc are magnified because random people are just looking for any reason to hit the back button.

dceddia··on Show HN: I made a Mac app to search my images and videos locally with ML
Just as a data point, I've sold one-time-purchase desktop software for a few years and refunds have been pretty few and far between.

I understand the fear that a bunch of people will buy it and immediately request a refund because what's to stop them! but that hasn't been my experience, and I think having a generous refund policy engenders some good will and leads to more sales.

(of course if you've actually had problems with this, disregard! :)

To address the GP's comment though - I don't know the legalities behind this, but I remember buying physical software, in boxes, from stores, where the policy was "once you open the box/break the plastic seal you can't return it" and in the digital realm it seems like downloading would be the closest proxy to that. I just think concerns about this sort of dishonesty are pretty overblown, especially on the scale of indie software.

dceddia··on Multiple Planes Cross Runway While Another Is Taking Off [video]
As a private pilot with a level of experience not even in the ballpark of these professional pilots, I can say you get used to it. The “trick” is that most of these phrases are expected, and they come in a certain order, at certain times. It’s a bit like running a decision tree in your head. So e.g. you as the pilot would know that, as you’re taxiing up to the runway for instance, they’re probably gonna tell you to hold short, or to line up and wait. If it’s mumbled that’s fine, you get it.
dceddia··on Embeddings are a good starting point for the AI curious app developer
I was reading this article and thinking about things like, in the case of doing transcription, if you heard the spoken word “sign” in isolation you couldn’t be sure whether it meant road sign, spiritual sign, +/- sign, or even the sine function. This seems like a similar problem where you pretty much require context to make a good guess, otherwise the best it could do is go off of how many times the word appears in the dataset right? Is there something smarter it could do?
dceddia··on The Arc Product-Market Fit Framework
Good ideas here, thanks!
dceddia··on The Arc Product-Market Fit Framework
Yeah I’m not sure where mine fits either. I have a video editor that removes pauses, saving lots of editing time for (certain kinds of) videos/podcasts. I would say I hear from 3 kinds of customers:

- They know about tools like mine and have compared a few

- They have had this problem for a while, decided to Google it one day, and found my Recut app

- They stumbled on it randomly via social media and say things like “where has this been all my life”

I would guess that some people from all 3 groups would describe it as Hair on Fire, but they have different levels of awareness of solutions. Maybe they just live with it as a Hard Fact, maybe they live with it because they know of solutions but don’t like them (of the flavor “I want to automate this but I don’t want to lose all creative control to AI”).

It’s tough to find good ways to get in front of the people who aren’t looking! It feels like that way lies a lot of broad/expensive advertising.

dceddia··on Dioxus 0.5: Web, Desktop, Mobile Apps in Rust
I initially ran into that issue too (sending frames over IPC was not gonna work!) so I create a native OS-specific overlay and draw on it with wgpu.

The IPC layer has been a bit annoying and I'm looking forward to Tauri 2 where that'll get faster. I've worked around it for some stuff in the meantime by using a custom protocol and serializing stuff to binary.

dceddia··on Dioxus 0.5: Web, Desktop, Mobile Apps in Rust
Ohh sorry, I misunderstood what you were saying there. I'm just using Svelte in TypeScript and running it in the browser so it doesn't need to do the WASM step.
dceddia··on Dioxus 0.5: Web, Desktop, Mobile Apps in Rust
> Tauri also forces your frontend to compile to WASM

I’ve been using Tauri (1.x) for a couple years shipping a video editor and I don’t think this is true? I went searching to verify and I couldn’t find anything saying it complies to WASM (or at least not that it requires compiling to WASM). Can you point me to where you saw this?

dceddia··on Show HN: I made a free animator. Think Adobe Illustrator but for animation
tldraw could be a good example to look at. It’s an open source infinite canvas drawing app: https://github.com/tldraw/tldraw

The live version is at https://tldraw.com

dceddia··on Show HN: Citadel – a Calibre-compatible eBook management app
Very nice! It’s great to see another Tauri + Svelte project too. I’ve been building a video editor with that stack for a while now and it’s been pretty awesome.
dceddia··on Studies suggest that relying on will power to break habits is hopeless (2019)
Run a few test theories and see what resonates. Are you the kind of person who goes to the gym every day? Are you the kind of person who works on their hobbies at night? Are you the kind of person who binges Netflix between dinner and bed? Are you the person who cooks dinner from scratch, or orders takeout at every chance? etc. I think of them a bit like stereotypes but applied to myself, and see if I think I fit.
dceddia··on 9 years of Apple text editor solo dev
I went through this decision a few years back (end of 2020-ish) and decided to go with Swift because it seemed SwiftUI wasn't really far enough along yet, and some experimentation with SwiftUI caused me to agree.

I wanted to avoid Objective C, largely because I liked the safety of Swift (optionals, if let, guard let, etc) to make it less likely that I'd introduce crashes.

The funny thing I found was that I ended up needing to know how to at least read Objective C code anyway, because like you say, the docs use a lot of it. StackOverflow had a lot of it too. So I had to get good at translating between the two.

Unlike the web dev world I was used to, there are way fewer Swift/ObjC devs out there, and the answers are fewer and less up-to-date.

dceddia··on Challenges with semantic search on transcribed audio files
Interesting problem and a good write up! This reminds me a little of audio processing where there are 2 representations, time domain and frequency domain. I’m no expert at this but my understanding is if you want to search for “when” some chunk of audio happened, you first need to convert to the frequency domain via Fourier transfer. But then you lose the time info. So you can’t just take the Fourier transform of the whole file, or even 10 second chunks… you have to take a bunch of short overlapping Fourier transforms – overlapping so you get the nearby context, and short so that you have a higher resolution idea of when something occurred.

I wonder if a similar idea would work here, where you could search at various “zoom levels” - first search for an entire video that’s nearby in terms of embedding, then search within 50%-overlapped 60-second chunks, then within 50%-overlapped 1-second chunks.

dceddia··on Ask HN: Programming Courses for Experienced Coders?
For Elixir specifically, I liked Dave Thomas’ Elixir for Programmers. https://codestool.coding-gnome.com/courses/elixir-for-progra...

For learning about performance and low level stuff, Casey Muratori’s Performance Aware Programming course has been great. https://computerenhance.com

For higher level software design stuff (beyond just GoF patterns), check out James Koppel’s writing at https://www.pathsensitive.com/ and his courses at https://mirdin.com

dceddia··on Show HN: Heynote – A dedicated scratchpad for developers
Yeah, it works pretty well for me. Rust definitely took some getting used to (I was new to it when I started).

There's a lot of functionality you can access from JS without needing to get into Rust, but on the Rust side Tauri has this notion of "commands" for calling Rust from the UI.

You can write a Rust function and annotate it with #[tauri::command], and register it, and then you can call it from the JS side with invoke('your_command_name', args). Those commands can be async too, so you can do blocking work on the Rust side and the UI won't freeze.

You can inject State variables into those commands, which get injected at call time and are effectively global to the Rust side. I would say the State stuff is a bit unergonomic in that you run up against needing to share them between threads, so everything inside them needs to be Arc<Mutex<>> and writing those wrappers was boilerplatey.

I wish the JS <-> Rust calling overhead were lower. It serializes everything to JSON and back, so I try to avoid too many calls, and try to avoid sending lots of data between them.

dceddia··on Show HN: Heynote – A dedicated scratchpad for developers
That makes a lot of sense. I miss a bit of that from Electron. Its auto-updater is nicer, and while I haven't had a ton of cross-browser issues there've been a couple that I had to fix with transpiling or avoiding some newer CSS stuff. Shipping everything with one browser engine lends a lot toward peace of mind.

I wish there was a way to build a stripped-down Electron, like a configurator where you could uncheck things you don't need. Printing support? WebGPU? WebRTC? Video playback? PDF reader? Straight to jail. It would be lovely. I'd love to see what would happen to the bundle size.

dceddia··on Show HN: Heynote – A dedicated scratchpad for developers
This looks awesome! I love the blocks idea. I’m gonna download and give it a try.

I see lots of comments about Electron (per usual here haha) and I just thought I’d shout out Tauri if you hadn’t run across it. It’s basically Electron-but-in-Rust and uses the system webview instead of Chromium, so bundle size and memory usage is reduced a bunch.

I took a look at the code and it looks like you haven’t got a ton of Electron-side code so if you felt like playing with Rust it might not be too hard to swap. I have a video editing app that I started building with Electron and then switched to Tauri midway and it’s been pretty nice.

I hope it’s clear this isn’t a request and please feel free to disregard this comment entirely :)

dceddia··on C Object Oriented Programming (2014)
One thing to look at is ffmpeg in its encoders and decoders. At the bottom of the file there's a struct with pointers to functions (among other things). Anything that wants to do decoding can just call init(), decode(), close() on an AVCodec and the internal functions do whatever they need to do. Here's one from h264.c:

    AVCodec ff_h264_decoder = {
      .name     = "h264",
      .type     = AVMEDIA_TYPE_VIDEO,
      .init     = ff_h264_decode_init,
      .close    = h264_decode_end,
      .decode   = h264_decode_frame,
      ... more fields ...
    };
dceddia··on I bricked my Christmas lights
Nice writeup! It reminded me of trying to reverse engineer some lights I have, only to discover they’re encrypted. One is an amaran 60d and then the rest are a handful of SmallRig RM75 battery LED lights, and I wanted to make a script to turn them all on/off instead of fiddling with 2 separate apps.

I spent a bunch of time trying to reverse engineer the apps and the protocol, and it turns out both of these lights seem to use the same negotiation process but use different libraries to do it. I tried to mimic the Diffie-Hellman key exchange process they do on connection, and then kinda gave up. IIRC there was another step or 2 after that, one where it sent a random-looking number (another key? After sending the first key??) and I couldn’t figure out what it wanted there.

Your writeup makes me think I should just go try that hardcoded key and see if it works…

dceddia··on Ensō: write now, edit later
Fellow Basher here. I’ve heard the advice to “just get it all on the page and edit later” so many times and it has never really made sense to me. I write something like Shlemiel the painter’s algorithm from this old Joel on Software article [0]. Write a bit, reread everything, tweak, write some more, reread everything again, tweak. The re-reading cycles aren’t always back to the very beginning, sometimes it’s just the current paragraph or sentence. But I’d definitely say I edit as I go. I’ve tried not doing this, but I never get very far with that before it starts to stress me out that the writing isn’t coming out right.

And then afterwards, read the thing another 50 times just in case, especially if it’s an email.

0: https://www.joelonsoftware.com/2001/12/11/back-to-basics/

dceddia··on Keyboard Maestro 11
Interesting, maybe they've changed this since I last looked at it. At some point I was pretty sure that Accessibility required unsandboxing, but App Store required sandbox enabled.
dceddia··on Keyboard Maestro 11
Aside from any business/ philosophical reasons they might have, one concrete reason for this is that the App Store prohibits apps from asking for accessibility permissions, needed for recording keystrokes, which I imagine would basically make this app impossible!
dceddia··on Software disenchantment
Nope, it doesn’t do this. A while back I looked into doing a “hello world” version of that - trying to remove the Print feature. To do this, I had to build Chromium, which did actually take like 5 or 6 hours on an M1 MacBook.

From what I could tell of the config files, Chromium is pretty modular. It looks like you could just delete a few lines and have it avoid compiling entire subsystems. But I didn’t ultimately achieve my goal because I couldn’t get it to compile with those changes. IIRC it hit a linker error and I couldn’t figure out what to prune next, and I wanted to get back to actually building my product. (I ended up switching to Tauri anyway)

Part of me wants to revisit that project though. It would be so great if there were custom minimal builds of Chromium for Electron apps.

dceddia··on What is the Demoscene? An interview
I don’t know if you’ve already run across this but you might like Ableton’s Learning Synths site and also Syntorial. They’re both more on the side of learning to program synthesizers than using the DAWs themselves, but I always wished I had learned earlier about how all those knobs worked.

0: https://learningsynths.ableton.com/

1: https://www.syntorial.com/

dceddia··on Piped – An alternative privacy-friendly YouTube front end
The unfortunate answer is that it’s coming, and in the form of the Web Environment Integrity API, aka device attestation. If/when they manage to deploy this to enough devices, they will be able to restrict viewing to only allow ”blessed” clients. It needs hardware-level support, and that has been rolling out for maybe 10+ years now in the form of TPM modules and such.

The future they’re aiming for is that unless you’re using an approved (unmodified) browser on an approved (unmodified) device, you get nothing. It would basically turn large swaths of the internet into a walled garden overnight.

dceddia··on Can't be fucked: Underrated cause of tech debt
Man, the negativity in here is unreal!

I just wanted to chime in and say thanks for writing this, and I feel seen. It describes my daily feelings to a T. I see open source projects with their great test coverage and their principled refactors, and some days I am that person too! I’ll get a burst of Do It Right energy and just knock out a ton of nice well-built stuff. And then one day all of that energy vanishes and, like the author, I CBF. Tests get skipped, code gets bolted into places I know aren’t great, and I just overall start paving the way for something I know Future Dave won’t thank me for. And even though I’m seeing it happen in real time, I don’t have the energy/motivation/whatever-it-is to get back into an inspired Do It Right mode.

(And this is all for software that I write and sell on my own.)

It was inspiring to see that the author is the creator of Lazygit. If you’re reading this, dude I LOVE lazygit so much. I’ve turned friends onto it who love it too. In my mind you’re in the category of open source maintainers who somehow always manage to Do It Right.

dceddia··on Touch Pianist
Hahah yes, yes it was.
dceddia··on Touch Pianist
It doesn’t make sounds on my mobile Chrome either (iOS) but I’ve noticed other sites don’t either. I’m guessing there’s a setting somewhere that I denied once long ago and now it can’t play sounds :/ If anyone knows what that might be please let me know!
← PreviousPage 4 of 27Next →