#AO-SDL updates
1 messages · Page 2 of 1
i'm not doing that
if im writing something Real™ like a driver or anything touching physical addresses
i would rather eat my own shit than touch rust or cpp
oh damn there is a flutter app in ao-sdl
i've been told that rust's async i/o api is "really good actually"
c++ almost has one in cpp20
hell nah rust async is terrible
chatgpt isn't getting paid to work on windows 11
the only language with async i/o that doesnt fucking suck is Go in my experience
ao-sdl has a multithreaded http server with an event loop as well as async network i/o for the client if you want an idea of what it looks like in cpp
go is a language for linkedin posters and bpd transgenders
is this true
only two people i knew who were go evangelists were the former and the latter
does rust have any sort of functioning bindings for vk/ogl yet
yeah it's called wgpu
or is it still "some guy in his basement made an ffi to the c api that doesnt load the driver fps properly or work at all"
wgpu is not bindings to vk/ogl
its a graphics library that uses them on the backend
there is ash for vulkan
neat
is there anything for metal
or, for that matter, is there literally any obj-c ffi that isnt utter cock and ball torture
objc2-metal
good luck using objective c with rust
objc++ is bad enough
do you know how many times ive been burned by "ARC and stl containers dont play nice"
if you std::move an obj-c object the OS gets a wide shit eating grin and starts buffering up the crash report before you even run the app
I have only ever used ARC for trying to mod geometry dash (because cocos2d-x has objc roots and it mainly uses ARC)
i still dont know what @autoreleasepool does and at this point i'm scared to ask
i had to learn an appreciable amount of ActionScript because a programmer who shall not be named wrote a bunch of nintendo ds graphics tooling in it for some godforsaken reason
isnt that literally the scripting language for adobe flash
lol
the fact that objc++ works at all is just like
i have no words for it honestly
it feels so cursed
std::string combined = shader->vertex_source() + "\n" + shader->fragment_source();
NSString *src = [NSString stringWithUTF8String:combined.c_str()];
this is REAL code written by REAL macos developers
id<MTLTexture> view() const { return (__bridge id<MTLTexture>)view_ref; }
void set_view(id<MTLTexture> v) {
if (view_ref)
CFRelease(view_ref);
view_ref = v ? CFRetain((__bridge CFTypeRef)v) : nullptr;
}
statements dreamed up by the utterly insane
all of this for metal support?
i mean
its either that or wrap it in a C API
or write the entire thing in swift
i could ship moltenvk but then
- i'd have to write a vulkan backend (i honestly need to do this anyways because ogl's global state shitpile doesnt play nice with qt, and also android support)
- i'd lose out on being able to do zero-copy "GPU" allocations and the memory usage would bloat to shit from the asset cache shadowing the "GPU" memory
- i have no idea what the runtime for that looks like and i honestly dont want to figure it out
- i kind of don't trust it fully
dont even get me started on ogl
cant believe it took like 20 years for AMD to say "ok enough is enough" with that flaming garbage pile
why the fuck is everything in global state? why does glBind exist at all? it already has opaque identifier tokens, how hard is it to just pass that into an idempotent api???
for mobile support can't you just use flutters impeller backend? or am I missing something
why maintain a separate parallel backend implementation when i already have metal and (eventually) vulkan? its just another thing to test and maintain and get broken
I do like Cargo too.
also
impeller operates at a higher level of abstraction
ao-sdl has a full 2D scene graph and compositor
i'd just be doing hacks to parse that structure and hand it off to impeller to just... create the same thing on its backend
makes sense
have you dug into ao-sdl at all
it works very fundamentally differently from ao2
for example, the "renderer" is not made from form widgets
I read the Architecture.md and I'm just browsing through the issues
that's how much I dug into ao-sdl
neat
the architecture.md is a tiny bit outdated
main things its missing are:
- the custom http implementation i added and the http/2 dualstacking via nghttp2
- the entire server architecture
I love that Qt OpenGL SceneGraph is so dogshit that it basically requires Vulkan.
my beautiful QLabels.....
idk if i put it in the architecture doc either but theres also a platform abstraction backend via link-time polymorphism
which used to just have some tiny helpers
but now the socket and poll apis live there too
NGL, for what it's worth, those Labels were probably the most performant render labels in Qt history.
Given there are people out there who still think QMovie is not utter dogshit.
i should PR aolayer in to replace qmovie
i was using httplib but its server implementation is dogshit (one thread per client inside of a fixed-size thread pool)
Replace QMovie with multi threaded form widget render for maximum performance.
i also found some cheap header-only socket abstraction but it didnt support polling
so all of that converged and i had to just
write http
i think it works
i added unit tests against the core parts of the rfc
I am still mesmerized by the fact that it just works
i didnt implement http/2 on the server side
i think its far more pragmatic to just let people sit caddy in front of it
for that reason i didnt bother with ssl on the server side either
yeah, it just makes sense
handling ssl fucking sucks anyways
have you ever had to parse an os certificate store
Yes
have you ever had to deal with the awful leaky abstraction that is OpenSSL BIO
No.
Querying the certificate store is hell unless it's already a tool native to the OS
Powershell my beloved
dont even get me started on openssl
it was funny when i was statically linking it in the macos binary and it inflated to like 8MB because brew's openssl binary had like half a megabyte of precomputed data for an outdated chinese government encryption standard
it actually also includes the entire webp encoder because parsing animated webps requires some interface that lives in the encoder even though the decoder needs it
at least now macos uses Network.framework and linux/windows just dynamically link to openssl
cant do that in macos because shipping .dylibs is cursed and there is no system openssl
At least the Qt frontend for the theme creators who want to go super granular is slowly taking shape.
theres also definitely a bug in the way that the asset cache image previewer in the debug window interacts with the pinning system and i think it might only exist on macos because on macos it has to blit the assets to a separate texture because of the way the objc semantics interact wi-
you know i dont think anyone here will understand or care
i barely do
its a miracle this codebase works at all
im a talentless vibecoder hack
i am gonna give up and start over again from scratch
April first was yesterday.
what makes you think im joking
the secret is clean code and good architecture are a myth
look at anything of sufficient complexity
all you can do is try to make refactoring easier
i need to get ready for the launch on friday night
read: i need to make my sleep schedule intentionally worse
wait so the person that I see committing with Claude is you?
yes
i mostly use it for documentation
it writes all of my commit messages bc otherwise theyd all be "added thing"
i also use it to write repetitive bullshit that is a waste of my time
just be like sd and insert inscrutable memes filled with swear words into the commit log forevermore
like, you think i'm writing this by hand? lol
hell nah
hell nah to which part
this part
yeah lol
i like claude code but its really stupid but its also really smart
i understand why people kneejerk react to it negatively
but also like, i feel like you're just wasting your own time at some point if you refuse to touch it on principle
Never try to vibe code a SDL to Qt Frontend Migration!
in my job, writing code is maybe like
10-15% of what i do
writing code isnt the hard part
designing software is hard
me personally I just use gemini to copy code when I'm so lazy
but I mostly write code by hand (unless it's boilerplate)
ai is GOATED in boilerplate
claude wrote basically all of the javadoc-style engine api docs
as well as the big fancy architecture docs
but not just freeform
it just turned my shitty all lowercase hyphenated lists into something useful
My ass writing the billionth aspect ratio scaling code in QML
i do most/all of the api design by hand
if things are sufficiently hairy (low level, concurrency, etc) i do it by hand
but idk what i really gain by implementing a function like
void RestRouter::dispatch(RestEndpoint& endpoint, const http::Request& req, http::Response& res) {
// CORS headers are set globally via set_default_headers in bind().
try {
// Build RestRequest from http::Request (no lock needed — pure parsing)
RestRequest rest_req;
rest_req.method = req.method;
rest_req.path = req.path;
for (auto& [key, value] : req.path_params)
rest_req.path_params[key] = value;
for (auto& [key, value] : req.params)
rest_req.query_params[key] = value;
// Parse JSON body if present
auto content_type = req.get_header_value("Content-Type");
if (!req.body.empty() && content_type.find("application/json") != std::string::npos) {
try {
rest_req.body = nlohmann::json::parse(req.body);
}
catch (const nlohmann::json::parse_error&) {
res.status = 400;
res.set_content(R"({"reason":"Malformed JSON in request body"})", "application/json");
return;
}
}
// Extract bearer token
auto auth_header = req.get_header_value("Authorization");
if (auth_header.size() > 7 && auth_header.substr(0, 7) == "Bearer ") {
rest_req.bearer_token = auth_header.substr(7);
}
// Single lock for auth + handler — prevents session from being
// destroyed between the auth check and the handler call.
RestResponse rest_res;
{
std::lock_guard lock(dispatch_mutex_);
if (endpoint.requires_auth()) {
if (rest_req.bearer_token.empty()) {
res.status = 401;
res.set_content(R"({"reason":"Missing session token"})", "application/json");
return;
}
if (!auth_func_) {
res.status = 500;
res.set_content(R"({"reason":"Server authentication is not configured"})", "application/json");
return;
}
rest_req.session = auth_func_(rest_req.bearer_token);
if (!rest_req.session) {
res.status = 401;
res.set_content(R"({"reason":"Invalid or expired session token"})", "application/json");
return;
}
rest_req.session->touch();
}
rest_res = endpoint.handle(rest_req);
}
// Write response (outside lock — no game state access)
res.status = rest_res.status;
if (rest_res.status == 204 || rest_res.body.is_null()) {
// No content
}
else {
res.set_content(rest_res.body.dump(), rest_res.content_type);
}
}
catch (const std::exception& e) {
Log::log_print(ERR, "REST: exception in %s %s: %s", endpoint.method().c_str(), endpoint.path_pattern().c_str(),
e.what());
res.status = 500;
res.set_content(R"({"reason":"An internal server error occurred"})", "application/json");
}
}
i just say like "write the dispatcher and wrap the access to shared state in a global lock" and describe the spec
I don't really care if something is vibecoded
as long as the code quality is good
its easy to vibecode your way into unmaintainable monolithic useless slop
you have to know where to be opinionated, where to insert your taste and your voice, and wehre to tell it to shut up and change its approach
its like
working with a junior engineer who rote memorized every textbook
it will always reach for the naive implementation, the leaky abstraction, the god class, hit all of the same roadblocks as someone who doesnt know better
but if you constrain it properly it just makes you insanely fast
It also helps a lot to do your research first to give it some initial guidance from the get go or you end up with parent.parent.parent.parent.parent.parent.parent.parent.parent in QML
the people who will actually gain something from vibe coding is actual swes who know what they're doing
am i an actual swe 
you write code
i like baiting people into asking what i do for work because it feels like a credibility truth nuke
what does that make you
that's why swes can get alot of value from it
but people who don't know coding will eventually make such shitty code not even Claude can help them
😶🌫️
"just shipped my new vibecoded project
"
http://localhost:8080/
I've only ever seen that once lmao
I guess they are evolving and realized that maybe localhost isn't how you ship
they probably use vercel or something similar now
"shipping" is an illusion sold to you by aws
talk to me when you ship your code past the karman line
whereas "shipping" is the department of the rest of amazon
TRUE
this is my first time I've seen a flight software engineer
I thought y'all were still stuck on Ada or something
i wish we did anything that sane
im gonna be the flight controller for the flight software seat on our next launch on friday night
its cool
i'm part of the go/no-go poll
i monitor 30 or so sats as they go through deployment and activation and LEOPs
triage any issues that show up
its fun
one day I'll be that good
i feel like i just kind of lucked into this job myself
no degree and 3 years of industry experience
i wish i was a little bi t taller i wish i w as a baller
true
I only have like 1 year of coding experience lol
ive been programming since
uh
idk it depends what you call programming
when i was like 8 i was making "games" in powerpoint using the silde-to-slide transitions sequencing
What are your guys thoughts on haskell
i learned java when i was... 12 or 13?
I program in Haskell
decent language
It looks cool
i feel like you need a cs phd to understand the type system in haskell
i dont have an opinion on haskell because the only three languages i know are c++ python and wrightscript
Phoenix wrightscript
Yes
the type system in haskell is basically Turing complete
My beloved
it's the scripting language for pywright

It's literally untyped lambda calculus
In1 writes stuff in PyWright that feels forbiddden.
i wrote a brainfuck interpreter in it
primaryGravitationalParameter :: !(Quantity ((:*) ((:^) Meter (Succ (Succ (Succ 'Zero)))) ((:^) Second (Pred (Pred 'Zero)))) a)
- those that boil down to machine truth - you are given an abstract machine upon which you operate in an analagous manner to machine code. turing machines
- those that boil down to abstraction-truth, the scheme, haskell, FP nonsense of the world, where you operate on the most pure and abstract math-nice things. lambda calculuses
- data scientist baby glue - python, ruby, bash scripts, javascript
Oh like a @hard wing
you can even describe your api in the type system
with servant
i feel like you can express most of what's fucked up about wrightscript with the two horsemen of the stringpocalypse
- the base type of all data is string, including pointers
- substr() does not exist
Pred mentioned, time to make it a VORE CASE

succ

I think that's just church numerals
the perfect programming language already exists
and it was made at bell labs in the 70s
the second best programming language is just a code generator for the best programming language that gives you things like "type safety" and "smart pointers" and "containers"
every C++ program can be described with an equivalent C program
Templates:
templates are literally just "generate a type specific implementation of this for me automatically"
Aren't they adding reflection to C++23?
no that's c++26
Zig 🌩️
zig is the compiler that wouldn't compile your code just because the creator thinks you wrote shitty code
reflection is also just "what if the compiler generated specifiers as strings with a macro and did this type safely"
zig
Ah, so another ten decades.
zig is worse C with worse opinions and a worse ecosystem
just let me have unused functions
An unused function is a useless function
why make a "better C" when C already exists???
it takes ages just to upgrade the c++ version because idk
But isn't zig faster
Iirc
wait why don't people just upgrade their c++ versions to always be the latest
Idk much ab zig
because the spec is 2000 pages long and you need buy-in from compiler developers and stdlib authors
compiler and stdlib support
no, zig is not "faster"
oh yeah I forgot that compilers take decades to implement a standard fully
have you seen the C++ spec
doesn't zig use llvm
you are basically getting the same performance as something like clang (if I understood correctly)
Thankfully no

zig literally is implemented as an llvm frontend
it uses the exact same code generator as C and C++ in clang
MAYBE in some edge cases but I can't really see why
zig users on average know very little about programming
it seems to be more of an aesthetic lifestyle signal for a certain type of person
mostly obnoxious silicon valley hustle types on twitter in my experience

I do like zigs optional and result types
that's like honestly one of the most useful things ever
std::optional is right there
zig is marketed as a better C not a better C++
Ahh
NULL only works if your function returns a pointer
if youre not insane you can also implement a tagged union in a header in about 15 minutes
or just use an out parameter and return a bool
that works too
OK fine C is actually good
it will convert to any integral type via implicit conversion
Zig sucks.
GIVE ME A LANGUAGE WITH:
- the type and memory safety of C
- the simplicity of C++
- the generics of Golang
- the compile times of Rust
- the portability of an assembly language
- the boilerplate of Java
- the imperative flow control of SQL
- the speed and package management infrastructure of Python
- the ecosystem maturity and flexibility of Zig
- the type system of Javascript
- the security of PHP
- the readability of Perl
The stickers are cute though
imagine if that existed
it already does. it's called COBOL
dont talk shit on my goat
LOL
I love cursed perl language
Ada is actually a great programming language
i first got exposed to it in, of all places, ACPI
well
ACPI isnt quite right
i was fucking around with ACPI which led me to coreboot's gfxinit
which is written in ada
can I use zig on embedded m68k or 8085
in coreboot????
you can use it with any backend that llvm supports, so yes
MicroZig Homepage
does llvm not support m68k
test your luck
i wonder what the automatic launch command sequencing tool for the SLS was written in
probably Ada
i probably really shouldnt talk too much about it
NDA?
probably Keil C
worse. EAR
and, to some degree, ITAR
we dont use any ancient cursed hardware
8051 powers most modern usb3 hubs
I have no idea what any of those mean
EAR = export restrictions
ITAR = weapons export restrictions
Damn
makes sense
EAR covers a lot
pretty much anything that touches space is by definition "specially designed" and falls under a blanked export control category, and theres a million more granular categories as well
ITAR is a bit more focused but
high speed high altitude gnss = ITAR
anything attached to a rocket that can go to space = ITAR
i will say
the thermal profiles
chips can literally freeze to death
gigabit?
is this like Starlink where you give people internet from space
or something else
do keep it to yourself

cyberdyne systems
sure
it gives local police forces the system from the minority report
this will generate so much shareholder value
yeah i already have experiencing dealing with c++ codebases that are agonizing to compile
oops forgot to clone with submodules
the hell is AOSDL_GENERATE_SCHEMAS
i aint installing a python package bro
go

That is my sitting posture
Let me find that one meme
@thick osprey do you sit like this
Server stuff.
On build time it creates the shemas to use for server inbound packet validation
I just asked claude to build it for me thanks salanto for that op trick
🥺
OOO
i will NEVER compile a codebase that uses qt
LMFAO
its optional for a reason
Skill issue
Why the qt hate
Qt is a perfectly fine development framework.
no that aint a skill issue
im preserving my sanity
the script generates c++ from the openapi spec yaml to validate schemas on the rest api
you dont need it for the client or a non-prod server
People who says this rarely manage to quantify why Qt is bad.
You're so qt(cute)
:3
building qt apps is a headache and i swear its not a skill issue
It is
A headache.
I've had to build ao2..
i understand why most desktop apps use electron
atleast its not miserable to compile 😭
The ao client force integration requiring discord library is ass
It has to be in the same directory it sucks. It won't boot without it even if u get past the build process.
not even a macro to disable discord rpc?
It hardcore requires it
I can disable it but
IT will still ask for it
And refuse to boot
Ao2 requires a discord library as a dependency which is stupid.
You forgot to clean the CMake config after turning it off.
Options are cached.
It should not when Discord RPC is disabled.
Its just time consuming
Ao sdl
Has at least a cleaner build process
Which i like
But again there's no qt on it yet right
yeah its imgui i believe
Ahhh
im so close
It compiles all the same on SDL since we don't have a bass or discord link.
Those make it "harder"
Im so thankful Bass.dll is gone
Miniaudio is a negger choice
Better
Sorry oh phone
ive always hated bass because its nonfree software
soloud or miniaudio are both automatically better because its foss
^^^^
got it working
how do yall test it
theres no singleplayer mode 😭
i am NOT compiling akashi 😭
ON their release page
Just connect to vanilla?
Or WTP?
Vanilla runs upstream akashi
Wtp runs a forked akashi both will give near enough h same results
Idk any other akashi server
i just join some random server
Yes
Use a vpn i wouldn't say every server is trustworthy
Just to be on the safe side.
???
akashi doesnt have mac binaries
every day i get absolutely fucked over by apple
you built the server binary too? the server app code is tiny and it links to the same libs as the client so you dont need to build much extra
but tbh i just test on public servers lol
Yeah
not yet
**Akashi ** - sudo apt update && sudo apt install -y git build-essential cmake qt6-base-dev qt6-tools-dev qt6-websockets-dev && git clone https://github.com/AttorneyOnline/akashi && cd akashi && mkdir -p build && cd build && cmake .. -DCMAKE_BUILD_TYPE=Release && cmake --build . --config Release -- -j1
also i am a big believer in test driven development
most of the logic code is tested on pre written test cases so it works when i go to the real world
Disconnect button
Sounds like I found what to do today.
oh lmao it was hidden


Mac builds were uncommon since we had nobody to develop on hardware or to test them.
i have x86_64-darwin
Now that at least two people own a god damn apple PC it's easier to test and develop against.
arm64-darwin, me think
im not the only one getting shit on by apple??
My MacBook to test Qt against Metal literally arrived yesterday.
you'll feel my pain
macos is NOT opinionated windows 11
macos is just freebsd but babified for tech illiterate people
neo?
gatekeeper sucks
I build akashi on the vanilla vps because it was easier than to download and extract a binary
wget and unzip
Bought mine used for 500-ish euro.
i did that in about 4 seconds
git and cmake
Core, Network, Websocket and Sql I think.
Yeah
This works
Read a string from the user.
If at any point your code is unsafe, we power down your computer.
ok no more shitposting for now.
tf is a flutter app lol
flutter is a ui framework by google that uses the dart programming language
google aint that bad 😭
(For context, Google fucking sucks.)
[They do make some useful apps and shit tho.]
the only thing i dislike about flutter is how nested it feels
like here (note that this is not ao-sdl, this is my code)
everything is a widget™
i looked at the screenshot and thought wow i hate this
and then i remembered that webAOs ui.js looks very similiar
Widget 💔
i dont think flutter is spyware
he was talking about google
its just a cross platform mobile ui framework
curse of ra
thisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthis
AH, yes...
MyRenderer.materials
What program did you use to draw it or did Claude do that
I used to do those with Dia but it takes effort to make them look nice
Create diagrams and visualizations using text and code.
i didnt put these in the repo, they're just my personal notes
but if there is desire i can have claude make them prettier and add them
i asked because id have a good use for some nice looking diagrams
i just wrote these by hand in mermaid
<@&985183817117601812> real metrics for server hosts in a live dashboard? why not!
demo: https://staging.attorneyoffline.de/grafana/d/kagami-overview/kagami-overview?orgId=1&from=now-1h&to=now&timezone=browser&refresh=10s
so basically just like cloudflare or something
a bit, i suppose, but this has a lot more visibility into server internals
even performance metrics on stuff that might impact future scalability
seems a bit intrusive
all server state mutations are serialized through this lock, so it profiles it and shows it on a dashboard!
how exactly is "this is how the server is performing" intrusive...?
it does look cool but i think the whole room thing is unneeded
like idk how that would help anyone
"how many players are in each area" is public info
i do like the uptime and memory stuff
some of this data is for developer purposes, identifying performance bottlenecks
and websocket stuff this is cool
you can fully customize the dashboards
so if you just wanna know like "how many moderators are online" or set up mod audit log queries, you can just see that
or you could just log onto the server
i think a queryable live dashboard ui is much better ux than ssh and pick through logs...
A lot of moderators ask for external measures to not always have to login as much
No. I'm more so just trying to think from AO as a whole.
If everything is external it will stop people from joining AO as much.
this is meant for server admins to look at
some of this info is really important for servers like vanilla that have a lot of mods and a lot of spam
It is pretty sweet. I'm not going to lie.
But lately it feels like AO is heading towards a more gatekept closed community whether it be whitelists, or forcing discord integration and external factors. I guess my point is more so trying to say, I don't think the entire focus should just be external tools.
But I do like the idea of having a dashboard.
public servers have always been kind of a bad idea to be perfectly honest with you
it's like if you were playing D&D but with whatever randos happened to be in the game store that day
it's a recipe for clashes of expectations and drama
...again, this is a tool for like, server admins of public servers
its not the "entire focus" its addressing major UX pain that makes running servers like vanilla practically impossible
im not really sure what you're saying exactly
if anything this will make AO more open
because it makes it easier for people to run servers without dealing with bullshit
this will make AO more manageable and improve the efficacy of having an admin at all.
It also is a funny joke for server owners to brag about their uptime, so even if some stuff is public it might just be minimal info for players.
I am seeing this just now, what does SDL bring to the table for AO?
by not being restricted to only acting while having access to the server, you improve the ability to administrate.
Dude are you okay

I guess I'm more so trying to make a general point. If we have a public server list, shouldn't server owners expect trolls and random people? If they list on a public master server. They should know that it's open. So I guess another point I was more so thinking is like; it's a point towards AO as a whole. I've just noticed lately since more servers are becoming gatekept or private. Why are they still listing themselves on a public server list if there is a barrier of entry to get in the first place.
Maybe that's a different topic for another day. But it kinda is weird.
i just dont see what this has to do with metrics dashboards
Why are you making a general point about server culture in the thread for a program rewrite
Valid point.
If you want to complain to someone you can complain to Wiso, he loves that
I think overall the culture can improve when administrative tasks are easier to handle. Currently you invest a lot of energy to handle elements that should be easier.
^
Makes sense, yeah.
moderation and maintenance are annoying so server owners don't do it as much as they really should
frankly, scatterflower, a server with a UI that lets you kick, ban, etc. players without needing to open client would be ideal too.
Then that becomes discord moderation with extra steps essentially.
fully featured web admin panels would make server owners cream their pants
A lot of servers avoid being public because it's just so hard currently to moderatore.
Improvements like this make people more likely to invest the steps to go public
If you aren't going to log on AO, you're just moderating from another service.
it's actually a bad thing that you have to launch ao2 to ban spammers when your players ping you about it
Sometimes trolls have made it impossible to connect via client regardless, too.
it makes moderation more difficult
Spam protection is an idea.
we have it
Then what's the problem lol
It's not foolproof.
what's your problem
Making an admin's job easier = good
why are you so against quality of life for server administration
I think we should cool this down slightly. We are edging on being accusational.
None whatsoever. I'm not against it. I'm more so talking about privacy side of things and not making the eco system worse than it already is. If servers are relying on discord to moderate then something is wrong.
nothing you do on ao2 is private
It can be.
it is an unencrypted protocol based on joining servers hosted by third parties
it is not and has never been private
Anyhow, as said. The dashboard is exclusively for admins to view.
Ergo. Private.
It's on them if they choose to share metrics.
It helps developers also troubleshoot issues with admins by giving info on the servers internal runtime without having to do complex steps.
Yeah it's not a bad thing to have. I was just trying to make a point that we should do more for AO itself than solving core issues with external dependancys or platforms.
news flash the admins can already see your IP and messages because they own the machine you're connecting to and that's not a problem because it's a roleplaying tool

if you want secure channels of communication use signal or something
It's an opinion. I'm allowed to have I think.
To be fair, moderation tools in client are also bound to receive a major upgrade.
yeah i mean i just think you're wrong
a few thoughts here:
- grafana can integrate alarming with webhooks which is super nice since discord has webhooks! so you could have an admin configure like "if the server restarts ping me in discord" or "if a chat is being flooded let me know"
- i'm planning on adding some automod features that would report thru metrics to grafana. this could add integrated support for wiring modcalls to discord, letting admins know if someone is spamming slurs, etc
- new protocol is RESTful so its pretty straightforward to make a web ui (or, hell, even some hidden endpoints grafana accesses thru the business forms plugin) to kick, ban, whatever people
- kagami itself could expose webhooks to automate moderation actions from alarms surfaced by automod
sister, solving these issues early in the rewrite's lifetime is necessary for a strong foundation. otherwise we've just made AO2.5
actually Tricky made that one
theres no external platform here. grafana is part of docker compose but kagami just... makes data available on http endpoints, because it has an entire http server in it, because thats how the new protocol works
Okay that's a good step in the right direction.
the grafana instance is literally running on the same server
grafana is software it's not a third party platform
Your concerns are certainly valid, but in this case I think it was blowing it a bit out of proportions.
Maybe so but when people are talking about adding more support for discord it doesn't raise confidence.
On first glance.
eh?
Qué?
i think theres a pretty massive gulf between "submit mod alerts to an arbitrary webhook (which may be discord) vs "force everything through discord for authentication and moderation" (which, btw, akashi already does half of that)
ao players when they want privacy but also don't want to authenticate ever
Afaik the general consensus was that authentication is opt-in, but also a "have your cake and eat it to."
kid named raidensnake
bleh
So far on the moderation side we arey as far as I can tell, becoming less reliant on Discord beyond just simple notification Webhooks.
The grafana thing is just a QoL Dashboard for curios people and debugging. Afaik even optional too.
as long as it stays that way then i think people will have no problems
you could also get an email with the same info instead of using discord for it
again, i want to emphasize how important visibility into memory usage, lock contention, and network i/o is for development
it's very easy to do that
Time to add that to Akashi.
do not
i put a lot of work into getting this thing to perform well under heavy concurrent loads which is basically a necessity if we want this to be an asset server backend that servers a billion tiny files
Get your forks out and lets get comitting mail.
as that one guy named their fork for whatever reason
"kakashit"
/j
Afaik the current means remain viable, but the "best" ((imo)) experience will be on servers that go with modern ways.
kaka means poop in baby german
aov would bitch us out if they were forced to authenticate with anything
safe to say it's opt in
aov would string us up in the town square by our innards
are u being fr?
i mean realistically they'd just be really annoying
what did they add to it
this doesnt even show you peoples ip addrs/hdids
idk i didn't check
(which, to be fair)
probably shit judging by the name
mfw people make a fork but don't add anything
i think it was that clover person who contributed a bugfix once from their fork that I'm pretty sure they are violating gpl by not hosting somewhere. unless it's on gitlab or some such
that's just the majority of AO2's playerbase smh
cloverrr?
someone could rip out half of the code and call it their own and refuse to share it, and honestly, i wouldnt give a shit
idk. i don't know any of the ao regulars anymore all the normal people left so now it's all roblox kids
too much pain with that happening in akashi/ao2 anyways
if it is them they are a weirdo
that's why i never advertise to master
not really an earned one
same
i dont believe many people in this community other than me are technically capable of making it better than i can
i have some ideas for automod
salautomod
German wants to write a robot cop what a surprise
I will censor the word HDF and auto ban you for using it.
i sort of want to experiment with LLM-based automoderation but i feel like that would not be well received, and its probably too pricey anyways
chatgpt mod my server
idk what HDF is they just appeared one day and now they're the largest server around
HDF is dead
does he know
not just raw calls into chatgpt but more like word2vec style embeddings and quantitative sentiment analysis
i'm not so stupid that i would just like
they sorry
pipe IC messages into chatgpt
not a they either
So do I. I love rulesets
Anyone who mentions Ruby gets the ban.
mechahitler 2 in 10 seconds flat
I've known like six people named that
20% cooler automod
this one likes kids.
??????????????
implying
implying
i famously don't like kids
that's not true
she likes me
you like 1 person
i like saturday
see
i like salanto
saturday is awesome
:D
i like you okay samevi
i don't really know you that well but you seem like a good egg
i've never heard that before
i like plenty of people they just happen to be mostly not here LOL
damn
Why
salanto is one of the good ones
Salanto is baller
🪭
even though we had stupid teenager beef like half a decade ago
Lmaoooo
beefnager
you had salanto beef??
Don't
beeflanto
yeah when i was like 19 and i don't even remember why
i think it might have just been vibes honestly
or maybe i did something that I've since forgotten about
maybe it was the stress of ao2
Certainly a factor!
im so glad that through sheer force of will i have excreted ao-sdl into existence
i was a case cafe moderator around then
im actually really excited about this project
it is very cool
i hope other people are too
i am excited
oh god poor 19 year old in1tiate
i am also excited
i can't remember if i was 19 or if it was 2019
its great stuff
if it was the latter then i would have been 17
oh god poor 17 or 19 year old in1tiate
the whole server/caddy/grafana/prometheus stack is deployable via docker compose and all the config will exist in the repo
so someone with a vps can set the whole thing up with 3 commands
it will even set up tls certs for you automatically
ah yeah caddy is automatic HTTPS
ok no on checking my dates it was definitely 2019. actual baby
more importantly, http/2 or /3
which matters a LOT due to how asset fetching works
Not as fast as nginx but it's still user friendly
the protocol and connection overhead is massive
i dont really trust nginx im not gonna lie, i never have
damn mechahitler 2 would've liked you /j
Why?
Is it because it logs IPS on default?
If that is why then yeah makes sense.

I was just curious, sorry.
ao users when the mail carrier needs their address to deliver the mail
I was just using IPS as a guess.
the corporate ownership history, the very messy affair with Rambler, the company literally getting raided by russian police, the original author getting ousted, the new corporate owners being generally sketchy
I didn't know it went that deep.
it handles lets encrypt for you
the deployables are nice
i hope people actually use them
my goal is that running this on a vps is literally "run these three commands"
running on your moms laptop is "download the .exe and double click"
it supports log sinks to both loki (managed by docker compose) and cloudwatch - simultaneously
just put the key in the config and it works
i have an implementation for the stupid aws request signing so i can hook into pretty much any aws api
some sick part of me wants to add in autoscaling
graceful, automatic scalability from mom's laptop to mom's credit card
wdym
aws integration?
i have aws so what could you do w/ it
yeah, it can make requests to any aws service endpoint
oooooooo
right now it supports logging to cloudwatch
thats cool
autoscaling is possible
spin up new ECS workers and attach and remove them from an ALB
cloudfront autoconfig
manage the assets from S3
whatever you can dream of
web scale and mom's laptop in the same binary :o
insane
getting inter-shard federation would be. a pretty massive technical undertaking. but its also not impossible; i'd basically just need to add a service discovery mechanism and some RPC for state sync
but honestly
i really do not want to think about distributed computing problems right now lol
the threading model is complicated enough
the entire stack is light enough to run on a t4g.nano
that's $3/month
i am not joking when i say i put a lot of work into high-concurrency performance
my http server basically has "goroutines in cpp from scratch"
with three different abstracted socket and poll api backends implemented via link-time polymorphism
:)
theres still a global lock on mutating server state, though
theres a reason i added profiling metrics to it
i don't trust it to scale
and i really dont know how im going to work through that one
i did some concurrency profiling earlier
saturday@Saturdays-MacBook-Air myapp % python3 concurrency_profiler.py -H https://canary.attorneyoffline.de -m 256 -r 500 --http1
Target: https://canary.attorneyoffline.de
Requests per level: 500
Concurrency levels: [1, 2, 4, 8, 16, 32, 64, 128, 256]
Baseline: 327.3ms (HTTP/HTTP/1.1)
c= 1 p50= 51.8ms p95= 91.5ms p99= 103.7ms avg= 57.0ms min= 37.2ms max= 143.8ms n=500
c= 2 p50= 58.6ms p95= 97.7ms p99= 105.3ms avg= 66.8ms min= 35.4ms max= 226.0ms n=500
c= 4 p50= 87.1ms p95= 101.8ms p99= 109.1ms avg= 78.8ms min= 39.6ms max= 237.2ms n=500
c= 8 p50= 85.1ms p95= 99.1ms p99= 238.4ms avg= 82.9ms min= 35.0ms max= 274.8ms n=500
c= 16 p50= 88.7ms p95= 113.2ms p99= 7665.2ms avg= 174.5ms min= 36.6ms max= 8379.5ms n=500
c= 32 p50= 94.9ms p95= 338.5ms p99=18549.1ms avg= 679.9ms min= 40.7ms max=18732.6ms n=500
c= 64 p50= 91.8ms p95=13526.6ms p99=28493.4ms avg= 1600.1ms min= 34.8ms max=28519.5ms n=487 err=13
c= 128 p50= 93.8ms p95=18685.3ms p99=28761.4ms avg= 1848.2ms min= 37.6ms max=28791.1ms n=421 err=79
c= 256 p50= 684.6ms p95=25679.4ms p99=25726.7ms avg= 7691.3ms min= 133.5ms max=25726.7ms n=84 err=416
--- RTT vs Concurrency (p50) ---
c= 1 | #### 52ms
c= 2 | ##### 59ms
c= 4 | ####### 87ms
c= 8 | ####### 85ms
c= 16 | ####### 89ms
c= 32 | ######## 95ms
c= 64 | ######## 92ms
c= 128 | ######## 94ms
c= 256 | ############################################################ 685ms
this is with the httplib.h server
it just crumbles once you hit the threadpool size
saturday@Saturdays-MacBook-Air myapp % python3 concurrency_profiler.py -H http://localhost -m 16384
Target: http://localhost
Requests per level: 50
Concurrency levels: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384]
Baseline: 5.2ms (HTTP/HTTP/1.1)
c= 1 p50= 1.5ms p95= 1.8ms p99= 1.9ms avg= 1.6ms min= 1.4ms max= 1.9ms n=50
c= 2 p50= 2.1ms p95= 2.5ms p99= 2.5ms avg= 2.2ms min= 1.8ms max= 2.5ms n=50
c= 4 p50= 3.7ms p95= 4.1ms p99= 4.5ms avg= 3.5ms min= 1.9ms max= 4.5ms n=50
c= 8 p50= 6.6ms p95= 7.7ms p99= 8.1ms avg= 6.4ms min= 2.3ms max= 8.1ms n=50
c= 16 p50= 11.9ms p95= 16.9ms p99= 17.4ms avg= 11.6ms min= 2.1ms max= 17.4ms n=50
c= 32 p50= 13.8ms p95= 21.7ms p99= 22.7ms avg= 15.8ms min= 9.3ms max= 22.7ms n=50
c= 64 p50= 31.4ms p95= 33.8ms p99= 34.7ms avg= 29.0ms min= 17.2ms max= 34.7ms n=50
c= 128 p50= 29.3ms p95= 31.6ms p99= 31.9ms avg= 26.9ms min= 12.4ms max= 31.9ms n=50
c= 256 p50= 30.7ms p95= 34.3ms p99= 36.4ms avg= 29.0ms min= 19.2ms max= 36.4ms n=50
c= 512 p50= 30.2ms p95= 32.6ms p99= 32.7ms avg= 28.0ms min= 19.4ms max= 32.7ms n=50
c=1024 p50= 29.3ms p95= 32.5ms p99= 32.9ms avg= 27.2ms min= 16.2ms max= 32.9ms n=50
c=2048 p50= 30.4ms p95= 33.8ms p99= 34.0ms avg= 28.2ms min= 18.7ms max= 34.0ms n=50
c=4096 p50= 30.5ms p95= 33.2ms p99= 33.6ms avg= 28.5ms min= 18.4ms max= 33.6ms n=50
c=8192 p50= 34.7ms p95= 36.9ms p99= 37.3ms avg= 32.4ms min= 22.7ms max= 37.3ms n=50
c=16384 p50= 30.4ms p95= 33.2ms p99= 33.8ms avg= 28.3ms min= 17.4ms max= 33.8ms n=50
--- RTT vs Concurrency (p50) ---
c= 1 | ## 2ms
c= 2 | ### 2ms
c= 4 | ###### 4ms
c= 8 | ########### 7ms
c= 16 | #################### 12ms
c= 32 | ####################### 14ms
c= 64 | ###################################################### 31ms
c= 128 | ################################################## 29ms
c= 256 | ##################################################### 31ms
c= 512 | #################################################### 30ms
c=1024 | ################################################## 29ms
c=2048 | #################################################### 30ms
c=4096 | #################################################### 30ms
c=8192 | ############################################################ 35ms
c=16384 | #################################################### 30ms
this is with my custom http server
http/2 is even better because you can multiplex everything on one socket
but
the server only speaks http/1.1 and relies on caddy to demux
its still more efficient at the transport/networking level (esp http/3)
and it makes a big difference
the local connection path has like no overhead since its just internal copies in the kernel (and tbh linux is probably smart enough to zero-copy loopback data)
oooh i should run the concurrency profiler with my new metrics
Target: https://canary.attorneyoffline.de/
Requests per level: 50
Concurrency levels: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384]
Baseline: 76.7ms (HTTP/HTTP/2)
c= 1 p50= 18.4ms p95= 26.7ms p99= 57.0ms avg= 19.8ms min= 15.2ms max= 57.0ms n=50
c= 2 p50= 17.2ms p95= 23.7ms p99= 26.6ms avg= 17.5ms min= 13.8ms max= 26.6ms n=50
c= 4 p50= 17.4ms p95= 26.2ms p99= 30.4ms avg= 18.4ms min= 14.5ms max= 30.4ms n=50
c= 8 p50= 21.6ms p95= 30.3ms p99= 33.3ms avg= 21.8ms min= 14.0ms max= 33.3ms n=50
c= 16 p50= 22.3ms p95= 46.4ms p99= 46.7ms avg= 27.7ms min= 14.1ms max= 46.7ms n=50
c= 32 p50= 48.4ms p95= 55.0ms p99= 58.6ms avg= 41.4ms min= 18.4ms max= 58.6ms n=50
c= 64 p50= 42.3ms p95= 46.1ms p99= 46.3ms avg= 41.5ms min= 29.1ms max= 46.3ms n=50
c= 128 p50= 44.4ms p95= 50.5ms p99= 50.8ms avg= 45.9ms min= 36.2ms max= 50.8ms n=50
c= 256 p50= 61.4ms p95= 63.5ms p99= 64.8ms avg= 60.9ms min= 38.8ms max= 64.8ms n=50
c= 512 p50= 42.0ms p95= 44.1ms p99= 44.3ms avg= 41.2ms min= 32.9ms max= 44.3ms n=50
c=1024 p50= 83.4ms p95= 87.2ms p99= 87.8ms avg= 82.6ms min= 54.8ms max= 87.8ms n=50
c=2048 p50= 49.7ms p95= 54.8ms p99= 55.5ms avg= 49.8ms min= 26.0ms max= 55.5ms n=50
c=4096 p50= 86.3ms p95= 420.8ms p99= 422.0ms avg= 218.7ms min= 79.3ms max= 422.0ms n=50
c=8192 p50= 103.8ms p95= 109.4ms p99= 109.7ms avg= 103.7ms min= 87.0ms max= 109.7ms n=50
c=16384 p50= 86.0ms p95= 92.9ms p99= 93.7ms avg= 84.1ms min= 41.5ms max= 93.7ms n=50
--- RTT vs Concurrency (p50) ---
c= 1 | ########## 18ms
c= 2 | ######### 17ms
c= 4 | ########## 17ms
c= 8 | ############ 22ms
c= 16 | ############ 22ms
c= 32 | ########################### 48ms
c= 64 | ######################## 42ms
c= 128 | ######################### 44ms
c= 256 | ################################### 61ms
c= 512 | ######################## 42ms
c=1024 | ################################################ 83ms
c=2048 | ############################ 50ms
c=4096 | ################################################# 86ms
c=8192 | ############################################################ 104ms
c=16384 | ################################################# 86ms
never gonna get tired of that
holy shit
ahhh my chudling global lock
I'm confused by all this tech stuff ;-;
Mod Dashboard seems like a fucking brilliant idea though.
Your what?
you heard me
That does not explain why you have a global chudlings lock
dont worry im making it read-concurrent
what the fuck is a chudling

Finally added some debug info to the Qt Frontend too:
With the completion of this last feature branch, I will be ending my work on the AO-SDL/kagami project. Thanks to everyone who showed interest. The source code remains available publicly under the MIT license.
why is AO-SDL now archived on github
ohhhhh
i thought AO-SDL/kagami meant kagami (which is from AO-SDL) like its a filesystem
well rip
i wanted to add a color logger
did you get demoted????
wait what
They did not.
what hapepned
Again thank you for your great work. I am curious on why the sudden end of the project, not that your required to give an answer.
But as someone who kept up with the project and the other people, I think it would be nice to know if it was because you lost interest or external factors that you can't/ won't go into for privacy/personal/security reasons?
Again we are all grateful for what you have done.
yeah it felt pretty sudden
i thought it was going fine like 1-2 days ago
claude ran out of tokens
who wants to fork
it works and you can connect to vanila
sad that AO-SDL is basically dead
i guess no more macos native ao lol
we have native macos ao
it's just really troublesome to install and no one cares
the iphone version is the more important one
There is no need to speculate, if they want to share something, they will.
I realize it sucks to disappear and offer no explanation. I don't want to blame anyone or throw anyone under the bus, this decision is the confluence of a few things:
- Every attempt to make "new AO2" has failed because many of the people who are willing to contribute to development, frankly, do not get along well. I understand this, it is what it is, but inserting myself into these dynamics just stresses me out and makes me feel awful. I don't like to pick sides or upset people and I don't want to cause anyone harm or distress. I want to solve purely technical problems but I don't feel like I am able to focus on this
- AO's requirements conflict with what I want to design. The master server model has been completely abandoned elsewhere for a reason; it doesn't scale well and it creates fiefdoms within the community that fragment it and bring in a whole host of dynamics that (see reason #1) I want no part in.
- AO-SDL is very complex cross-platform software. I don't have the time or energy or hardware to test and chase down bugs in all 5(!) platforms it supports by myself and remain sane.
- Another problematic outcome of the complexity is that, somewhat selfishly, I only trust myself to make the design decisions that will shape the project to completion. While this can be quite rewarding, it is stressful, and I feel like I am implicitly signing myself up to run a project indefinitely I probably won't have the bandwidth for forever.
- Related to 3 and 4, I don't think I can design this software in a way that is going to make everyone happy. The features people want are often incoherent to me and I don't think I have the skills or patience to make design decisions around them that will satisfy what people want
I wrote an HTTP application server that uses copy-on-write semantics and immutable trie data structures with lock-free updates and spent hours optimizing the socket poll and worker pool architecture so that the server can seamlessly support tens of thousands of simultaneous connections. I am extremely proud of this, and in all honesty, it makes me ache a bit to know that it's going to be used to host at most maybe 30 users at a time. I don't know how to quite effectively communicate the feeling, but it kind of sucks. Maybe I just shouldn't have overengineered it. On the other hand, solving that problem was immensely rewarding in its own right.
And, I guess, that's the tension. The technical work is fun and I can motivate myself to do crazy things on that side, but then I take a step back and just feel..... disappointed, frustrated.
Thank you for your contributions regardless of what ends up coming of it.
Your choice is understandable and is to be respected, the heads up on is vastly appreciated.
I can't imagine what it was like for you in any reasonable capacity in terms of the technical side, but every step towards the development of the program is a step that counts.
Thanks to those who have tried to build or contribuite via beta-testing and feedback as well. It is what it is.
It continues to be what it is.
c'est la vie pour toujours
taps mic is this thing on?
everything i said above is still 100% true
but the fact remains, i cannot help myself
i am a sick person
to be honest i can understand that feeling
you WANT to stop but you just can't
i've experienced it alot with my other smaller projects
kagami is now resistant to multiple types of DDoS/DoS/spam attacks out of the box, on a tiny server (1 cpu 512mb ram), without the need for cloudflare at all
lfg
as much as i don't want to be the guy that pesters the dev about dumb crap, i must admit i'm getting pretty curious what the current scope for AO-SDL is, and whether or not features originally planned have been cut or set off to the side.
My scope has an always will be a working Qt frontend that allows the customisation denied to AO users since the beginning of time.
(and evidence. I like better evidence.)
deploy an AO server to aws with one link, no ssh or complexity needed
https://github.com/AttorneyOnline/AO-SDL/blob/master/deploy/README.md
<@&985183817117601812>
new protocol still in the works but the server has needed a lot of work to get things off the ground
and new protocol means new assets system, content authoring tooling, and a publication framework
impressive work
(though i hate aws and i think cloud is rotting our brains anyways)
well, theres a reason its one binary and not 30 microservices written in javascript
the main advantage here is the cloud infrastructure as code and automated deployment stuff
container registry updates and SSM a lot less flaky and a lot more secure than ad hoc scripts
and a cloudformation template is a lot easier for someone to use than some deploy script
but, if anyone prefers, the deploy script also exists. its also possible to just build the binary and drop it on a bare box. nothing here requires using a cloud platform but the integration exists because it makes deployment orders of magnitude easier
to be fair kagami does log to cloudwatch…
but it can also log to loki. or a bare file
all of the cloud integration is opt-in only
Your corporate overlords will be pleased.
I just wanted to say thank you salanto.
You don't appreciate what you have until you lose it.
So I thought I would just say that.
jeff bezos will surely be happy about this
also thank god its one binary
i hate microservices
too hard to deploy
the idea is its one binary that scales from "mom's laptop" to "mom's credit card" seamlessly
true
ok i lied
technically its two binaries
it does setcap on a helper binary to set up the kernel ip bans with nftables
feedback left here
I swear Qt is playing pogo with me.
Compiles on MacOS
Does not compile on Windows
Compiles on Windows
Does not on MacOS
Popout panels kinda work properly now, still need to see if I can fix their homing logic.

?
excited for popout panels
Yipee.
I would love to show it with a working render.
But OpenGL is busted as balls in Qt when using the SceneGraph.
So Windows gotta wait for Vulkan.
(it works fine on mac, lol.
Leaving me with this mess of a development pipeline.
(Yes, that's me working on Windows and Mac at the same time.)
gg
i feel like rdp to windows feels nicer than vnc to macos. vnc is so slow
vnc is basically just streaming the entire desktop as a video
where rdp is doing semantic info + bitmaps as a fallback of sub-regions
VNC is terrible.
☠️
@valid stone @alpine acorn
. . . I was showing off that the dock panels finally behave correctly.
I was gonna split music and areas.
this is greatt
(Ignoring the warnings.)
Looks nice.




