71 lines
4.1 KiB
Markdown
71 lines
4.1 KiB
Markdown
# 2026-02-22
|
|
## 2200
|
|
|
|
Requirements:
|
|
- Need a better Revolt client that's cross-platform native
|
|
- Ideally macOS / iPadOS / iOS / Windows / Linux / Android / Web
|
|
- Need the UI / UX to be top-notch and feel good in the hands, otherwise people won't use it
|
|
- On top of this, it should also be _fun_ and _cute_
|
|
- Accessibility should be considered, but I do not have experience in this area, will need to do research
|
|
- Currently Revolt has a (now deprecated) web app and a native app that doesn't support custom endpoints
|
|
- We're forking from Revolt, so don't need to worry about breaking changes on their end
|
|
- Sticking with the name ermine cause I like it (stylized `ermine` all lowercase to be cool)
|
|
- Decided to try using Slint + Rust for a more bare-bones low-level approach
|
|
- Licensing
|
|
- Slint requires GPLv3 without a paid license - fine with this
|
|
- Revolt is also AGPLv3
|
|
- Code I write will be MIT as I don't want to hinder people re-using anything for any reason
|
|
- Have already spent a number of hours 100% vibe coding a prototype
|
|
- Used Flutter + Dart (was considered for this iteration)
|
|
- It worked okay, had a UX close to what I want as a starting point, so we know what we want is possible, we just need to build it
|
|
- There are just too many bugs and there's no way to trust the code written underneath
|
|
- Feel awful and ashamed of vibe coding, giving away my agency and creativity to an LLM and to big tech, rotting away my ability to create
|
|
- This is a project to push myself outside of my comfort zone towards something I've not done before, to grow beyond the limitations I've placed upon myself
|
|
- Having seen what other people've worked on, over months, and the kind of dedication they have towards software quality, I know this is something that will take time to craft instead of something I can bang out in a few hyperfixated days
|
|
|
|
Resources:
|
|
- Slint
|
|
- https://docs.slint.dev/latest/docs/slint/
|
|
- Rust
|
|
- https://docs.rs/http/latest/http/
|
|
- https://docs.rs/sqlite/latest/sqlite/
|
|
- https://docs.rs/json/latest/json/
|
|
- https://docs.rs/websocket/latest/websocket/
|
|
- https://doc.rust-lang.org/rust-by-example/testing/unit_testing.html
|
|
- Revolt
|
|
- https://developers.stoat.chat/developers/endpoints/
|
|
- https://developers.stoat.chat/api-reference
|
|
- https://stoat.chat/api
|
|
- https://revolt.handmadecities.com/api
|
|
- https://github.com/livekit/livekit
|
|
- HMC
|
|
- https://git.handmadecities.com/HMC/handmade-revolt
|
|
|
|
Notes:
|
|
- Slint reminds me a lot of when I tried messing with SwiftUI
|
|
- Trying to make things look pretty early on is a fools errand
|
|
- Need to remember to make things work, then make them look nice
|
|
- Have not used Rust before so this should be interesting
|
|
- HMC Revolt seems to be on version 0.8.2 while Stoat is now on 0.11.5
|
|
- Have an OpenAPI spec for the latest stoat, but no historical ones
|
|
- Need to figure out what differences exist, if any, and how to support different server versions cleanly
|
|
- Seems like there's an `/api` endpoint with information about the server (if it's a revolt server)
|
|
- App version
|
|
- autumn endpoint (file server)
|
|
- january endpoint (media server)
|
|
- voso ?
|
|
- livekit ?
|
|
- livekit seems to be what's used for voice / video support
|
|
- Currently not supported by HMC Revolt instance
|
|
- main websocket
|
|
- Trying to use progenitor + openAPI spec to generate rust code, not going that well, and Gwen said it may be better to write these by hand
|
|
- progenitor didn't work due to it operating under the assumption that endpoints only return one type, which this spec violates (https://github.com/oxidecomputer/progenitor/issues/950)
|
|
- Read through documentation mostly, taking it slow and making sure I understand how things are working, being patient with myself
|
|
|
|
# 2026-03-20
|
|
## 0220
|
|
|
|
Figured the API endpoint (`/api`) would be a good place to start. Now have successful deserialization.
|
|
|
|
Sidebars are important, so I added two, one for channel list and another for server list. I'm still trying to figure out the best way to integrate different instances seamlessly.
|