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

ThatWorks

@ThatWorks

Joined June 1st, 2026

  • 12Devlogs
  • 2Projects
  • 1Ships
  • 15Votes
Ship

🚀 Building a VPN I actually want to use! I’m creating an open-source, cross-platform VPN client powered by the most resilient protocols - VLESS + REALITY and Hysteria 2. Frustrated by ad-heavy apps and shady privacy policies, I decided to build my own full ecosystem from scratch—including custom servers, node architecture, and native apps for macOS and Android (Windows & Linux coming soon!). Super proud to turn this idea into reality and keep it completely clean and transparent. Give it a try and download the builds at https://astrex.club!

  • 10 devlogs
  • 52h
  • 14.10x multiplier
  • 625 Stardust
Try project → See source code →
Open comments for this post

1h 12m 56s logged

Fixed the x86_64 (Intel) build issues for macOS. Sing-box now compiles seamlessly for both ARM64 and Intel architectures.

0
0
16
Open comments for this post

2h 16m 56s logged

I’ve been so focused on the client lately that I haven’t posted a devlog about the custom backend I’ve been building in the background for about 10 hours (the time actually doesn’t match this devlog, but it’s already synced to the main counter - a bit of a weird system). The whole architecture runs on a central Hub that stores user data and traffic, with individual nodes connecting to it via WebSockets so users can easily fetch active nodes and route their connections. The most interesting challenge was figuring out how to update the Xray core config on the nodes without any restarts—I managed to hook into Xray’s gRPC API to inject users and track traffic on the fly, while Hysteria handles the same tasks at the rest level. I also spun up a quick landing page for app downloads at https://astrex.club, but since I completely vibecoded, I kept it off the project time tracker to keep things fair. If you want to poke around under the hood, you can check out the API docs at https://hub.astrex.skyfly.hackclub.app/docs and the public Grafana dashboard here: https://grafana.hub.astrex.skyfly.hackclub.app/public-dashboards/f396f592ce994d128f9b2a321030ad58

0
0
11
Open comments for this post

3h 54m 13s logged

Finally automated releases. One Gradle task now handles the whole process: updates versions in Android and iOS from libs.versions.toml, generates signed split APKs per architecture, and kicks off the macOS DMG build. (Plus, I finally fixed the issue where release builds were somehow still using the debug key…) Also added a small UI polish.

2
0
12
Open comments for this post

3h 18m 3s logged

Added promo codes and deeplinks. The plan is to put a “Try Trial” button on the website that deep-links straight into the app and auto-claims free traffic. To stop bots from abusing this, hooked up Abuse Shield with silent guest auth across our Axum backend and KMP client. Android uses ANDROID_ID, while iOS and macOS generate a persistent 256-bit key in Keychain to authenticate devices without login screens. It’s still a fairly basic check for now, but better than nothing. The rest was UI cleanup.

0
0
6
Open comments for this post

8h 1m 52s logged

Localization sat in the backlog forever, but I finally knocked it out using moko-resources. Dropped a language picker into the account screen too. Also added live TCP pings to the server list (previously there were mocks). The rest was mostly cleanup. Refreshed the account screen ui, properly organized folders by feature, and mapped backend errors to actual translated text instead of dumping raw unlocalized strings on the user. Next on the list is deeplinks. The plan is to let people claim their traffic via a link rather than just giving it away on signup - mainly to filter out bots. Once that’s sorted, I can finally start handing the client out for testing.

2
0
47
Open comments for this post

1h 28m 35s logged

Sparkle updates are finally working on macOS. Xcode was being a pain and ignoring version numbers from Info.plist, but got it sorted. Also fixed that annoying bug where the connection timer reset to zero whenever you navigated away from the home screen. Now we just calculate elapsed time dynamically - Android saves it in prefs, and macOS just asks the system how long sing-box has been running.

0
0
20
Open comments for this post

1h 36m 52s logged

Fixed a crash that only showed up when switching protocols really fast on Android. Every switch was doing a full restart of the VPN under the hood - kill the old connection, start a new one. The problem is the old connection’s background threads didn’t have time to clean up before the new ones started, and they’d end up colliding. Rare, but when it hit, the whole app went down. Turns out the library we use (sing-box) actually has a built-in way to swap configs without restarting anything - just feed it the new config and it handles the rest. Switched to that, crash is gone.

0
0
20
Open comments for this post

11h 39m 26s logged

Two commits in since the last post. MacOS is finally working - sing-box integration needed a proper rewrite, took longer than it should’ve. Also hooked up the backend to actual UI - server list, traffic, account, connect/disconnect - all talking to the rust (Axum) backend now. Plus added an in-app update widget to the UI. Android is fully working end to end at this point. Currently integrating Sparkle for auto-updates on macOS. More soon.

0
0
10
Open comments for this post

15h 53m 38s logged

So, first devlog - let’s go. I’ve been working on Astrex VPN for a while now and figured it’s time to start talking about it. Honestly, a big chunk of my time has gone into design, way more than I expected - I just can’t ship something that doesn’t look and feel right to me. The client is cross-platform, built with Kotlin Multiplatform and sing-box doing the heavy lifting under the hood. The backend is in Rust, which has been a great choice so far. Architecturally, the whole thing runs on a hub-and-node setup: the hub sits in the middle managing connections, and the nodes are individual servers that reach out to the hub and talk to it over WebSocket. Still a lot to do, but it’s coming together. More updates soon.

0
0
114

Followers

Loading…