Releases: morpheusadam/v2rayV
Release list
v2rayV 2.5.0
Iran mode connects now — it never did — and the app checks between runs whether the servers it kept still work.
Iran mode was asking the wrong question
Turning on "connect through an Iranian IP" and getting nothing was not bad luck with the servers. Every test the app ran pointed at a foreign host: it timed each candidate against gstatic.com, measured its speed against Cloudflare, and looked up where it came out through api.ip.sb.
Through a server that comes out inside Iran, all three of those leave the country over the one link that is throttled and filtered by design. So a perfectly good Iranian server answered slowly or not at all, was dropped for being over the 2.5-second limit before it was ever speed tested, and the run reported — accurately, and uselessly — that nothing came out inside Iran.
It is also the wrong question on its own terms. Nobody turns this mode on to reach Google. They turn it on to reach an Iranian bank.
So the app now asks an Iranian server whether it can reach Iran. The time limit rises to six seconds, because the route runs into the country rather than out of it. Download speed stops being a pass/fail test and becomes a preference, because that download leaves Iran and a server that works fine for your bank can legitimately measure zero.
A server still has to prove it is alive — it just proves it by answering, rather than by winning a race to Cloudflare.
Your servers are checked between runs, not just when you run out
Until now the app only looked for new servers when you had worked through all ten and asked for more. Meanwhile nothing ever removed a dead server from that list of ten, so ten dead servers still counted as ten, and the background refresh that was supposed to replace them kept deciding it was not needed. That is the whole of "it worked for the first few days".
The app now sends one small check to each saved server every few hours — a few kilobytes, not a download — and refreshes when they have actually stopped answering. It runs while the VPN is connected too, which matters if you leave it on: before this, that was a setup that got no maintenance at all, ever.
The full refresh now waits for Wi-Fi. It costs a few hundred megabytes and you did not ask for it, so it should not come out of your mobile data. The small check still runs on any connection.
The power button shows that you pressed it
Pressing power starts a search that takes minutes, and for those minutes the button looked exactly as it did before you pressed it — same colour, same icon, same empty ring. It now turns violet, carries a stop icon, and its ring sweeps while the search runs. Pressing it again stops the search.
It also stops claiming to be connecting when it is not: a refresh you started from the Auto Mode card says Scanning, because it will not connect at the end of it.
Also
- Server names quoting a data allowance as "50 GB" were being read as servers in Great Britain. In Iran mode that deleted them before they were ever tested.
- The offline fallback lists shipped inside the app were nineteen days old and are now current — 1541 proxies instead of 263. They only matter on a phone that has never once managed to download anything, which is exactly the phone that cannot afford them to be stale.
Notes
versionName 2.5.0, versionCode 748, same signing key — an existing install takes this as an ordinary update.
Iran mode is off unless you turn it on, and none of its changes affect you if you do not.
v2rayV 2.4.1 — the app's own name, and a button that stops
Two fixes, both of them things you would have run into.
The app calls itself v2rayV again
One of the two builds carried its own app_name and still said v2rayNG. It showed correctly on a phone set to Persian and wrongly on one set to English, which is how it survived the rename unnoticed. Russian and Vietnamese also still named the old app in a widget label, a tile, a screen title and several toasts.
Every language in this build reports v2rayV.
The power button stops a scan
Cancelling a run was possible from the Auto Mode row and from the notification, and nowhere else. The power button showed "play" for the whole four minutes a run takes, and pressing it did nothing at all — the service refuses a second run while one is already going, so the press was swallowed with no sign it had been read.
That is the wrong button to be inert: someone who started a scan by accident, or who wants to change a setting and scan again, reaches for the button that stops things. It now carries the stop icon while a run is in flight, and the press cancels the run.
One thing to check if you installed 2.4.0
2.4.0 briefly offered a second set of files with -fdroid- in the name. That build has a different package name, so it installs beside your existing app instead of updating it, and it never receives an update of its own. If you have it, uninstall it and install the file below.
Those files are no longer published, and the release page carries the same five it always did.
Notes
versionName 2.4.1, versionCode 747, same signing key — an existing install takes this as an ordinary update.
v2rayV 2.4.0 — keeps working past the first few days
It no longer stops working after the first few days
Users in Iran reported the same thing: it worked well for the first few days, then stopped finding servers. It was one line. The background refresh decided whether to run by counting the reserve, and the count never moves — a run writes ten servers and nothing removes one when it dies. Ten dead servers still counted as ten, so every scheduled refresh after the very first was declined, permanently. Free servers die within days, which is exactly how long the app worked for.
The schedule now reads the reserve's age, stamped when the reserve is rebuilt rather than when a run starts — a week of runs that failed must not look like a week of runs that worked.
A VPN left on all day gets refreshed too
A refresh is always declined while the tunnel is up, and rightly so: a run starts a dozen throwaway cores and saturates the radio, which you would feel immediately. But for anyone who switches the VPN on in the morning and leaves it on, declining meant declining forever.
The core now asks for a run as it shuts down, which is the first moment one is allowed.
A blocked network can no longer disable every source
A subscription link is switched off after five runs that produced nothing, and a network that blocks the list host produces nothing from every link at once. So a few hours of heavy filtering — exactly when this app matters — could switch the whole source list off on evidence that was never about the links. Nothing brought it back either: the recovery probe written for that state sat behind an early return that made it unreachable.
A run that reached nothing at all now records the attempt without passing a verdict, and a list that has switched itself off entirely is treated as the network's doing and reopened in full.
Notes
versionName 2.4.0, signed with the same key as 2.3.4, so an existing install takes this as an update.
Releases can also be published now without a GPG key configured, instead of failing the job and publishing nothing. The APKs are still signed with the app's own key, which is what Android actually verifies.
v2rayV 2.3.4 - connects in seconds
Same version, corrected. versionName stays 2.3.4; versionCode moves to 745, so an existing install accepts this as an update. Signed with the same key as 2.3.4.
Connecting no longer means waiting
The first run on a fresh install took about eighty seconds, because it measured your line, fetched the lists, imported, probed, then timed real downloads one at a time. That work is right and it still happens. What changed is the order: the first server proved to carry a real request now connects immediately, and the run keeps going and replaces it once something has actually been measured.
Seconds to an internet, the full run to a good one.
Changing servers now changes servers
NEXT on the dashboard did not move a running tunnel. The daemon refuses to start a core that is already running, so the selection changed and the connection did not. It restarts properly now, which also makes the upgrade above work.
When the phone's clock is the problem
VMess and VLESS authenticate with a timestamp, and servers refuse handshakes outside a couple of minutes. A drifted clock therefore fails against every server, and the run reports hundreds of dead ones with nothing pointing at the cause. That case is now detected and named, from the Date header of requests the app already makes.
Adverts are gone from the app's own surfaces
Server names came from whoever published the subscription, which in public lists is overwhelmingly an advert. Servers are now named by what was measured: rank, throughput, latency, and the country the traffic actually left from. The header above the status card, which carried the same text, is gone.
Privacy
- Android's auto-backup is off. It was copying the subscription URLs and the whole server list into the user's Google account.
- Mirrors are off unless you turn them on, and only the one you pick is ever contacted. Each is listed by who runs it.
- A screen under About lists every host the app talks to, why, and when.
Also
- Give this app to someone: shares the installed APK, which is how it reaches people who need it.
- A drawer entry to ask Android not to suspend the app in the background, the usual reason a tunnel dies in a pocket.
- Per-ABI files are named for this app rather than upstream.
- Two long-broken unit tests fixed, one of which was a real bug:
[::1]:80was not recognised as an IP address. - A logger that could throw from inside a
catchblock, turning a handled error into a crash.
Most phones want arm64-v8a. Each APK ships with a detached GPG signature and the public key.
v2rayV 2.3.4 — stays current without a rebuild
Android 7.0+, arm64-v8a.
Direct link that always points at the newest build:
https://github.com/morpheusadam/v2rayV/releases/latest/download/v2rayV-2.3.4-arm64-v8a.apk
The headline: the app stops going stale
The lists it runs on are rebuilt daily in v2ray-config, and the app has always read them live — but the copies inside the APK were frozen at build time, and those are what a blocked network falls back on. A proxy list from months ago is close to useless there.
Every successful fetch is now saved on the phone, so after one working run you carry yesterday's list rather than the build date's, whatever the network does afterwards. No new build is needed to stay current.
Also in this release
- Live DOWNLOAD/UPLOAD actually work. They read zero in every earlier build — the core was never being told to count.
- Smart Switch (off by default, under Auto Mode) now runs in the background service rather than only while the app is open. If requests stop being answered, or throughput falls to a fraction of what the server measured, it moves to the next server in the reserve. It never acts on an idle connection: a phone in a pocket reports the same zero as a dead server.
- Iranian routing by default on fresh installs. Previously a China ruleset, which pushed every Iranian site through the tunnel.
- The Auto Mode screen no longer scrolls forever. With hundreds of sources merged it listed every one; it now shows the five doing best.
- A faster route ladder. Mirrors are raced 250 ms apart instead of tried one at a time — on a blocked network that was 24 seconds of timeouts before anything else could start.
project-map/in the repo: how the project is built and why, including the decisions that look wrong until you know what they are for.
Before you install
Play Protect will warn you. Tap More details → Install anyway. It says Google has not seen an app from this developer before, which is about how many installs the signing certificate has behind it — not about this file.
Still untested
The censored-network path — mirrors, then discovered proxies, then the cache, then the bundled snapshot — compiles, has tests, and has never once run on a genuinely blocked connection. If you are in Iran, that is the part worth reporting on. Each run now ends by printing where its time went (line 8.1s · route 0.9s · fetch 7.6s · …), which is also how you see which route worked.
102 unit tests, 0 failures. GPL-3.0, forked from 2dust/v2rayNG.
v2rayV 2.3.3 — first release
The first build of v2rayV published anywhere.
Android 7.0+, arm64-v8a. That covers essentially every phone made since 2016; ask if you need 32-bit or x86.
What this is
A V2Ray/Xray client that connects itself. One press measures your line, finds servers, and connects on the first one fast enough — then keeps going in the background so the next press is instant. It installs alongside v2rayNG rather than replacing it.
In this build
- Auto Mode. Fetch, import, filter, measure, keep the winners. A server is accepted when it delivers 70% of what your own connection delivers, measured the same way on both sides.
- Smart Switch (off by default, under Auto Mode). While you are actually using the connection, if requests stop being answered — or throughput drops to a fraction of what the server measured — it moves to the next server in the reserve. It never acts on an idle connection: a phone in a pocket reports the same zero as a dead server.
- Iranian routing by default. Fresh installs previously started on a China ruleset, which pushed every Iranian site through the tunnel.
- Live traffic counters that work. They read zero in every earlier build; the core was never being told to count.
- A dashboard, not a server list, as the home screen.
- Every run reports where its own time went —
line 8.1s · fetch 7.6s · probe 19.8s · …. On a censored network that line is also how you find out which route worked.
Servers and proxies come from v2ray-config, which rebuilds itself daily.
Before you install
Play Protect will warn you. Tap More details → Install anyway. The message says Google has not seen an app from this developer before, which is a judgement about how many installs the signing certificate has behind it — not about this file. It is a new certificate, so it has none. Nothing in the APK can change that.
Honestly untested
The path that gets Auto Mode working on a network that blocks GitHub — CDN mirrors, then discovered proxies, then a snapshot inside the APK — compiles, is unit-tested, and has never once run on a genuinely blocked connection. If you are in Iran, that is the part worth reporting on.
99 unit tests, 0 failures. GPL-3.0, forked from 2dust/v2rayNG.