| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
_ _ _
| | | | | |
_ _ _ __ | |__ ___ _ _ _ __ __| | ___ __| |
| | | | '_ \| '_ \ / _ \| | | | '_ \ / _` |/ _ \/ _` |
| |_| | | | | |_) | (_) | |_| | | | | (_| | __/ (_| |
\__,_|_| |_|_.__/ \___/ \__,_|_| |_|\__,_|\___|\__,_|
Unbounded is a next-gen technology stack for circumventing internet censorship using browser-based P2P proxies. It organizes an ephemeral swarm of short-lived residential IP addresses, provided by volunteers in less censored regions, which create censorship resistant routes for network requests originating from users in heavily censored regions.
Here are just a few of the things you can do:
Unbounded is a descendant of the "flash proxy" concept first described in 2012 by David Fifield, Nate Hardison, Jonathan Ellithorpe, Emily Stark, Dan Boneh, Roger Dingledine, and Phil Porras (paper).
uProxy is a historical project exploring similar ideas that also started in 2012 as a collaboration between Google Ideas (now Jigsaw), the University of Washington, and the Brave New Software Project, the creators of Lantern.
Snowflake, part of the Tor project, is an evolution of the same concenpt, with roots in both flash proxy and uProxy, and it is widely used today.
The idea to create connection state persistence across ephemeral peer transports was formalized by David Fifield as "Turbo Tunnel" in 2020 (paper).
| Module | Description |
|---|---|
| clientcore | library exposing Unbounded's high level client API |
| cmd | driver code for operationalizing Unbounded outside of a controlling process |
| common | data structures and functionality shared across Unbounded modules |
| egress | egress server |
| freddie | discovery, signaling, and matchmaking server |
| netstate | network topology observability tool |
| ui | embeddable web user interface |
Clone this repo.
Configure Mozilla Firefox to use a local HTTP proxy. In settings, search "proxy". Select Manual proxy configuration. Enter address 127.0.0.1, port 1080, and check the box labeled Also use this proxy for HTTPS.
Build the native binary desktop client: cd cmd && ./build.sh desktop
Build the native binary widget: cd cmd && ./build.sh widget
Build the browser widget: cd cmd && ./build_web.sh
Start Freddie: cd freddie/cmd && PORT=9000 go run main.go
Start the egress server: cd egress/cmd && PORT=8000 go run egress.go
Start a desktop client: cd cmd/dist/bin && FREDDIE=http://localhost:9000 EGRESS=http://localhost:8000 ./desktop
Decision point: do you want to run a native binary widget or a browser widget? To start a native binary widget: cd cmd/dist/bin && FREDDIE=http://localhost:9000 EGRESS=http://localhost:8000 ./widget. Alternatively, to start a browser widget, follow the UI quickstart.
The widget and desktop client find each other via the discovery server, execute a signaling step, and establish several WebRTC connections.
The netstate module is a work-in-progress tool for observing Unbounded networks. netstate currently visualizes network topology, labeling each Unbounded node with an arbitrary, user-defined "tag" which may be injected at runtime.
netstated is a distributed state machine which collects and processes state changes from Unbounded clients. It serves a network visualization at GET /. The gv visualizer client looks for a netstated instance at localhost:8080.
In the example below, we assume that Freddie is at http://localhost:9000 and the egress server is at http://localhost:8000:
Start netstated: cd netstate/d && go run netstated.go
Start a widget as user Alice: cd cmd/dist/bin && NETSTATED=http://localhost:8080/exec TAG=Alice FREDDIE=http://localhost:9000 EGRESS=http://localhost:8000 ./widget
Start a desktop client as user Bob: cd cmd/dist/bin && NETSTATED=http://localhost:8080/exec TAG=Bob FREDDIE=http://localhost:9000 EGRESS=http://localhost:8000 ./desktop
Open a web browser and navigate to http://localhost:8080. As Alice and Bob complete the signaling process and establish connection(s) to one another, you should see the network you have created. You must refresh the page to update the visualization.
The UI is bootstrapped with Create React App. Then "re-wired" to build one single js bundle entry using rewire. The React app will bind to a custom <browsers-unbounded> DOM el and render based on settings passed to the dataset. In development, this html can be found in ui/public/index.html. In production, the html is supplied by the "embedder" via https://unbounded.lantern.io/embed.
Example production embed:
<browsers-unbounded
data-layout="banner"
data-theme="dark"
data-globe="true"
data-exit="true"
style='width: 100%;'
></browsers-unbounded>
<script defer="defer" src="https://embed.lantern.io/static/js/main.js"></script>This tables lists all the available settings that can be passed to the <browsers-unbounded> DOM el via the data-* attributes. The "default" column shows the default value if the attribute is not set.
| dataset | description | default |
|---|---|---|
| layout | string "banner" or "panel" layout | banner |
| theme | string "dark", "light" or "auto" (browser settings) theme | light |
| globe | boolean to include webgl globe | true |
| exit | boolean to include toast on exit intent | true |
| menu | boolean to include menu | true |
| keep-text | boolean to include text to keep tab open | true |
| mobile-bg | boolean to run on mobile background | false |
| mobile-bg | boolean to run on desktop background | true |
| editor | boolean to include debug dataset editor | false |
| branding | boolean to include logos | true |
| mock | boolean to use the mock wasm client data | false |
| target | string "web", "extension-offscreen" or "extension-popup" | web |
In development, these settings can be customized using the REACT_APP_* environment variables in the .env or in your terminal. For example, to run the widget in "panel" layout, you can run REACT_APP_LAYOUT=panel yarn start. To run the widget with mock data, you can run REACT_APP_MOCK=true yarn start.
Settings can also be passed to the widget via the data-* attributes in ui/public/index.html. For example, to run the widget in "panel" layout, you can set data-layout="panel" in ui/public/index.html.
If you enable the editor (by setting REACT_APP_EDITOR=true or data-editor="true"), you can also edit the settings dynamically in the browser using a UI editor the renders above the widget. Note that the mock and target settings are not dynamic and therefore not editable in the browser. These two settings are static and must be set at the time the wasm interface is initialized.
Links:
Development:
Production: you don't deploy by hand. Merging to main publishes both widget.wasm and the page bundle to the gh-pages branch (and from there to embed.lantern.io) via .github/workflows/build-widget-wasm.yml, gated on the js/wasm build and the Go unit tests. That covers unbounded.lantern.io and every third-party embedder at once, since they all load https://embed.lantern.io/static/js/main.js by absolute URL.
Warning
Do not run yarn deploy. Its predeploy runs build:web, which does not run cmd/build_web.sh — so it publishes the committed ui/public/widget.wasm, which is a prebuilt binary that goes stale as soon as any Go code changes. Running it silently reverts the automatically published wasm to whatever that file holds while the page JS moves forward, leaving the two halves mismatched. If you need a one-off manual publish, build the wasm first (cd cmd && ./build_web.sh) so ui/public/widget.wasm is current.
Before pushing UI changes, build the way CI does:
CI=true yarn build:webreact-scripts turns ESLint warnings into errors when CI is set, and GitHub Actions sets it automatically — so a plain yarn build:web can print warnings, succeed locally, and still fail the publish. Note the failure is safe: the publish job verifies the build before it touches gh-pages, so a broken build stops rather than shipping.
Work from the ui dir: cd ui
Configure your .env file: cp .env.development.example .env.development
Install the dependencies: yarn
To start in developer mode with hot-refresh server (degraded performance): run yarn dev:web and visit http://localhost:3000
To build optimized for best performance:
To serve a build:
To deploy to GitHub Pages: nothing to do — merging to main publishes. See the warning under UI quickstart for devs before reaching for yarn deploy, which regresses the published widget.wasm.
Coming soon to a repo near you: yarn test
Work from the ui dir: cd ui
Install the dependencies: yarn
Configure your .env file: cd extension && cp .env.example .env
To start in developer mode with hot-refresh server:
yarn dev:ext chrome yarn dev:ext firefox
This will compile the extension and output to the ui/extension/dist dir. You can then load the unpacked extension in your browser of choice.
yarn build:ext chrome yarn build:ext firefox
This will compile the extension and output a compressed build to the ui/extension/packages dir.
The copy and translations are bootstrapped with Strapi as a headless CMS to manage translations and other content for the UI.
The translations are queried at build time and the UI uses the i18next library to manage the translations and the react-i18next library to bind the translations to the UI components.
To re-query the translations from the CMS, run yarn translate. This will fetch the latest translations from the CMS and update the src/translations.json file.
| Back | FazBrowse Home | New Git URL |