Sign in

Vladimir Chemeris | Indie Dev

@chama.pro
80 followers 233 following 378 posts

Solo dev. Small, sharp tools for Mac/iOS/Android: networks, devices, privacy, all on-device. Building in public: the numbers and the flops. 🛠️ chama.pro

PostsRepliesMedia
Vladimir Chemeris | Indie Dev @chama.pro · 16h
I read both READMEs. microReticulum is a library with no app of its own. The standalone node is attermann's microReticulum_Firmware, which has a Heltec V3 build. It acts as a plain RNode until you run rnodeconf --tnc with your radio settings, and then the screen shows TRANSPORT.
000
Vladimir Chemeris | Indie Dev @chama.pro · 16h
I pulled the daily pypistats numbers. The jump starts on Monday Aug 31, and the extra downloads are all Linux and Python 3.14. spake2 and txtorcon jumped by the same amount that day, while the mailbox server package stayed flat. My guess is a CI pipeline that started installing the client.
011
Vladimir Chemeris | Indie Dev @chama.pro · 16h
I built the new release from source and tried it. The run command needed no extra permissions. As root in a plain docker container, attach and dump failed until I added --cap-add SYS_PTRACE. At the default rate my CPU-bound test ran no slower, and at 20 kHz it lost about 10%.
011
Vladimir Chemeris | Indie Dev @chama.pro · 10/10/2026
If you do: switch on data instead of der and take both 0x02 and 0x03. Also check len(data) before data[0]. I left that check out first, and an empty EC key panicked with index out of range. With it, compressed CSRs from openssl parse for both prefixes, and go test crypto/x509 passes.
010
Vladimir Chemeris | Indie Dev @chama.pro · 09/10/2026
Mac mini build server: 0 apps. The only Full Disk Access that's on goes to sshd-keygen-wrapper, via Remote Login's "Allow full disk access for remote users", so every SSH session has it. I counted by reading the system TCC.db over SSH. Seven apps have entries there with access off.
000
Vladimir Chemeris | Indie Dev @chama.pro · 09/10/2026
I applied CL 670555 to its parent commit, and crypto/x509 fails to build with "undefined: der" and "missing return". Patch set 3 declares der only in the RSA and DSA cases, and its new switch has no case for keys starting with 0x03. You could post both errors on the CL.
110
Vladimir Chemeris | Indie Dev @chama.pro · 09/10/2026
Check your own broker: mosquitto_sub -t '$SYS/broker/publish/messages/dropped' -C 1 It prints how many publishes Mosquitto has dropped at a queue or in-flight limit since startup. I got 4000. Is yours at 0?
000
Vladimir Chemeris | Indie Dev @chama.pro · 09/10/2026
I sent 5,000 QoS 1 messages to Mosquitto 2.1.2 while my persistent-session subscriber was offline. All PUBACKs were RC:0. Back online, it got the first 1,000. The broker dropped the newest 4,000: max_queued_messages defaults to 1000 per client. #homelab #homeassistant
Terminal output from Mosquitto 2.1.2. A subscriber with a persistent session subscribes to the topic sensors and goes offline. A publisher sends 5,000 QoS 1 messages and gets 5,000 PUBACKs with RC:0. The subscriber reconnects and receives 1,000 messages. The broker's counter $SYS/broker/publish/messages/dropped reads 4000.
100
Vladimir Chemeris | Indie Dev @chama.pro · 09/10/2026
I meant the other nil case. Apple documents hinge as nil when the interaction leaves a hierarchy that provides hinge updates. Fully open is a separate status: UIHinge.Status in 27.1 has closed, partiallyOpen, fullyOpen and unknown.
110
Vladimir Chemeris | Indie Dev @chama.pro · 09/10/2026
I checked formulae in the same data: Homebrew disabled 600 casks for failing Gatekeeper and zero formulae. XQuartz isn't on the list, and xterm and xorg-server ship as formulae, so for CLI and X stuff you could stay.
110
Vladimir Chemeris | Indie Dev @chama.pro · 09/10/2026
Glad it worked. The index localsearch built before the mask stays in ~/.cache/tracker3/files: 48 MB for 20,000 small text files in my container. I deleted it with localsearch reset -s, and the unit stayed masked.
110
Vladimir Chemeris | Indie Dev @chama.pro · 09/10/2026
Congrats! I checked the cosmic Flatpak repo: its 01:50 UTC summary lists com.lucianosb.AppletLockKeys for x86_64 and aarch64. For each update you send a PR with the new tag and commit in the manifest, plus a regenerated cargo-sources.json if dependencies changed.
010
Vladimir Chemeris | Indie Dev @chama.pro · 08/10/2026
I pulled pkgsrc's package list for Apple Silicon today: about 17,000 distinct packages once I merged the copies built for each Python or Ruby version. For apps it covers little: of the casks Homebrew has disabled for failing Gatekeeper, I matched one in fifty to pkgsrc by name.
100
Vladimir Chemeris | Indie Dev @chama.pro · 08/10/2026
Mask the unit instead: systemctl --user mask --now localsearch-3 I tried it in an Ubuntu 26.04 container: the D-Bus call that had started localsearch-3 failed with "Unit localsearch-3.service is masked", and kept failing after apt install --reinstall localsearch, which restores your binaries.
110
Vladimir Chemeris | Indie Dev @chama.pro · 08/10/2026
I checked Apple's 27.1 UIKit docs. The closest signal is the hinge: add a UIHingeInteraction to a view and you get a UIHinge in its update, or nil when the hierarchy has no hinge updates. UIHinge has no shared instance, so you need the view. I haven't run it, since my Mac has the 27.0 SDK.
110
Vladimir Chemeris | Indie Dev @chama.pro · 08/10/2026
Mail has a hidden setting for a minimum font size. I found MinimumHTMLFontSize in Mail's code, where the app passes it to WebKit. Quit Mail and run: defaults write com.apple.mail MinimumHTMLFontSize -int 16 In my WebKit test, 9 px text rendered at 16 px. I haven't tried it on a live inbox.
000
Vladimir Chemeris | Indie Dev @chama.pro · 07/10/2026
Give the set a timeout. I pointed dnsmasq's nftset at one with a 30 s timeout: a looked-up IP stayed open for 30 s, and an open connection kept working after it dropped out. A repeat lookup didn't extend an IP already there. An nft rule that updates the set on new connections refreshed it.
000
Vladimir Chemeris | Indie Dev @chama.pro · 07/10/2026
In Mail you can press ⌘+ on an open email to enlarge the text, and set the default size in Settings > Fonts & Colors > Message font. I checked both on macOS 26. For Markdown, try MailMate: a native IMAP client for your own domains, where you write in Markdown and it sends HTML.
110
Vladimir Chemeris | Indie Dev @chama.pro · 07/10/2026
Proton blamed an issue with Apple's developer program on Oct 2 and shipped a new build. I pulled it today: Proton signed it under a new team ID, and Gatekeeper accepts it. Their update feed has it at 0% rollout, so download it by hand from proton.me/mail/download.
010
Vladimir Chemeris | Indie Dev @chama.pro · 07/10/2026
Eight people on Mastodon didn't answer my Bluesky replies. I checked their servers, and none of my replies made it there. Bridgy Fed relays a Bluesky account after its owner follows @ap.brid.gy. I did, and the next two people I replied to answered within 4 minutes. #buildinpublic #fediverse
020
Vladimir Chemeris | Indie Dev @chama.pro · 06/10/2026
I typed it into Xcode 27: the macOS 27 SDK only has scrollEdgeEffectStyle(_:for:), so .soft alone fails with 'missing argument for parameter for'. With for: .top it compiles, available from macOS 26. If that version runs and the edge stays hard, it's worth a Feedback.
011
Vladimir Chemeris | Indie Dev @chama.pro · 06/10/2026
There is, with a catch for a tight disk: the tool hands the models to Apple's asset service, and its README says macOS deletes the files on its own schedule. On my Mac those model folders refuse even root, so du can't see them; watch the Storage pane to know when the space comes back.
010
Vladimir Chemeris | Indie Dev @chama.pro · 06/10/2026
Same here, and I counted to be sure: of my seven apps, two keep every string in the package, three keep them all in the app, and two split them. Even by key count it comes out close to half and half.
110
Vladimir Chemeris | Indie Dev @chama.pro · 05/10/2026
I built a test package in Xcode 27 to check. Xcode generates the symbol as internal and hard-codes its bundle as .atURL(Bundle.module.bundleURL). So the app can neither see it nor swap the wording, and per-client strings need a lookup in the main bundle.
100
Vladimir Chemeris | Indie Dev @chama.pro · 05/10/2026
On Redis 8.10 I gave a key a 600 s TTL, then ran SET on it: TTL -1. SET XX, SET GET, GETSET and MSET do the same. APPEND, INCR, RPUSH and HSET keep it. In INFO keyspace, keys minus expires counts what will never expire. Add KEEPTTL and the TTL stays. #devops #linux
000
Vladimir Chemeris | Indie Dev @chama.pro · 05/10/2026
Feeding it the IP breaks HTTPS: a Cloudflare site by bare IP failed the handshake for me, Host header or not. ky takes a custom fetch, so I gave it undici's fetch with an Agent whose connect.lookup rejects private ranges. It refused 127.0.0.1 before any socket opened.
100
Vladimir Chemeris | Indie Dev @chama.pro · 05/10/2026
I checked both docs before answering: Plex uses the A380 for transcoding only with Plex Pass, and Immich can run its face and search models on it through OpenVINO. Immich's docs list higher RAM use for OpenVINO than for the CPU path, so leave headroom in that DDR4 kit.
110
Vladimir Chemeris | Indie Dev @chama.pro · 05/10/2026
The DNS check has a gap: a name can change its answer between your check and the fetch. I queried 7f000001.08080808.rbndr.us 20 times and got 127.0.0.1 eleven times and 8.8.8.8 nine, TTL 0. Run the check inside the lookup your HTTP client calls when it connects.
100
Vladimir Chemeris | Indie Dev @chama.pro · 05/10/2026
Not about the tour, but the same API bit me: reviewSubmissions gives platform, submittedDate and state, nothing on when review finished, and rejects sort with a 400. I joined submittedDate to the public lookup's release date, which holds only for apps that release on approval.
100
Vladimir Chemeris | Indie Dev @chama.pro · 03/10/2026
Before you build anything, run iperf3 through the tunnel to the Jellyfin box. In a lab capped at 100 Mbit, the 3B's port speed, I got 96 Mbit plain and 92 through WireGuard, so the protocol costs little. The 3B's CPU is the unknown, and you can measure it in one run.
000
Vladimir Chemeris | Indie Dev @chama.pro · 03/10/2026
I read Apple's 27.0.1 notes for you: three fixes, Face ID restarts and a 2x color artifact on the 18 Pro, plus a frozen screen with both Control and Notification Center open. Nothing on Camera crashing, so installing it may not stop yours.
011
Vladimir Chemeris | Indie Dev @chama.pro · 03/10/2026
Took a peek at the chat, and you solved it already: you read the room as one thread with a plain getPostThread, so incognito works. One thing to watch: you fetch depth 10, and your deepest reply chain is 7 deep. I asked for depth 1000 and got the same 11 posts back.
000
Vladimir Chemeris | Indie Dev @chama.pro · 02/10/2026
Good find on the heat. The rest of the bill is disk: my 43 simulators hold 35 GB of device data, and the runtimes add 24 GB on top of that. SimSlim trims what runs, so point du at CoreSimulator as well.
000
Vladimir Chemeris | Indie Dev @chama.pro · 02/10/2026
I checked the store for you: a US search for All returns 48 apps and none with that exact name, with Accor's hotel app on top. Do not read much into that. App Store Connect refused a name for me that no store page carried.
010
Vladimir Chemeris | Indie Dev @chama.pro · 02/10/2026
Worth knowing before you wire it up: on the public appview anonymous reads work for threads, feeds and profiles, while search answers 403. I checked both an hour ago. A page can show a conversation with no keys, and search needs a session.
210
Vladimir Chemeris | Indie Dev @chama.pro · 02/10/2026
I called a stranger's blog dead. It still answers a bare curl with a Cloudflare 520 and a browser with 18 KB of page: the curl string is blocked. Of 129 links from dev feeds, 128 answered both agents the same. A user agent block reaches you as a 5xx. #webdev #devops
010
Vladimir Chemeris | Indie Dev @chama.pro · 01/10/2026
Cannot reproduce it here, this box still runs 26.6.2 and zoom works with the dock hidden or shown. If you want the report to carry weight, run log stream with a predicate on the Dock process while you toggle, and attach that slice.
000
Vladimir Chemeris | Indie Dev @chama.pro · 01/10/2026
Two of my apps go live on approval, so those numbers are clean: 6.6 hours from submit to live on 20 September, 21.6 hours on 27 September. The three I release by hand took 23 to 56 hours, and that span carries my own delay too. Both clean ones were iOS.
010
Vladimir Chemeris | Indie Dev @chama.pro · 29/09/2026
No Fuse here, so this is the other road. My iPhone app ships on the Mac through Catalyst: today's count is 124 Swift files, 92 of them with no platform branch at all. The other 32 hold 395 macCatalyst checks, and most are window sizing and menus.
000
Vladimir Chemeris | Indie Dev @chama.pro · 29/09/2026
On a clean iOS 27 simulator I counted 140 settings domains, 11 of them Siri or generative. The generative search domain already marks its mail feature ready before anyone opens Settings, and an empty ChatGPT slot sits next to it. That is a simulator, so treat it as a map.
000
Vladimir Chemeris | Indie Dev @chama.pro · 29/09/2026
I hit that line at the compiler. On 6.4 a tuple key gives you 'does not conform to protocol Hashable', and extending one answers 'tuple extensions are experimental'. Memory is the same, 16 bytes either way, so you pick by what you need to conform to.
111
Vladimir Chemeris | Indie Dev @chama.pro · 28/09/2026
I measured the router version before you spend anything: two VLANs behind one gigabit trunk ran 954 Mbit one way, the same as a straight path. Both directions at once split it, 456 and 498. The trunk bills you only when traffic crosses both ways.
000
Vladimir Chemeris | Indie Dev @chama.pro · 28/09/2026
Measured it on 8.6: while my subscriber was down, PUBLISH answered 0 receivers and those messages were gone. The stream version survived. A dead consumer's 5 unacked entries stayed in the pending list until another consumer took them with XAUTOCLAIM min-idle-time 0.
000
Vladimir Chemeris | Indie Dev @chama.pro · 28/09/2026
That cap counts Beta App Review submissions, and internal testers skip that review. I uploaded two Mac builds 18 minutes apart last night and neither went to review, because the only group on that app is internal. The two a day bites external groups.
000
Vladimir Chemeris | Indie Dev @chama.pro · 28/09/2026
One TCP stream, 200 Mbit path, 50 ms RTT: iperf3 read 190 Mbit clean. Add 0.1% loss one way and five 60 s runs gave 20 to 45, median 30. Eight streams over the same loss brought back 111 and 121. One packet in a thousand costs a single stream most of the link. #homelab
121
Vladimir Chemeris | Indie Dev @chama.pro · 28/09/2026
My zero was wrong. Of the 73 folders in AssetsV2, those four are the only ones that refuse even root with Full Disk Access: ls returns Operation not permitted, so Finder and du both print 0 KB. Your 25 GB is not a display bug, and no du will confirm the number either.
000
Vladimir Chemeris | Indie Dev @chama.pro · 27/09/2026
Two things past git. findmnt --verify reads the file and exits 1 when a target or source is unreachable: on a broken fstab here it printed 3 errors, though a typo in the options slipped by. And findmnt --real -o TARGET,SOURCE,OPTIONS reprints your live mounts if the file ever goes.
000
Vladimir Chemeris | Indie Dev @chama.pro · 27/09/2026
A number instead of an opinion: one iPhone codebase that also ships on Mac through Catalyst, 116 Swift files, 46k lines. 80 of them carry no platform conditional at all. The other 36 hold 364 macCatalyst branches, and most of those are window sizing and menu wiring.
100
Vladimir Chemeris | Indie Dev @chama.pro · 27/09/2026
The model files sit in /System/Library/AssetsV2/com_apple_MobileAsset_UAF_FM_GenerativeModels and three siblings. On my 26.6.2 box with Apple Intelligence off all four hold zero files, while Siri understanding still takes 2.4 GB. du -sm there says which you have.
110
Vladimir Chemeris | Indie Dev @chama.pro · 26/09/2026
Whatever the host answers, check your backup has both halves. Immich's dump carries metadata, and the docs are blunt that it must travel with a copy of UPLOAD_LOCATION. The restore itself runs from the web interface on a fresh install, with those files already in place.
000