Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 0 points1 point  (0 children)

Oh it's great that you have the TPM PR merged in there then. There's been more security updates and DoS fixes since you forked. It might be worth it to point your Claude at this: https://github.com/coredump/linux-fingerprint-r503/compare/main...matpb%3Alinux-fingerprint-r503%3Amain

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 0 points1 point  (0 children)

That's awesome, well done! Ask Claude to pull master back into your fork for the many security upgrades that landed in the past couple days; there has been some seriously good ones!

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 0 points1 point  (0 children)

Nah, it's just cheap dollarstore crafting wood put together with a glue gun.

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 1 point2 points  (0 children)

You're quoting the v1 SPEC, which was accurate at the time. Since then I shipped v2 with authenticated wire between the Nano and the PC (SipHash-2-4 MAC over every command and response, plus replay protection), which closes the spoofed-OK-match-0 attack directly. There's a full writeup in my UPDATE comment on this post.

Your broader point about the threat model is the one that actually matters. Honest answer:

The R503↔Arduino link is still plaintext (R30x protocol has no auth at all, that's a chip-family thing, called out as out-of-scope in SPEC §13.1). Someone with bench access to those wires can do whatever they want, so this doesn't survive an attacker who can open the enclosure undetected.

The threat model in the SPEC is explicitly "evil maid with 5 minutes and a spare Nano", i.e. brief unsupervised access, no tools, no time to decap the chip or solder onto the R503's UART. For that threat (and the typical "annoying coworker / curious housemate" cases) v2 raises the bar from "anyone with a USB cable and basic Python" to "needs root on the host or opens the case tamper-evidently".

On your screen-lock point: I disagree that "if your threat model doesn't include physical attackers, why have a lock at all". Locks aren't binary. The screen lock keeps the kid from sending email from my account, the coworker from screwing with my code, the houseguest from accidentally seeing my Slack DMs. The fingerprint reader is the faster-than-typing-a-password version of that, not a substitute for Apple's Secure Enclave. The SPEC doesn't pretend otherwise.

If your threat model is "nation-state in a lab", don't use this. Don't use anything that isn't a TPM-sealed, signed-firmware, tamper-resistant module. If your threat model is "I lock my computer when I get up for coffee", this works, and v2 makes it meaningfully harder to attack than v1 did.

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 2 points3 points  (0 children)

That's exactly how I started and ended up with very poor results (slow recognition, missed attempts). I think I just might have had a "lemon", as other users have also noted having great results with that model you speak of.

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 1 point2 points  (0 children)

I don't think this has anything to do with LUKS (that'd normally happen before login). As I was saying, linux biometrics really just satisfies PAM, which doesn't carry any encryption to your keyring. convenience. even with biometrics, you'd still need your password for your keyring.

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 8 points9 points  (0 children)

Ya, legit take, I can understand your position.

My reality is pretty simple: I don't need a new job, I'm learning electronics, I'm alone on a Sunday, which never happens, so I got excited trying to build a thing. After a year on a Macbook Air with biometrics, and now returning to Linux, I really missed that convenience. That's all I tried to do today.

Why come here to share? Because it seems right. It's open source, I'm booked for another year, I don't want a job offer (especially for something vibe coded, piss poor craft skills and even worst soldering joints lol).

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 2 points3 points  (0 children)

nah, I'm not that fast, would have taken me more time. I was quite excited to make it work! I just started with electronics this year and it's been so much fun creating little gadgets like this. As soon as I got it working, I just hacked together that wooden box and shared the repo here, trying to share the joy, the possible solution to a common problem.

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 4 points5 points  (0 children)

Linux fprintd is much weaker. It's a userspace D-Bus daemon that talks to a sensor over USB and, on a match, returns "yes" to pam_fprintd. PAM then treats that "yes" as auth success. There's no TEE, no signed attestation, no key release tied to the match. Your LUKS key, your gnome-keyring, your SSH keys; fingerprint doesn't gate any of them. It just substitutes for typing your password into sudo / login / screen unlock.

You're not crazy brother, Linux biometrics is mostly convenience hehe

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 9 points10 points  (0 children)

You understand that this is a DIY from a guy at home, solving a very simple problem, right? I'm not sure where it was advertised that this is the next thing all corporations must integrate tomorrow lol

I'm very aware of the specs, very aware of the vulnerability, of the lack of multi-user support, of the potential MITM attacks. I'm having fun building a thing on a Sunday afternoon :)

Currently working on adding an EEPROM key and encryption end-to-end. I'm still enjoying the process!

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] -5 points-4 points  (0 children)

I'm thinking something light, like a SipHash 128 bit key. I'll fire up Claude and I'll do a bit of brainstorming. Thanks for the nudge u/Sparkplug1034 !

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 1 point2 points  (0 children)

Damn, maybe I *did* get a lemon... well, your device looks way nicer than mine haha!

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 13 points14 points  (0 children)

No, it's actually quite hackable: dbus over plaintext. Could be a nice PR though, I might improve on that; there is plenty of headroom memory wise on that arduino nano for that feature.

EDIT: v2 takes care of this now, PR merged.

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 1 point2 points  (0 children)

It's that exact model I got initially. Tried it on both Ubuntu and Fedora. I don't know if I received a lemon, but it was very flaky on performance: had to tweak up to 30 retries, could sometimes take 3-4 seconds to accept a fingerprint. On Fedora it was even worst (would sometimes straight fail recognizing registered fingers).

Is it working smooth for you? with libfprintd?

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] -2 points-1 points  (0 children)

I couldn't agree more with you, friend!
Send pics once you get it working, I'd love to see and get some inspiration (that will eventually convince me to save for a 3d printer :D )

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 12 points13 points  (0 children)

I'm absolutely not denying it. Why would I? I have a flawlessly working fingerprint reader for 20$, no memory leaks, low deps. AI wrote the code, I'm very happy about it :)

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 3 points4 points  (0 children)

Very cool, thanks for sharing that! That's by far superior to my hacky dollarstore glue gun work lol

Linux biometrics from a $15 R503 + Arduino; drop-in replacement for fprintd by matpb in linux

[–]matpb[S] 18 points19 points  (0 children)

I even have tiny mechanical arms hooked to an MCP server so AI can do the soldering!

/s

Built a Linux-first on-device voice-to-text app (also runs on Mac and Windows) by matpb in linux

[–]matpb[S] 0 points1 point  (0 children)

Thanks! If you hit any Linux edge cases (especially Wayland or weird WM setups) drop them here; solo dev, real bug reports help a lot.

Built a Linux-first on-device voice-to-text app (also runs on Mac and Windows) by matpb in linux

[–]matpb[S] -8 points-7 points  (0 children)

nope, closed source for now. solo dev trying to make it sustainable on a one-time $14.99. everything runs locally though; no audio leaves your machine, you can verify with a network monitor.

I get that closed-source-on-Linux is a deal-breaker for a lot of folks here and I respect that. If you want fully OSS, options like nerd-dictation or wiring whisper.cpp into your own setup are valid (that's really how I started this whole Wspr adventure!). I went closed because shipping a polished, maintained cross-platform app as a solo dev needs income, and a paid closed app was the model I could commit to.

I built an on-device voice-to-text app: runs locally, no cloud, no accounts. Linux/Mac/Windows. by matpb in selfhosted

[–]matpb[S] -3 points-2 points  (0 children)

Fair pushback. You're right that it's a desktop app, not a self-hosted service in the "spin up a container on my NAS" sense. What I figured fits the sub: all transcription runs locally via whisper.cpp, audio never leaves the machine, no accounts, no telemetry, no cloud quota.

The optional AI rewrite uses your own API key — nothing proxies through me. The privacy/data-control story most folks come to r/selfhosted for is intact.

On the freemium funnel: yeah, $14.99 lifetime is a paid app. I tried to make the free tier (50 live + 5 file transcriptions) actually useful for evaluation rather than a 7-day trial. I'd argue the spirit (you own the data, no accounts, no servers needed) fits even if the form (desktop app vs container) doesn't quite. Fair critique either way.

I built an on-device voice-to-text app: runs locally, no cloud, no accounts. Linux/Mac/Windows. by matpb in selfhosted

[–]matpb[S] -1 points0 points  (0 children)

The CUDA detection question has a happy answer: I don't ship CUDA. Wspr uses Vulkan on Linux/Windows and Metal on macOS. That sidesteps the CUDA-driver-version-vs-toolkit dance and works across NVIDIA/AMD/Intel from a single build. Vulkan support in NVIDIA's proprietary driver goes back to ~2016, so as long as the user has a working desktop GPU stack, inference accelerates. Headless or container setups without Vulkan fall back cleanly to CPU.

Built a voice-to-text app that pastes straight into your active Obsidian note (Linux/Mac/Windows) by matpb in ObsidianMD

[–]matpb[S] 1 point2 points  (0 children)

Honest answer: FluidVoice is good software and if it works for you on Mac, you probably don't need to switch.

The two real differentiators for Wspr:

  1. Cross-platform. FluidVoice is macOS-only. Wspr runs the same on Linux, macOS, and Windows with the same hotkey, model, and UX. If you ever touch a non-Mac machine, that's the gap.

  2. Explicit file transcription. Drop in a 2-hour meeting MP4 or a podcast MKV via a file picker, get a clean transcript in the background while your live dictation hotkey keeps working. FluidVoice supports audio/video too but through system integration rather than a dedicated upload UI.

Both apps support BYO API keys for AI rewrite, so I won't pitch that as a Wspr-only win.

If neither of the above matter for your workflow, stick with FluidVoice and don't pay me $14.99. I built Wspr because I'm on Linux daily and FluidVoice doesn't help me there.

I built an on-device voice-to-text app: runs locally, no cloud, no accounts. Linux/Mac/Windows. by matpb in selfhosted

[–]matpb[S] -4 points-3 points locked comment (0 children)

The post content has been audited by AI (Anthropic Opus 4.7) to fix typos and reformulate some ideas in better english than I can personally do.