Sign in

Finfet

@finfet.sh
212 followers 203 following 1.4K posts

Mostly ramblings about tech, dev, and atproto Also talks about rhythm games (arcaea mostly) frnd.codes/p/finfet.sh finfet.sh he/him 🎵 Now Playing 🎵 Nothing

PostsRepliesMedia
Finfet @finfet.sh · 02/10/2026
something about this seems very wrong
a certain touch based jp arcade rhythm game running on macos through wine and crossover.
070
Finfet @finfet.sh · 30/09/2026
poorly working gaze tracking on steam frame. i've had it for less than a day. god i love mostly open hardware/software
1302
Finfet @finfet.sh · 20/09/2026
yeah I was thinking the same thing about using the avatar. you could also put small buttons overlaid on the avatar for multiple things. Kinda hard to convey to the user but it’s an option I’ve done before
011
Finfet @finfet.sh · 17/09/2026
what's even cooler about this is that DiffusionGemma supports images but jev doesn't! i have no clue if this is even kosher but it _seems_ to work?
050
Finfet @finfet.sh · 17/09/2026
but it works! at least with simple questions so far. i have so many stupid ideas for this thing lol
diffusiongemma jev vllm patch running on a 7900xtx egpu. noul output of ticket routingdiffusiongemma jev vllm patch running on a 7900xtx egpu. choice output of ticket routingdiffusiongemma jev vllm patch running on a 7900xtx egpu. score output of incident description
020
Finfet @finfet.sh · 16/09/2026
oh no both FE:FW and Trails in the Sky 2nd are reviewing very well. i don’t have the free time for either of these right now...
000
Finfet @finfet.sh · 15/09/2026
I still think swapping parts was one of the cooler things I saw people do with the neo. Seems like something fun to do with a group of friends all buying a neo. www.ebay.ca/itm/19863015...
a part swapped MacBook neo with different color parts
120
Finfet @finfet.sh · 15/09/2026
like who wouldn’t want to read a tech book about python written by a vtuber? (i bought this even though i can’t read anywhere near this level lol)
VTuberサプーが教える! Python 初心者のコード/プロのコード
040
Finfet @finfet.sh · 14/09/2026
lol price spoiled by search indexing
000
Finfet @finfet.sh · 11/09/2026
starting a petition to require all cardboard boxes to have cute characters on them thanking you for recycling
0210
Finfet @finfet.sh · 09/09/2026
i have bad news about the history of apple and mobile keyboard designs
2252
Finfet @finfet.sh · 09/09/2026
huh, dsv4 pro but flash sized now. very cool.
070
Finfet @finfet.sh · 06/09/2026
matched, but $10 per because I don’t often catch blocks from the mindless horde roaming around this site.
46 blocks against my account$480.70 donation ($460 + credit fees)
1203
Finfet @finfet.sh · 23/08/2026
spaces are pretty cool. i like this abstraction a lot (two spaces for private space discovery works well (i think))
codes.frnd.shared.access and codes.frnd.shared.group spaces shown in pds.lsa codes.frnd.actor.identity record within a codes.frnd.shared.group space in pds.ls
100
Finfet @finfet.sh · 28/07/2026
new top score (11.57), first ex+ on a 10, and +.5 ptl to get to 11.12. malicious mischance is also very close to a ex, which is wild given how hard that song is to me.
100
Finfet @finfet.sh · 04/07/2026
160
Finfet @finfet.sh · 28/06/2026
birb
010
Finfet @finfet.sh · 24/06/2026
a touristy place in some city
100
Finfet @finfet.sh · 17/04/2026
example: an easy 10 map and two bad 9+ maps, all very old (11.22pt on that 10, very nice)
000
Finfet @finfet.sh · 05/04/2026
holy shit finally. 11pt i can now say i’m not bad (but not good) at this game. i’m still very under ranked though, these were all ~11.15 and i have 11.35s already
020
Finfet @finfet.sh · 03/04/2026
it was surprisingly easy to get a connection to the firehose/jetstream on Pebble through the PebbleKit JS app backend. kinda expected this to be more annoying. I wish I had my watch to test this on though 🥲
1130
Finfet @finfet.sh · 30/03/2026
Poutine acquired. It was very good
180
Finfet @finfet.sh · 28/03/2026
hmm attie works with oss models just fine. Configurable endpoint.
170
Finfet @finfet.sh · 27/03/2026
+1 to going to the Museum of Anthropology while you’re at UBC. There’s a lot here to see and learn about the indigenous cultures around the area. Plus some other exhibits.
030
Finfet @finfet.sh · 26/03/2026
The answer is yes, they are in bloom everywhere. Very pretty.
010410
Finfet @finfet.sh · 22/03/2026
sniped (not finished yet but i've had a fun time building this)
a non-compliant feed gen that fetches the latest posts from a PDS based on the feed URI
1110
Finfet @finfet.sh · 18/03/2026
haha yeah, piper is not having a fun time right now. spotify thinks i don't have premium/basic anymore
000
Finfet @finfet.sh · 16/03/2026
The favicon that Safari uses for Bluesky is kinda gross. Why is there no transparency on this? idk what favicon it's even pulling
130
Finfet @finfet.sh · 15/03/2026
TIL that garbled CJK text is known as 文字化け (mojibake) also this game is downloading in the single digit Mbps. unsurprisingly, konami has the worst JP-only CDN known to man.
2100
Finfet @finfet.sh · 13/03/2026
000
Finfet @finfet.sh · 09/03/2026
React Native is kinda neat
2130
Finfet @finfet.sh · 26/02/2026
OVH VPS price increase. I guess they took the chance after hetzner. Oof my VPS bill a lot higher though
250
Finfet @finfet.sh · 23/02/2026
cleaning out some memory cards. curious how bsky handles 65:24 images
a 65:24 landscape photograph
100
Finfet @finfet.sh · 04/02/2026
Going to bed at 10pm does help you get better sleep, who knew. Also yes this just cyclic, damnit.
A graph of sleep score
000
Finfet @finfet.sh · 03/02/2026
Yep, mmhmm
71.
GOOD
It's going to be alright
Hope you're feeling ok after 5h 58m of restless sleep. If you feel tired, try to get some fresh air and allow yourself relaxing breaks whenever you can during the
110
Finfet @finfet.sh · 02/02/2026
Initial code for Python -> Lexicon JSON definition roughed out (technically dicts, but it's the same) Supports inline objects, refs, and external refs. Automatically places ref'd objects into lexicon docs based on NSID. Query support is really rough right now. I don't like it tbh
    @lexicon.object(nsid="fm.teal.alpha.feed.defs#artist")
    class Artist(ObjectType):
        artist_mb_id: str = field.string(max_graphemes=100, description="Hello there")
        artist_name: str

    @lexicon.record(nsid="fm.teal.alpha.feed.play", key=Tid)
    class Play(RecordType):
        track_name: str
        track_mb_id: str | Missing
        recording_mb_id: str | Missing
        duration: int | Missing
        artist_names: list[str] | Missing = field.array(
            items=field.string(min_length=1, max_length=256, max_graphemes=2560)
        )
        artist_mb_ids: list[str] | Missing
        artists: list[Ref[Artist]] | Missing
        release_name: str | Missing
        release_mb_id: str | Missing
        isrc: str | Missing
        origin_url: str | Missing
        music_service_base_domain: str | Missing
        submission_client_agent: str | Missing
        played_time: datetime | Missing

    generator = LexiconGenerator()
    print(generator.parse_lexicons([Play]).to_dict())
{
   'fm.teal.alpha.feed.play': {
        'id': 'fm.teal.alpha.feed.play',
        'lexicon': 1,
        'defs': {
            'main': {
                'key': 'tid',
                'type': 'record',
                'record': {
                    'type': 'object',
                    'required': ['trackName'],
                    'properties': {
                        'trackName': {'type': 'string'},
                        'trackMbId': {'type': 'string'},
                        'recordingMbId': {'type': 'string'},
                        'duration': {'type': 'integer'},
                        'artistNames': {
                            'type': 'array',
                            'items': {'type': 'string', 'maxLength': 256, 'minLength': 1, 'maxGraphemes': 2560}
                        },
                        'artistMbIds': {'type': 'array', 'items': {'type': 'string'}},
                        'artists': {'type': 'array', 'items': {'type': 'ref', 'ref': 'fm.teal.alpha.feed.defs#artist'}},
                        'releaseName': {'type': 'string'},
                        'releaseMbId': {'type': 'string'},
                        'isrc': {'type': 'string'},
                        'originUrl': {'type': 'string'},
                        'musicServiceBaseDomain': {'type': 'string'},
                        'submissionClientAgent': {'type': 'string'},
                        'playedTime': {'type': 'string', 'format': 'datetime'}
                    }
                }
            }
        }
    },
    'fm.teal.alpha.feed.defs': {
        'id': 'fm.teal.alpha.feed.defs',
        'lexicon': 1,
        'defs': {
            'artist': {
                'type': 'object',
                'required': ['artistMbId', 'artistName'],
                'properties': {
                    'artistMbId': {'type': 'string', 'maxGraphemes': 100, 'description': 'Hello there'},
                    'artistName': {'type': 'string'}
                }
            }
        }
    }
}    @lexicon.params()
    class GetTimelineParams(ParamsType):
        """Timeline params"""

        limit: int = field.integer(default=50, minimum=1, maximum=100)
        cursor: str = field.string()
        algorithm: str = field.string(description="Variant algorithm for timeline")

    @lexicon.output()
    class GetTimelineOutput(OutputType):
        """Output of timeline"""

        feed: list[Ref] = field.array(
            items=field.ref(ref="app.bsky.feed.defs#feedViewPost")
        )
        cursor: str = field.string()

    @lexicon.query(nsid="app.bsky.feed.getTimeline")
    class GetTimeline(QueryType):
        """Get a view of the requesting account's home timeline."""

        params = GetTimelineParams
        output = GetTimelineOutput

        class Errors:
            BlockedActor = error("The requesting actor is blocked")

    generator = LexiconGenerator()
    print(generator.parse_lexicons([GetTimeline]).to_dict()){
    'app.bsky.feed.getTimeline': {
        'id': 'app.bsky.feed.getTimeline',
        'lexicon': 1,
        'defs': {
            'main': {
                'type': 'query',
                'parameters': {
                    'type': 'params',
                    'required': ['cursor', 'limit', 'algorithm'],
                    'description': 'Timeline params',
                    'properties': {
                        'limit': {'type': 'integer', 'minimum': 1, 'maximum': 100, 'default': 50},
                        'cursor': {'type': 'string'},
                        'algorithm': {'type': 'string', 'description': 'Variant algorithm for timeline'}
                    }
                },
                'output': {
                    'type': 'object',
                    'required': ['feed'],
                    'description': 'Output of timeline',
                    'properties': {
                        'feed': {'type': 'array', 'items': {'type': 'ref', 'ref': 'app.bsky.feed.defs#feedViewPost'}},
                        'cursor': {'type': 'string'}
                    }
                },
                'errors': [{'name': 'BlockedActor', 'description': 'The requesting actor is blocked'}],
                'description': "Get a view of the requesting account's home timeline."
            }
        }
    }
}
230
Finfet @finfet.sh · 31/01/2026
learning about bread from FOSDEM and lazy imports, i guess. those are cool too
120
Finfet @finfet.sh · 30/01/2026
Very bad score, but this game is so much fun. I'm obligated to play Untrodden Morn if it's in a game, absolute banger.
000
Finfet @finfet.sh · 28/01/2026
snow
A red house in the snowA tan house in the snow
140
Finfet @finfet.sh · 26/01/2026
Alright, that's serialization/deserialization implemented. The code is a mess, but it works on the small tests I've been running. I really like writing typed code in Python, so it's been fun doing this all by hand. I probably could have gotten this running in an hour with an LLM, but who cares 🤷‍♂️
0101
Finfet @finfet.sh · 25/01/2026
I want to complain about lexicons again, but I think this one might just be a skill issue. Combining nullable and required is annoying. It's a ternary, (you have it, it was null, or it wasn't supplied) which isn't fun to represent. Fixable, but annoying. This is correct but so ugly though...
110
Finfet @finfet.sh · 25/01/2026
the “iPadOS” bsky app has this really fun bug with images. I really don’t know what would cause this lol. Is it checking the orientation when opening images and since this is always horizontal, it’s immediately rotating?
180
Finfet @finfet.sh · 23/01/2026
Still playing around with typing for lexicon defs. Dug into how atcute does it and threw together a rough typed example of it in Python. Not sure I like it. It's nice that it's all a dict w/ helper functions, but a full @dataclass_transform setup like I have allows for direct parsing into an object
A python snippet showing a dict style way of defining lexicons.A python snippet showing a dataclass_transform style way of defining lexicons.
130
Finfet @finfet.sh · 22/01/2026
I'm ending on my fields rn ong fr fr
Arknights Endfield
010
Finfet @finfet.sh · 20/01/2026
Hmm, is it possible for lexicon arrays to have its items be a type object, or is it only refs to objects elsewhere? The docs just say "object", so yes? I can't find any examples of this though, only ref and union. Basically, is this okay vs type ref or union.
100
Finfet @finfet.sh · 20/01/2026
This is very WIP still, but the fact that this is fully typed and has a fairly clear path to a parser/generator/library is neat. I'm sure this already exists in Python for atproto, but I don't really care frankly. I'm so opinionated on Python that I just want my own thing anyways.
000
Finfet @finfet.sh · 18/01/2026
Another great article, perfect way to walk the Atmosphere. It’s a bit funny that this shows a small bug with Piper for the scrobbling, but it’s all for a good cause. The delay is caused by the polling rate against Spotify’s API, yes. Also, I’m famous now
090
Finfet @finfet.sh · 17/01/2026
Okay, first EX on a 10. Sheriruth is so fun to play bc it’s so old lol. Infinite Strife EX is also a good haul, this song is still so hard. .13 potential in one night is pretty decent.
100
Finfet @finfet.sh · 16/01/2026
This is an awful play but I’ll take the ex+. Been chasing this one for months.
100
Finfet @finfet.sh · 16/01/2026
i do not deserve this score lmao. i have no idea how i didn’t break multiple times
000