MCPcopy Index your code
hub / github.com/balena-os/wifi-connect

github.com/balena-os/wifi-connect @v4.11.84

Chat with this repo
repository ↗ · DeepWiki ↗ · release v4.11.84 ↗ · + Follow
73 symbols 146 edges 14 files 3 documented · 4% updated 1d agov4.11.84 · 2025-07-22★ 1,493185 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Easy WiFi setup for Linux devices from your mobile phone or laptop

WiFi Connect is a utility for dynamically setting the WiFi configuration on a Linux device via a captive portal. WiFi credentials are specified by connecting with a mobile phone or laptop to the access point that WiFi Connect creates.

Current Release CircleCI status License Issues

an open source :satellite: project by balena.io


Download | How it works | Installation | Support | Roadmap

How it works

How it works

WiFi Connect interacts with NetworkManager, which should be the active network manager on the device's host OS.

1. Advertise: Device Creates Access Point

WiFi Connect detects available WiFi networks and opens an access point with a captive portal. Connecting to this access point with a mobile phone or laptop allows new WiFi credentials to be configured.

2. Connect: User Connects Phone to Device Access Point

Connect to the opened access point on the device from your mobile phone or laptop. The access point SSID is, by default, WiFi Connect. It can be changed by setting the --portal-ssid command line argument or the PORTAL_SSID environment variable (see this guide for how to manage environment variables when running on top of balenaOS). By default, the network is unprotected, but a WPA2 passphrase can be added by setting the --portal-passphrase command line argument or the PORTAL_PASSPHRASE environment variable.

3. Portal: Phone Shows Captive Portal to User

After connecting to the access point from a mobile phone, it will detect the captive portal and open its web page. Opening any web page will redirect to the captive portal as well.

4. Credentials: User Enters Local WiFi Network Credentials on Phone

The captive portal provides the option to select a WiFi SSID from a list with detected WiFi networks and enter a passphrase for the desired network.

5. Connected!: Device Connects to Local WiFi Network

When the network credentials have been entered, WiFi Connect will disable the access point and try to connect to the network. If the connection fails, it will enable the access point for another attempt. If it succeeds, the configuration will be saved by NetworkManager.


For a complete list of command line arguments and environment variables check out our command line arguments guide.

The full application flow is illustrated in the state flow diagram.


Installation

WiFi Connect is designed to work on systems like Raspbian or Debian, or run in a docker container on top of balenaOS.

Raspbian/Debian Stretch

WiFi Connect depends on NetworkManager, but by default Raspbian Stretch uses dhcpcd as a network manager. The provided installation shell script disables dhcpcd, installs NetworkManager as the active network manager and downloads and installs WiFi Connect.

Run the following in your terminal, then follow the onscreen instructions:

bash <(curl -L https://github.com/balena-io/wifi-connect/raw/master/scripts/raspbian-install.sh)

balenaOS

WiFi Connect can be integrated with a balena.io application. (New to balena.io? Check out the Getting Started Guide.) This integration is accomplished through the use of two shared files: - The Dockerfile template manages dependencies. The example included here has everything necessary for WiFi Connect. Application dependencies need to be added. For help with Dockerfiles, take a look at this guide. - The start script should contain the commands that run the application. Adding these commands at the end of the script will ensure that everything kicks off after WiFi is correctly configured. An example of using WiFi Connect in a Python project can be found here.

balenaOS: multicontainer app

To use WiFi Connect on a multicontainer app you need to: - Set container network mode to host - Enable DBUS by adding the required label and environment variable (more on balenaOS dbus) - Grant the container Network Admin capabilities

Your docker-compose.yml file should look like this:

version: "2.1"

services:
    wifi-connect:
        build: ./wifi-connect
        network_mode: "host"
        labels:
            io.balena.features.dbus: '1'
        cap_add:
            - NET_ADMIN
        environment:
            DBUS_SYSTEM_BUS_ADDRESS: "unix:path=/host/run/dbus/system_bus_socket"
    ...

Supported boards / dongles

WiFi Connect has been successfully tested using the following WiFi dongles:

Dongle Chip
TP-LINK TL-WN722N Atheros AR9271
ModMyPi Ralink RT3070
ThePiHut Ralink RT5370

It has also been successfully tested with the onboard WiFi on a Raspberry Pi 3.

Given these results, it is probable that most dongles with Atheros or Ralink chipsets will work.

The following dongles are known not to work (as the driver is not friendly with access point mode or NetworkManager):

  • Official Raspberry Pi dongle (BCM43143 chip)
  • Addon NWU276 (Mediatek MT7601 chip)
  • Edimax (Realtek RTL8188CUS chip)

Dongles with similar chipsets will probably not work.

WiFi Connect is expected to work with all balena.io supported boards as long as they have the compatible dongles.


Support

If you're having any problem, please raise an issue on GitHub or contact us, and the balena.io team will be happy to help.


License

WiFi Connect is free software, and may be redistributed under the terms specified in the license.

Extension points exported contracts — how you extend this code

NetworkInfoFormProps (Interface)
(no doc)
ui/src/components/NetworkInfoForm.tsx
NetworkInfo (Interface)
(no doc)
ui/src/components/App.tsx
Network (Interface)
(no doc)
ui/src/components/App.tsx

Core symbols most depended-on inside this repo

exit
called by 5
src/exit.rs
exit_with_error
called by 4
src/server.rs
get_access_points
called by 3
src/network.rs
catch
called by 2
src/server.rs
create_portal
called by 2
src/network.rs
stop_portal_impl
called by 2
src/network.rs
is_same_ssid
called by 2
src/network.rs
is_wifi_connection
called by 2
src/network.rs

Shape

Function 49
Method 13
Class 6
Interface 3
Enum 2

Languages

Rust86%
TypeScript14%

Modules by API surface

src/network.rs38 symbols
src/server.rs10 symbols
ui/src/components/NetworkInfoForm.tsx5 symbols
ui/src/components/App.tsx4 symbols
src/exit.rs4 symbols
src/config.rs4 symbols
src/main.rs2 symbols
src/dnsmasq.rs2 symbols
ui/src/components/Notifications.tsx1 symbols
src/privileges.rs1 symbols
src/logger.rs1 symbols
src/errors.rs1 symbols

For agents

$ claude mcp add wifi-connect \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact