{"id":20677342,"url":"https://github.com/operatorfoundation/shapeshifterandroidkotlin","last_synced_at":"2025-07-29T06:32:58.206Z","repository":{"id":39111512,"uuid":"297487228","full_name":"OperatorFoundation/ShapeshifterAndroidKotlin","owner":"OperatorFoundation","description":"An implementation of the Shadow transport.","archived":false,"fork":false,"pushed_at":"2024-04-25T19:44:39.000Z","size":446,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-19T21:49:56.313Z","etag":null,"topics":["android-library","kotlin"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OperatorFoundation.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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,"zenodo":null}},"created_at":"2020-09-21T23:47:58.000Z","updated_at":"2024-08-06T12:47:03.000Z","dependencies_parsed_at":"2023-02-16T11:20:24.827Z","dependency_job_id":"94ff3caf-b2ea-4249-b63e-82a40dfb31c6","html_url":"https://github.com/OperatorFoundation/ShapeshifterAndroidKotlin","commit_stats":null,"previous_names":[],"tags_count":112,"template":false,"template_full_name":null,"purl":"pkg:github/OperatorFoundation/ShapeshifterAndroidKotlin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OperatorFoundation%2FShapeshifterAndroidKotlin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OperatorFoundation%2FShapeshifterAndroidKotlin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OperatorFoundation%2FShapeshifterAndroidKotlin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OperatorFoundation%2FShapeshifterAndroidKotlin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OperatorFoundation","download_url":"https://codeload.github.com/OperatorFoundation/ShapeshifterAndroidKotlin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OperatorFoundation%2FShapeshifterAndroidKotlin/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267639569,"owners_count":24119780,"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","status":"online","status_checked_at":"2025-07-29T02:00:12.549Z","response_time":2574,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["android-library","kotlin"],"created_at":"2024-11-16T21:15:18.301Z","updated_at":"2025-07-29T06:32:58.175Z","avatar_url":"https://github.com/OperatorFoundation.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"### The Operator Foundation\n\n[Operator](https://operatorfoundation.org) makes usable tools to help people around the world with censorship, security, and privacy.\n\n### Shapeshifter\n\nThe Shapeshifter project provides network protocol shapeshifting technology\n(also sometimes referred to as obfuscation). The purpose of this technology is\nto change the characteristics of network traffic so that it is not identified\nand subsequently blocked by network filtering devices.\n\nThere are two components to Shapeshifter: transports and the dispatcher. Each\ntransport provide different approach to shapeshifting. ShapeshifterAndroidKotlin is provided as a \nKotlin library which can be integrated directly into Android applications.\n\nIf you are a tool developer working in the Kotlin programming language for Android, then you\nare in the right place. If you are a tool developer working in other languages we have \nseveral other tools available to you:\n\n- A Go transports library that can be used directly in your application:\n[shapeshifter-transports](https://github.com/OperatorFoundation/shapeshifter-transports)\n\n- A Swift transport library that can be used directly in your iOS and macOS applications:\n[ShadowSwift](https://github.com/OperatorFoundation/ShadowSwift.git)\n\n- A Java transports library that can be used directly in your Android application (currently supports Shadow):\n[ShapeshifterAndroidJava](https://github.com/OperatorFoundation/ShapeshifterAndroidJava)\n\nIf you want a end user that is trying to circumvent filtering on your network or\nyou are a developer that wants to add pluggable transports to an existing tool\nthat is not written in the Kotlin programming language, then you probably want the\ndispatcher. Please note that familiarity with executing programs on the command\nline is necessary to use this tool.\n\u003chttps://github.com/OperatorFoundation/shapeshifter-dispatcher\u003e\n\nIf you are looking for a complete, easy-to-use VPN that incorporates\nshapeshifting technology and has a graphical user interface, consider\n[Moonbounce](https://github.com/OperatorFoundation/Moonbounce), an application for macOS which incorporates shapeshifting without\nthe need to write code or use the command line.\n\n### Shapeshifter Transports\n\nShapeshifter Transports is a suite of pluggable transports implemented in a variety of langauges. This repository \nis the Shapeshifter implementation in Kotlin for Android applications. \n\nIf you are looking for a tool which you can install and\nuse from the command line, take a look at [shapeshifter-dispatcher](https://github.com/OperatorFoundation/shapeshifter-dispatcher.git) instead.\n\nShapeshifterAndroidKotlin implements the Pluggable Transports 3.0 specification available here:\n\u003chttps://github.com/Pluggable-Transports/Pluggable-Transports-spec/tree/main/releases/PTSpecV3.0\u003e \n\nThe purpose of the transport library is to provide a set of different\ntransports. Each transport implements a different method of shapeshifting\nnetwork traffic. The goal is for application traffic to be sent over the network\nin a shapeshifted form that bypasses network filtering, allowing\nthe application to work on networks where it would otherwise be blocked or\nheavily throttled.\n\n# ShapeshifterAndroidKotlin\n\nShapeshifterAndroidKotlin is a native Android library that contains an implementation of the Shadow transport. Shadow is a wrapper for Shadowsocks that makes it available as a Pluggable Transport. Shadowsocks is a fast, free, and open-source encrypted proxy project, used to circumvent Internet censorship by utilizing a simple, but effective encryption and a shared password. \n \n\n## Setting up dependencies\n\n1) add the following at the end of repositories in your PROJECT's build.gradle:\n```\nallprojects {\n    repositories {\n        ...\n        maven { url 'https://jitpack.io' }\n    }\n}\n```\n\n2) add the dependency in your MODULE's build.gradle:\n```\ndependencies {\n        // Be sure to replace TAG with the most recent version\n        implementation 'com.github.OperatorFoundation:ShapeshifterAndroidKotlin:TAG'\n\n        // Later releases of bouncycastle may not work with ShapeshifterAndroidKotlin\n        implementation 'org.bouncycastle:bcpkix-jdk15on:1.58'\n\n        implementation 'com.google.code.gson:gson:2.8.2'\n        implementation 'com.google.guava:guava:31.0.1-android'\n\n}\n```\n\n3) Make sure the min SDK in your build.gradle is 21 or higher in each project/app related build.gradle\n\n\n## Using the Library\n\n1) Create a shadow config, putting the password and cipher name.  If you're using DarkStar, put the Server's Persistent Public Key in place of the password.\n```\nval config = ShadowConfig(password, cipherName)\n```\n\n2) Make a Shadow Socket with the config, the host, and the port.\n```\nval shadowSocket = ShadowSocket(config, host, port)\n```\n\n3) Get the output stream and write some bytes.\n```\nshadowSocket.outputStream.write(textBytes)\n```\n\n4) Flush the output stream.\n```\nshadowSocket.outputStream.flush()\n```\n\n5) Get the input stream and read some bytes into an empty buffer.\n```\nshadowSocket.inputStream.read(buffer)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foperatorfoundation%2Fshapeshifterandroidkotlin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foperatorfoundation%2Fshapeshifterandroidkotlin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foperatorfoundation%2Fshapeshifterandroidkotlin/lists"}