You are browsing as a guest. Sign up (or log in) to start making projects!

callooloo

@callooloo

Joined June 11th, 2026

  • 8Devlogs
  • 4Projects
  • 2Ships
  • 15Votes
Open comments for this post

7h 34m 55s logged

alright so it’s been a minute since the last update. spent a bunch more time going through orvix looking for stuff that’s broken, and honestly found more than i expected given how much i already fixed last time.

found a really annoying pattern this round. a bunch of settings have a “this number has to be smaller than that number or it breaks” rule, and i never actually checked for that anywhere. if your release threshold ends up higher than your trigger threshold, a pinch or grab fires and then immediately releases itself on the next frame, so you get a click but can never actually hold it or drag anything, no crash no error, it just doesn’t work. same deal with the calibration box, if min and max on an axis ever get flipped your cursor just starts moving backwards on that axis with zero explanation. the tilt deadzone had the same issue, could turn a smooth speed ramp into an instant jump to max speed. and there’s a “freeze the cursor so clicks don’t drift” feature that could get silently disabled if two of its settings were misordp as a crash, they just make the app feelsubtly broken, which is honestly worse. fixed all of them so bad values get corrected automatically instead of
just trusting the config file blindly.

two actual bad ones too. if you hand edit ym or volume step to 0, the app straight upfreezes the next time you do that gesture, stuck in a loop that can never finish, only way out is force quitting.
separately, a bad enough cutoff value in thuld cause a real divide by zero and crash the whole thing mid session. both way worse than the silent stuff above since the app just dies with no warning.

this one took a while to track down: there’s exactly one way the tracking loop is supposed to end on its own
without an error, which is the sensor conne session. turns out that looked identical toyou just pressing stop yourself, in literally every part of the app. so if your sensor dropped, it’d silently die
and say “stopped” like nothing happened insng broke. fixed it everywhere, then found the funniest bug of the batch: right after fixing the error message for the menu bar version, there was leftover code
resetting the status back to “stopped” imme fix i’d just made. that one made me laugh.

feels like every session i find a new way tuck down. this time: starting a grab whilealready mid pinch could leave the button held down forever, quitting the app didn’t wait for shutdown to actually
finish so it could kill things mid cleanup, events don’t carry a screen position, andthe code was throwing away any event without one, silently dropping the release too.

other stuff: calibration and live tracking could both start at once and step on each other’s state, same with
loading a profile mid calibration, so i add. a broken config file used to crash theterminal app, the calibration tool, and one of the visualizers even though the menu bar version already handled it
gracefully, now they all fall back the same leaking the sensor connection on close.volume control has no timeout and runs right in the main gesture loop, so a stray permission popup could freeze
the whole app. ctrl-c in the terminal versitead of exiting clean. the radial menu wascaching your screen size once and never updating it, so unplugging a monitor left it positioned wrong for the rest
of the session, found basically the same bua different variable. and i found a variable named like it held pixels that was actually always holding millimeters, with a comment literally admitting it was
wrong, so i renamed it.

also cleaned up a pile of stale docs, caught myslef making a bad fix and reverted it before it did damage, anddeleted a config setting that turned out completely dead.

0
0
2
Open comments for this post

8h 7m 10s logged

Welcome to devlog #2 for Orvix. here’s what was done today:
profiles + gui

  • added named config profiles (list/save/load/delete), so you can have more than one saved setup instead of just one config.yaml
  • wired profiles into the menu bar
  • added a confirm prompt before save-as silently overwrites a profile, matching how delete already asks

cursor ring

  • added an optional always-on cursor ring toggle, separate from the existing dwell countdown ring
  • made the ring flash on a landed click
  • found dwell click skipped the flash since it fires through a different path, fixed that too
  • checked every other action (radial mee, pause), none of those need it, already covered by their own feedback

gesture tuning

  • fist twist volume knob now scales rate with twist speed instead of a fixed step
  • checked if cursor drift builds up ovet, added a long session test instead of a fix nobody needed

bug fixes, mostly config/crash related

fixed a bunch of ways a bad or hand edited config.yaml could crash orvix silently, since the menu bar app
has no terminal to show errors in:

  • unknown/typo’d keys in the yaml
  • wrong types (string where a number sh
  • out of range values (negative durations, percentages over 100)
  • invalid action names like pinch_actio
  • fast_speed <= slow_speed causing a divide by zero in cursor gain math

also:

  • fixed calibration double starting if aced two threads on the same state
  • fixed stale gesture state firing a click or thumbs up right after unpausing
  • fixed desktop bounds going stale if yid session
  • gave “first” hand tracking mode identity continuity so a second hand cant hijack the cursor mid use

cli fixes found by actually running things

  • fixed orvix status giving a false “cant reach leapd” error when leapd is fine but no device event came
    in
  • fixed orvix calibrate hanging forever with no timeout when theres no leap device plugged in

test coverage + cleanup

  • added tests for leap_client’s frame parsing, mouse_control.py, overlay.py, none had any before
  • ran pyflakes across orvix/ and tests/
  • updated readme to match current behavior (volume rate, cursor ring, profiles)

verification passes that found nothing

  • ran full test suite 3x looking for flaky tests, found none
  • launched the real menu bar app live, shutdown
  • checked orvix profile’s numbers still make sense after all the mapper changes
  • did a late audit for remaining state up empty
0
0
3
Open comments for this post

39m 47s logged

DEVLOG #3 Orvix THIS IS STRAIGHT OUT OF IRON MAN today was mainly just playing around with the tool and calibrating it locally.

1
0
26
Open comments for this post

2h 41m 22s logged

orvix (iron man - type computer control using hand gestures) devlog #2

gestures 3 to 9, tests 22 to 115, 5 new modules, 3 real bugs fixed, 2 on-screen cocoa bits (radial wheel + cursor dwell ring).

last time orvix could move, click, drag and scroll. this round i brainstormed a big list of gestures, cut it down, and shipped six new ones:

  • grab needs a real fist now. leapd calls it a grab way too early, so now it also checks which fingers are still out. strictness is a menu setting.
  • draw a circle to open a radial menu. eight slices (mission control, maximize, app switcher, undo, copy, paste, screenshot, close), point and pinch to fire. they run normal keyboard shortcuts, and a see-through wheel draws on screen and follows your hand.
  • two hands pinch and pull apart/together to zoom.
  • fist + twist your wrist like a knob for volume.
  • hold the cursor still to left click, 1.5s, with a ring that fills as it counts down.
  • both palms out like a stop sign pauses everything.
  • thumbs up to hit return.

all six toggle from the menu bar. same architecture as before: the gesture logic is pure modules with no leap or mac code so it tests unplugged, and gui and cli still share one run_live().

three bugs that were actually broken:

  • circle detector did the angle math around a shifting center, so a full circle only read ~185 degrees. rewrote it to measure
    total spin across the whole path.
  • the overlay never drew because it called a cocoa method that doesnt exist, and my own try/except swallowed the crash quietly.
    fixed it and made failures log loud.
  • a started_at or now zero bug that killed the dwell timer when the clock started at exactly 0.

cant test the hardware path so i faked leap frames through the real run_live with a recording mouse to confirm the wiring.

tuning by feel: circle-to-open was too easy so its 400 degrees now (a full loop plus), the wheel is pinch-only, and dwell click
sits at 1.5s.

still rough: fist-twist volume and grab-scroll shahells to osascript, two-hand tracking is iffy onthe old leap, and #1s open items (bad two-point calibration, dry run read at start, untested gui calibration) are still there.

0
0
6
Open comments for this post
Reposted by @callooloo

58m 35s logged

started this as a “can i control my mac with just my hand” thing using an og Leap Motion (LM-010) from like 2013, and as of today it’s a working prototype that actually moves my real cursor.

what it does right now

  • move your hand, cursor follows
  • pinch to click, hold the pinch past 0.3s and it becomes a drag
  • grab to scroll, speed comes off your palm velocity
  • take your hand away and the cursor just freezes where it is instead of jumping somewhere dumb
  • menu bar app so you don’t need a terminal open, has start/stop, a dry run toggle, live display of the last gesture, and calibration
  • you can remap what pinch and grab actually do (click/drag, scroll, or just off) from the menu
  • one word launcher, you type orvix and it goes, plus orvix cli, orvix calibrate, and orvix status which tells you if leapd and the device are alive without launching anything
  • calibration saves to ~/.orvix/config.yaml so it sticks between runs

leapd streams hand data as json over a local websocket, and then it’s leap_client to gesture_interpreter to coord_mapper to mouse_control, ending in real CGEvents through Quartz. the gesture interpreter is a state machine with separate press and release thresholds so a pinch sitting right on the boundary doesn’t rapid fire, and the coord mapper runs a One Euro Filter so the cursor isn’t jittery at rest but still keeps up when you move fast. gui and cli both call the same run_live() so they can’t drift apart on what a gesture means. 22 tests, and the pure logic modules have no hardware or macos calls in them so they test fine with nothing plugged in.

the whole pipeline was written blind before i ever had the hardware hooked up and it held up better than it had any right to, the only genuinely broken thing was the default calibration box, which capped at y_max=300 while my hand naturally sits at like 295 to 337, so every position clamped to screen y=0 and the cursor would’ve been welded to the top of my ultrawide. found it in dry run before going live thankfully. fixed by sweeping my hand around for 15s and recording the real range. also drag_hold_seconds was 0.15 which is way too fast to pinch and release, logs showed 568 drag frames against 6 pinches, so that’s 0.3 now.

the two point calibration flow in calibration.py is worse than the sweep i did by hand and should probably just get replaced. dry run gets read at Start time so unticking it mid run does nothing, which is a footgun. saw a stray grab_scroll once on an open hand so grab_threshold might need tuning. gui calibration path exists but has never been run against real hardware.

core pipeline and gui are merged into main. launcher is on feat/launcher, not pushed.

0
1
14
Open comments for this post

58m 35s logged

started this as a “can i control my mac with just my hand” thing using an og Leap Motion (LM-010) from like 2013, and as of today it’s a working prototype that actually moves my real cursor.

what it does right now

  • move your hand, cursor follows
  • pinch to click, hold the pinch past 0.3s and it becomes a drag
  • grab to scroll, speed comes off your palm velocity
  • take your hand away and the cursor just freezes where it is instead of jumping somewhere dumb
  • menu bar app so you don’t need a terminal open, has start/stop, a dry run toggle, live display of the last gesture, and calibration
  • you can remap what pinch and grab actually do (click/drag, scroll, or just off) from the menu
  • one word launcher, you type orvix and it goes, plus orvix cli, orvix calibrate, and orvix status which tells you if leapd and the device are alive without launching anything
  • calibration saves to ~/.orvix/config.yaml so it sticks between runs

leapd streams hand data as json over a local websocket, and then it’s leap_client to gesture_interpreter to coord_mapper to mouse_control, ending in real CGEvents through Quartz. the gesture interpreter is a state machine with separate press and release thresholds so a pinch sitting right on the boundary doesn’t rapid fire, and the coord mapper runs a One Euro Filter so the cursor isn’t jittery at rest but still keeps up when you move fast. gui and cli both call the same run_live() so they can’t drift apart on what a gesture means. 22 tests, and the pure logic modules have no hardware or macos calls in them so they test fine with nothing plugged in.

the whole pipeline was written blind before i ever had the hardware hooked up and it held up better than it had any right to, the only genuinely broken thing was the default calibration box, which capped at y_max=300 while my hand naturally sits at like 295 to 337, so every position clamped to screen y=0 and the cursor would’ve been welded to the top of my ultrawide. found it in dry run before going live thankfully. fixed by sweeping my hand around for 15s and recording the real range. also drag_hold_seconds was 0.15 which is way too fast to pinch and release, logs showed 568 drag frames against 6 pinches, so that’s 0.3 now.

the two point calibration flow in calibration.py is worse than the sweep i did by hand and should probably just get replaced. dry run gets read at Start time so unticking it mid run does nothing, which is a footgun. saw a stray grab_scroll once on an open hand so grab_threshold might need tuning. gui calibration path exists but has never been run against real hardware.

core pipeline and gui are merged into main. launcher is on feat/launcher, not pushed.

0
1
14
Ship Changes requested

what i made
its called the gap engine (anti-discovery engine). basically it pulls science papers off semantic scholar and openalex, builds a knowledge graph out of them with networkx, then hunts for structural gaps, aka holes between clusters of research that nobody has connected yet. an llm (groq) turns those holes into actual research questions, then it scores them by leverage (real betweenness centrality, not some fake made up number). theres also an inversion feature called the antimatter query, basically it checks "we know X causes Y, has anyone ever tested if Y causes X" and flags stuff thats never been tested. and the killer feature is historical validation mode, you run it on a 2005 paper corpus and it actually flags the network topology x epidemiology gap that later became a huge breakthrough in real life. proof it works in hindsight = proof it could work going forward.

built for the moonshot hackathon, deadline was june 30 2026.

what was hard
- the historical validation was straight up broken at first, backend and frontend data shapes didnt match and it was crashing
- had a bunch of fake numbers polluting the ui, like a leverage score that was literally just degree-sum labeled as "betweenness" when it wasnt, had to rip that out and make it real
- the demo graph kept surfacing boring gaps like "data mining to exome" instead of cool cross domain stuff, had to rebuild the graph generation to bias toward real cross domain voids
- node labels were straight up wrong sometimes (epidemiology showing as "political science" lol) so had to add a proper field normalizer
- the historical proof was originally rigged, it force constructed the answer instead of letting the detector find it organically. had to fix that so its actually earned, not staged

what im proud of
the historical mode is the big one. its not just a vibes based tool, it can point at a real graph from 2005 and say "yeah the engine would have caught this gap" and that gap turned into an actual scientific breakthrough (network science transforming disease modeling). thats the whole thesis of the project basically proven in one demo. also proud that i went back and ripped out the fake/inflated numbers instead of just shipping them, even though it wouldve made the demo look flashier.

how to test it
- backend: cd backend && python3.13 -m uvicorn main:app --port 8000 (gotta use python3.13 specifically, system python3 is 3.14 and breaks pydantic-core build)
- frontend: cd frontend && npm run dev (runs on localhost:5173)
- check out the historical validation mode first, thats the strongest proof point
- click into the antimatter query tab for the inversion stuff
- click on any gap to see the actual paper evidence backing it up (like "N papers touch A, M touch B, 0 touch both")
- theres a demo graph precomputed so you dont have to wait on live api calls to see it work

  • 1 devlog
  • 6h
Try project → See source code →
Open comments for this post

6h 6m 47s logged

Finished setting up the API for research papers, the graph and node system also works perfectly now, debugged historical mode but i still cant get it to run 100% of the time, everyhting lese works well now, all planned features are built

0
0
8

Followers

Loading…