{"id":14460145,"url":"https://github.com/erfansn/NsmaVPN","last_synced_at":"2025-08-28T18:32:13.919Z","repository":{"id":211466741,"uuid":"547180309","full_name":"erfansn/NsmaVPN","owner":"erfansn","description":"🌎 Access to freedom in the internet world only with one switch! ","archived":false,"fork":false,"pushed_at":"2024-12-18T16:46:02.000Z","size":2651,"stargazers_count":39,"open_issues_count":13,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-18T17:41:13.808Z","etag":null,"topics":["androiddev","cicd","compose","gradle","hacktoberfest","networking","sstp","vpn","vpngate"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/erfansn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":["https://plisio.net/donate/drrliVek"]}},"created_at":"2022-10-07T09:04:18.000Z","updated_at":"2024-11-19T16:17:57.000Z","dependencies_parsed_at":"2024-01-10T19:44:13.731Z","dependency_job_id":"6138f5fe-9aec-49eb-af78-3af8ad3ecd75","html_url":"https://github.com/erfansn/NsmaVPN","commit_stats":null,"previous_names":["erfansn/nsmavpn"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erfansn%2FNsmaVPN","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erfansn%2FNsmaVPN/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erfansn%2FNsmaVPN/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erfansn%2FNsmaVPN/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/erfansn","download_url":"https://codeload.github.com/erfansn/NsmaVPN/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":231294144,"owners_count":18354140,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["androiddev","cicd","compose","gradle","hacktoberfest","networking","sstp","vpn","vpngate"],"created_at":"2024-09-01T21:01:05.696Z","updated_at":"2024-12-25T23:30:30.091Z","avatar_url":"https://github.com/erfansn.png","language":"Kotlin","funding_links":["https://plisio.net/donate/drrliVek"],"categories":["Kotlin"],"sub_categories":[],"readme":"![Nsma VPN banner](/image/nsmavpn_banner.png)\n\n# Nsma VPN\nAccess to freedom in the internet world only with one switch! Tap and wait until you find a proper server of hundreds of servers provided by [VPN Gate](https://www.vpngate.net/en/), without worrying about government censorship.\n\nIt is enough to sign in with a **Gmail** account that is subscribed to the [VPN Gate Daily mirror site service](http://109.111.243.206:17579/en/mail.aspx), the app will do the rest and wait for its boss for a brief hint!\n\nThis VPN uses the implementation of [SSTP](https://en.wikipedia.org/wiki/Secure_Socket_Tunneling_Protocol) protocol in the [Open SSTP Client](https://github.com/kittoku/Open-SSTP-Client) with slight changes.\n\n## 🔏 Privacy Policy\nYou can read about it [here](https://nsmavpn.erfansn.ir/privacy_policy.html).\n\n## 💡 Features\n- Easy to use only two steps, sign in then tap, and finally only one tap!\n- There's no server for collecting and processing data, all stuff remains locally for better privacy.\n- Turn on VPN, without launching the app by defining a [Quick Tile Settings](https://developer.android.com/develop/ui/views/quicksettings-tiles) in the notification drawer.\n- Allows you to split the tunnel for apps you don't want to use with the VPN traffic.\n- Supports two languages **English** and **Persian**.\n- Optimized for all types of screen sizes.\n\n## 🎨 UI Design\nThe app's design system is based on [Material 3](https://m3.material.io/), and inspired by designs for VPN apps by [Emmanuel Edokpa](https://dribbble.com/shots/16222592-TrueVPN-Mobile-App-Design/attachments/8084727?mode=media) and [Mohammad Reza Farahzad](https://dribbble.com/shots/14840886/attachments/6550059?mode=media), and by adding my own creativity, it is optimized for both dark and light modes.\n\n## 📷 Previews\n![Screenshots](/image/screenshots.png)\n\n## 🏫 What I learned\n1. How to write a **Gradle task** to sync the Detekt configs between CLI and GUI interfaces.\n2. How to pipeline a basic **CI/CD** for releasing a version to the app's repository page by creating a Git tag.\n3. How to write a VpnService and use **Bound Service** in practice and real-world use cases.\n4. How to **ping** a VPN server by the correct way.\n5. How to use **Protocol Buffer** as a serializer mechanism for **DataStore**.\n6. How to use the **Google Sign-In** mechanism for authentication and authorization.\n7. How to **benchmark** Jetpack Compose element for better performance.\n8. How to write **Visual Test** for Jetpack Compose element animation.\n9. How to **web scraping** with CSS selectors.\n10. How to define a route as **Conditional Navigation** in Compose.\n\n## 🏗️ Architecture\n![Architecture scheme](/image/architecture.png)\n\n*Undoubtedly, based on the [recommended architecture](https://developer.android.com/topic/architecture) of the official Android site*\n\n## 📚 Tech Stack\n- Jetpack Compose\n- AndroidX Work Manager\n- Dagger Hilt\n- AndroidX DataStore\n- [Protocol Buffer](https://protobuf.dev/)\n- [Google API Client](https://developers.google.com/api-client-library/java)\n- [Play Service Auth](https://developers.google.com/android/guides/overview)\n- [Skrape{it}](https://github.com/skrapeit/skrape.it)\n- [Cache4k](https://github.com/ReactiveCircus/cache4k)\n- OkHttp\n- **Testing**\n  - AndroidX Macrobenchmark\n  - [Mock Web Server](https://github.com/square/okhttp/tree/master/mockwebserver)\n  - Truth Assertion\n  - Robolectric\n\n## 🛠️ How To Build\nJust follow the steps of [this link](https://developers.google.com/identity/sign-in/android/legacy-gsi-start#configure-a-google-api-console-project) to get the `client id` and if you have created it for the debug key, replace it in this line:\nhttps://github.com/ErfanSn/NsmaVPN/blob/78382f8896de6d4950dc95314a5834b5113f9491/app/build.gradle.kts#L68\notherwise:\nhttps://github.com/ErfanSn/NsmaVPN/blob/78382f8896de6d4950dc95314a5834b5113f9491/app/build.gradle.kts#L77\nAnd finally sync then build the project, that's it.\n\n## 🔮 Future Plans\n- [ ] Migrate the project to [KMP](https://kotlinlang.org/docs/multiplatform.html) technology, especially for Windows Desktop platform support.\n\n## 🤝 Contributing\nWe welcome your contribution with open arms. Please refer to [CONTRIBUTING.md](/CONTRIBUTING.md) for instructions on how to contribute.\n\n## 📜 License\n**Nsma VPN** is distributed under the terms of the Apache License (Version 2.0).\nSee the [license](/LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferfansn%2FNsmaVPN","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferfansn%2FNsmaVPN","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferfansn%2FNsmaVPN/lists"}