99 Francs
sales@99francs.agency

HQ Paphos, Cyprus · worldwide

Case study · Our own product

SimpleV VPN: an Android app with its own server fleet, on Google Play in about two weeks.

SimpleV is a one-tap VPN for Android: no account to start, no traffic logs and a daily free data allowance, with Premium for unlimited data and every location. Behind the button sit a control plane on Railway and exit nodes on Vultr that start and stop on demand. We designed, built and run all of it ourselves.

SimpleV VPN on three Android phones — the Protected home screen with the power button in the middle, the Locations list and the home-screen widgets either side, on a dark purple background
ProductOur own product · built and run by 99 FrancsCyprus
PlatformAndroid + home-screen widgets
StatusLive on Google Play
BuiltSep–Oct 2026
StackKotlin, Compose, Express, Postgres
Locations33 in 20 countries
Direct answer

Our own Android VPN, control plane and server fleet — designed, shipped and run by 99 Francs.

SimpleV is a Kotlin and Jetpack Compose app that tunnels over WireGuard or Xray Reality to exit nodes on Vultr, orchestrated by an Express and Postgres control plane on Railway with a 15-page admin. Active work started on 23 September 2026 and the release went live on Google Play on 5 October 2026.

Why we built it

A VPN should be one tap, and still connect.

On public Wi-Fi — cafes, airports, hotels, trains — people want protection without an account form. On school, office and hotel networks, plain VPN traffic is often blocked outright. We wanted one button for both cases, and a product of our own that runs real infrastructure: servers that start, scale and shut down without anyone touching them.

One tap, no account

Free mode starts without an email or password: an anonymous account tied to the device, with a daily data allowance. Sign in with Google or email only to keep a plan across phones.

Hard to block

Automatic mode picks WireGuard for speed or Xray VLESS with Reality, which makes VPN traffic look like ordinary HTTPS — so it still connects on strict school, office and hotel Wi-Fi.

The server decides

The app only knows the API address. Locations, nodes, promotions and paywall offers come from the backend, so most changes ship without an app release.

How it was built

Six steps, from the power button to Google Play.

One team did all of it: the design, the Android app, the control plane, the admin, the node fleet, the store listing and the landing site. Nothing was handed over, because there was no one to hand it to.

01

Product and design

A scaffold in June 2026, then one promise: tap once and you are protected. Home, locations, account, settings and the widgets in one dark-and-light visual language.

02

Android app

Kotlin and Jetpack Compose on Android's VpnService. WireGuard runs in its own process over AIDL; Xray runs through a libXray library we build ourselves. Glance widgets, a Quick Settings tile and Always-on VPN.

03

Control plane on Railway

Express 5, TypeScript, Prisma and Postgres in Railway's EU West region: auth with token rotation, regions and nodes, per-device keys, the daily quota, billing and growth features.

04

Exit nodes on Vultr

VPN traffic never touches Railway, whose acceptable-use policy forbids proxies. Exit nodes run on Vultr servers with Xray on port 443, WireGuard and a small agent that reports to the API.

05

Billing and accounts

Google Play Billing verified on the server, with real-time developer notifications arriving through Pub/Sub. Google Sign-In, account deletion in the app, and push through FCM.

06

Google Play review and release

The Google Play listing in eight languages, then production review on 25 September 2026. The release went live on Google Play on 5 October 2026.

The app

One button, then everything it needs.

The home screen is the power button, the session timer, the location and live speed. Locations, account and settings sit one tab away, in a dark and a light theme, and the widgets connect without opening the app at all.

SimpleV welcome screen — Technical privacy, reduced to one clean path, with No traffic logs, One tap to connect and Free daily data, and a Get started free button
SimpleV home screen in the dark theme — Protected, a glowing power button, a session timer and the Netherlands as the virtual location, with live download and upload speed
SimpleV Locations screen — a search field, the recommended location and a list of countries with their cities and servers
SimpleV home screen in the light theme — Protected, with the session timer, the Netherlands location and live speed
Android home screen with two SimpleV widgets — a large one with the location, session time, speed and Disconnect and Change location buttons, and a small Protected tile
SimpleV settings with the App language sheet open — English, Deutsch, Español, Français, Italiano, Português, Русский and Українська
Control plane and data plane

The servers run themselves.

Railway runs the control plane; Vultr runs the exit nodes. The backend decides where each device connects, provisions servers when a region needs them and retires them when it does not.

Least-loaded node

POST /api/connect picks the least-loaded online node in the chosen region and returns ordered WireGuard and Xray profiles for that device.

Premium regions on demand

An on-demand Premium region answers “preparing”, boots a Vultr server and lets the app poll until it is online; once idle, the node is drained and destroyed.

Autoscale at 0.85

When a region's nodes pass 85% load, another one is added. Stale nodes are marked offline after a few minutes without a heartbeat.

Quota from real usage

Each node agent pulls its peers and posts heartbeats and usage. The backend counts that usage against the daily free allowance and stops a device that is out of data.

A 15-page admin.

A React and Vite app with an Express backend-for-frontend that keeps the API tokens on the server, never in the browser. Day-to-day running of the product happens here, not in a database console.

  • Overview
  • Users
  • Keys
  • Nodes
  • Subscriptions
  • Finance
  • Promotions
  • Push campaigns
  • Link campaigns
  • Crashes
  • Support
  • Audit log
Getting it live

What only shows up on the way to production.

None of these appear in a design file or a debug build. They surfaced in release builds, in Google Play review and in the billing flow, and each one is the kind of problem we now plan for in client apps.

16 KB pages, or no production

Google Play blocks a production release unless native libraries are aligned to 16 KB memory pages. It took a newer WireGuard tunnel library and a check of every .so file before each release.

The large widget drew the small one

In the release build, R8 merged two near-identical Glance widget classes, so the large widget rendered the small layout. Explicit keep rules fixed it — a bug that never shows in a debug build.

Google Sign-In on the Play build

Sign-in worked in testing and failed from Google Play. Play re-signs the app, so the OAuth client needed the SHA-1 from an APK Play actually delivered, not the first certificate the console shows.

Device slots without support tickets

Premium covers up to five devices and Free one. A new install takes over the slot of a device that has had no traffic for 10 minutes, so a reinstall never locks anyone out.

One purchase, one account

A Google Play purchase already bound to another account is refused, so one subscription cannot be shared by signing in somewhere else.

Growth without app releases

Bonus data, invite referrals and /go/ link campaigns with Play install-referrer attribution, plus banners and paywall offers that the backend can change at any time.

Landing site

Private. In one tap.

The product site is static HTML from a dependency-free Node server on Railway, in the same eight languages as the app. It also carries the /go/ links that the growth campaigns use.

The SimpleV homepage hero — Private. In one tap., a Get it on Google Play button and the Protected home screen on an Android phone, labelled No traffic logs, WireGuard, Reality and 33 locations
Outcome

Live on Google Play, servers included.

SimpleV is free on Google Play with a daily data allowance. Premium costs €4.99 a month, €34.99 a year with a free trial, or €1.99 for a 7-day pass, and covers up to 5 devices (EU prices).

~2

weeks from active build to Google Play

Active work ran from 23 September 2026; production review was submitted on 25 September and the release went live on 5 October 2026.

33

locations in 20 countries

On six continents, one of them free. Some Premium regions start on demand instead of running all the time.

8

languages

English, German, Spanish, French, Italian, Portuguese, Russian and Ukrainian — in the app, on the site and in the store listing.

Guides

Further reading

Design → build → Google Play → run

Need an Android app with a real backend behind it?

We design and build the app, the backend, the admin and the infrastructure, take it through Google Play review and stay with it after launch — the same way we run our own.

Kotlin · Compose · WireGuard · Xray · Express · Postgres
A one-tap VPN for Android. Free mode needs no account, keeps no traffic logs and includes a daily data allowance; Premium adds unlimited data and every location. It is built for public Wi-Fi in cafes, airports, hotels and trains, and for networks that block VPNs.
No. It is our own product. 99 Francs designed it, built the Android app, the control plane, the admin and the server fleet, took it through Google Play review and keeps running it. We build products for ourselves so we know first-hand what it takes to ship an app and keep it working.
Kotlin and Jetpack Compose on Android's VpnService, with WireGuard in a separate process over AIDL, Xray through a self-built libXray library, Glance widgets, Play Billing, Google Sign-In and FCM. The control plane is Express 5, TypeScript, Prisma and Postgres on Railway; the admin is a React and Vite app behind an Express backend-for-frontend; exit nodes run on Vultr.
Railway's acceptable-use policy forbids proxies, so the product is split: Railway runs the control plane — accounts, billing, quota and node orchestration — and the VPN traffic itself goes through exit nodes on Vultr servers that the backend provisions and retires.
Free costs nothing and includes a daily data allowance. Premium is €4.99 a month or €34.99 a year with a free trial, or a 7-day pass for €1.99, and covers up to 5 devices (EU prices).

Yes. The same team designs and builds native Android apps in Kotlin and Jetpack Compose, the backend and admin behind them, subscriptions through Google Play Billing, and takes them through Google Play review. See Android app development and MVP development.