ZapFast: A fast, native WhatsApp client in Rust and egui
github.com
github.com
Is it just me or does anyone else feel that 200 MB is a lot for a native chat app written in Rust, that's essentially a remote interface for the WhatsApp on your phone?
I remember back in the day, apps like Miranda IM (and early versions of Trillian) used only digits of RAM, even when you had multiple plugins talking several protocols at the same time, whilst having a ton of advanced features not found in WhatsApp. Yes I get that times have changed and software has become bloated etc, but 200 MB still feels a bit too much.
> I remember back in the day, apps like Miranda IM (and early versions of Trillian) used only digits of RAM, even when you had multiple plugins talking several protocols at the same time
I think what's happening in the second one is that because you're using the native OS toolkits a bunch of stuff is shared, whereas with these "self-contained" "native"-y apps you end up having to load up the whole world and aren't sharing things with everything else
I'd love to be proven wrong but I feel like if you use e.g. Qt you're gonna have to hold onto a bunch of stuff that you wouldn't if you were "just" using OS-native stuff (though maybe that gets shared if you're using the exact same version? Is there something that can be done in this space?)
That was my first thought. But considering it as a significant improvement from > 1 GB, I guess it is what it is.
> I remember back in the day, apps like Miranda IM (and early versions of Trillian) used only digits of RAM ...
Sadly this was true for many apps.
Lastly, I still have to be convinced that Rust is a good choice for GUI programs, considering their messy mutable state and ownership.
Turns out all those zero cost abstractions add up to a lot!
Is there actually a way to see a breakdown of memory usage for a program? If you want to see where all the memory is going?
Flame graphs are a pretty common tool for this (maybe slightly less common than using them for seeing the breakdown of the time spent when running).
In the early days of AI coding someone did publish the prompts and it was utterly useless to me https://github.com/i365dev/LetterDrop
The source code itself is a sufficient prompt.
$ cat $(which whatsapp)
#!/bin/dash
# A kiosk is full-screen by design. You need to go to about:config and toggle
# full-screen-api.ignore-widgets to true to prevent our window manager from
# creating an actual full-screen window.
# Additionally, you need to set the name to "kiosk" which will set the app id
# under sway to "kiosk" so that in sway you can disable full-screen on
# startup.
firefox --name kiosk -P whatsapp --kiosk https://web.whatsapp.com/Egui is definitely not what you want to use on a 4K screen. It is only good for tiny screens of embedded devices.
Why there is no reactive UI that tracks all dependencies and redraws only what needs to be redrawn? (not React, it also re-calculates (but not redraws) everything on every change).
Also why does it visually look like bad version of Telegram? And Telegram can run without a phone present.
There's plenty of them. Slint, Floem, iced, Vizia, fltk etc. Slint and fltk in particular also exhibit excellent performance and very little resource usage even without a GPU.
Basically every device has a GPU.
Why is it bad on 4K?
Did you measure anything in a real setup?
Many VMs and remote desktops don't. (Or can't really make use of)
it's an incredible waste of resources, especially at high resolutions, to redraw a Gui application like you would a videogame at 60 FPS. These immediate mode UI frameworks were made in particular for that case, to be embedded in real time software, not for a UI where the state is idle or changes only occasionally.
Why do I have to state the obvious like that?
Nowadays the focus seems to be on video game-style interfaces that redraw every frame. The justification for this is typically that computers are so fast they can now come up with the entire interface every frame, so why not take advantage of that and forget all this retained-mode complexity?
They don't realize that this is a classic case of the developer's machine fallacy, where the developer has a machine so vastly more powerful than any of their users' that they produce a terrible experience for said users. This is also why games these days typically require upscaling even on 5090, because developers usually have that or something even more powerful and they think the bleeding edge is pushing even THAT machine to its knees.
Developers should be testing their software on the most entry-level, bottom of the barrel Chromebooks from 2015, running the heaviest and most bloated operating system they can think of. If people still optimized their software for that, then maybe computers would still feel almost as fast as the Apple II from 1977.
I would figure that doing less work generally requires less power, but some developers are crazy and act like they own the whole CPU, generate tons of heat, stress out the cooling system etc. with multithreaded bullshit that did NOT need to be multithreaded.
Some multithreaded workloads will use the full logical processor count to pin every core and that can really suck on low-end systems. I think aside from balancing multithreading overhead, this is one of the reasons why some more advanced software (such as 7-Zip) lets you select the number of threads to use for a workload, even if you already know and accept that it'll be expensive until it's completed.
Lots of multithreading things I come across as a developer have a default of something like 4 threads, or only use a certain fraction of logical cores up to a certain maximum, etc. because it's generally more polite not to always pin every core.
In my book, a good UI framework simply attaches to a mutable model made of arbitrary objects, detect changes and displays it with minimum number of operations. Doesn't require to use any proxies or immutable data or store data in components. Shouldn't be difficult. Why nobody made it, I do not understand.
Use context liberally instead of plumbing things through prop’s needlessly and you’re halfway there.
In my head it's retained mode + the diffing layer, which sounds the same but if you try to write an "immediate-mode" API (say, using hooks) in React you'll find yourself churning a lot.
At least unless you use the magic React compiler that memo-izes everything correctly.
but you shouldn't trust these unofficial clients, easy way to get your whatsapp account banned
Signal does that and I hate it when it happens.
- Screenshots don't age well: you need to know the screenshot time and do math
- They need to be maintained, which means the screen keeps updating even if nothing else is happening
It is silly to mix the two. I usually display the relative time and offer a timestamp on hover or if there's space, show both.
Anyway, I tried this application and it seems to mix different styles depending on how long ago you got the text: "yesterday", "Friday", "18 Oct 2026".
On the good side though - if you're replicating the official behaviour close enough... maybe nobody will know. But then you have to make sure everything, including key sort order, and JA4 of requests matches. And that's tough...
> Using an unofficial client may be against WhatsApp's terms of service and could get an account suspended.
Same for all of these unofficial clients.
I got banned for trying to move my chats from Android to iOS using the app rather than the special tool I didn't know you were supposed to use. I was lucky I eventually got unlocked.
I want a decent WhatsApp client that doesn't crash constantly and where you can search properly, but it's not worth the risk of getting banned again.