Title's "5 minutes" is marketing, not a promise — but ChirpStack v4 has genuinely compressed what used to take an engineer a week down to an afternoon tea break. The part where time still drains is the gateway side: serial logs, USB driver quirks, the regional configuration files. Software cannot remove those — they are wired into the Semtech concentrator's hardware interface spec.
Fx assumption (October 2026): $1 ≈ ¥6.71 CNY, €1 ≈ ¥7.88 CNY.
"I want to run a private LoRaWAN network, I don't want TTN, I don't want AWS IoT Core charging me per message."
That is the highest-frequency, highest-abandonment question we see in 2026 across community forums, LinkedIn, Reddit r/LoRa, Hackster, and Chinese-language LoRa Spaces on Zhihu.
In 2024 and earlier, answering it took roughly one engineer-week. The reason was that ChirpStack v3 required four separate services (Network Server, Application Server, Gateway Bridge, Mosquitto), each with its own TOML file, its own database connection, its own systemd unit, and its own port and log to coordinate. That is why the prevailing community wisdom at the time was "use TTN or Helium; don't fight the integrator."
In early 2025, ChirpStack v4.0.0 shipped. By early 2026 we are on v4.12+. Two structural changes: Network Server and Application Server were merged into a single Rust binary; multi-region support is built-in, with no need to hand-edit five configuration files. ChirpStack Gateway OS — an OpenWrt-derived image — packages the gateway-side stack as either an SD card image or a web-UI firmware flash operation.
By October 2026, the common reference for getting a ChirpStack v4 private network running is: a Linux-familiar engineer with a Raspberry Pi 4 and one RAK commercial gateway can have their first OTAA device online within half a day. Readers at or above that line are the target of this article.
A second motivation: the market-side reality. The 2026 IIoT platform retirement wave is still going. In the past 24 months, six of the most-cited platform brands changed hands. In the past 36 months, hyperscale cloud vendors retired at least ten IoT services (Google IoT Core 2023-08-16, AWS IoT Analytics 2025-12-15, AWS IoT Events 2026-05-20, AWS Greengrass V1 2026-10-07, Azure TSI 2024-07-07, Azure IoT Central 2027-03-31 — all on the retirement list). Self-hosting with a strong upstream ecosystem (ChirpStack) is one of the few choices in this unstable market that you can count on still being there in three years.
Fact 1: ChirpStack is MIT-licensed, full-stack open source, with no Open Core carve-out. This matters. Many "open source" LoRaWAN gateways and platforms ship with hardware-locked Concentratord or Packet Forwarder bits underneath. ChirpStack's repositories on GitHub can be forked, modified, and sold commercially. There is no "buy an annual commercial license to use it commercially" second lock. HiveMQ and EMQX have built business models around that pattern; ChirpStack is not on that list.
Fact 2: v4 is not a progressive upgrade over v3 — it is a wholesale rewrite in Rust. v3 was Go with multiple processes. v4 is one chirpstack Rust binary with a standard gRPC API. The engineering consequences are: (a) performance rises — the same hardware supports more devices and gateways; (b) deployment goes from four services to one, though the supporting cast (PostgreSQL, Redis, Mosquitto, the certificate stack) is unchanged; (c) CLI and debugging tools changed, and a lot of community documentation about REST is now wrong — v4 leads with gRPC, REST runs as a separate bridging process (chirpstack-rest-api).
Fact 3: v4 has built-in multi-region support — one ChirpStack instance can serve EU868, US915, AS923, CN470, AU915, and IN865 simultaneously without separate instances per region. This is unusual. The Things Stack's self-hosted edition defaults to one region per instance and requires deliberate multi-tenant configuration. ChirpStack's approach is to split the configuration into per-region TOML files (region_eu868.toml, region_us915.toml), load all of them on startup, and automatically prefix MQTT topics per region (eu868/gateway/..., us915_0/gateway/...). For an operator running projects across multiple countries, that is a meaningful slice of operational cost removed.
Direct answers to three common anxieties:
One fact that does not appear in the ChirpStack documentation: Hernandez et al., in their 2024 IEEE Latin-American Conference paper "Downlink Scheduling in LoRaWAN: ChirpStack vs The Things Stack" (DOI 10.1109/LATINCOM62985.2024.10770676), measured actual downlink scheduling. Under their assumption set (3 gateways, Class A, confirmed traffic only, one packet per device every 150 seconds, 90-minute runs, gateway duty cycle disabled), ChirpStack schedules more downlinks than the gateways can transmit and prioritizes RX1; The Things Stack is more conservative, more accurate, and prioritizes RX2. The authors note that neither server accounted for duty cycle, so the ranking outside that specific traffic mix is not established. ChirpStack fits dense-response downlink scenarios (valve closing, siren activation, command execution); The Things Stack fits ultra-large deployments where billing accuracy matters more.
This section is for engineers coming from v3 or evaluating ChirpStack for the first time. Changes affect five layers.
| Dimension | ChirpStack v3 (2020-2024 mainstream) | ChirpStack v4 (2024 — ) |
|---|---|---|
| Process model | chirpstack-network-server + chirpstack-application-server as two independent processes |
Merged into a single chirpstack Rust process |
| Primary API | REST (exposed by Application Server) | gRPC primary; REST only as an optional bridging process |
| Configuration organization | Single TOML file with master and region keys | Configuration directory (configuration/chirpstack/), split by region |
| Region support | One instance per region; needs custom config | Multiple regions simultaneously, preconfigured per LoRa Alliance spec |
| Gateway Bridge | ChirpStack Gateway Bridge v3.14 series (independent component) | v4 supports Bridge v3.14+ and Gateway OS built-in stack |
| Device certification library | TTN repository must be imported separately | TTN LoRaWAN Devices repository natively supported (Codecs included) |
| Device metrics | No native metrics system | Device-level metrics dashboard (extracted and aggregated from Codec) |
| Identifiers | Incremental integers (exposes tenant count) | All UUID (resists enumeration) |
| Backend store | PostgreSQL + Redis | PostgreSQL + Redis (required) + MQTT broker (separate) |
Four changes with direct deployment impact:
The REST API is gone, but also still here. v3's REST was the integration surface of choice. v4 moved to gRPC, and REST became an optional process (chirpstack-rest-api) that you start separately in docker-compose. If you have a Python automation layer managing ChirpStack, the v3 REST scripts need to be rewritten as gRPC clients. That is a non-trivial amount of work.
The configuration directory model is a step change. In v3, changing a region field meant editing master [network_server.network_netids], regional config [network_server.band], packet broker config [integration.mqtt.auth], and remembering which file's restart restarts which service. v4 splits regions into separate TOML files; adding a region is "copy region_eu868.toml, rename, add to enabled_regions." You never need to touch the main chirpstack.toml structure.
TTN repository import solves the "where do I find the codec" pain point. The most common place LoRaWAN projects stall is the decoder — translating vendor binary formats into structured JSON at the NS side. Before v4 that meant hand-writing JavaScript. v4 imports the Things Network lorawan-devices repository natively, and tens of thousands of commercial end-device codecs become available out of the box (only for terminals registered in the repository — custom devices still need writing).
The device metrics dashboard has hidden value. You do not need to write InfluxDB queries. The UI shows 7-day and 30-day time series of battery, temperature, uplink counts, directly. Whatever fields the Codec exposes, the dashboard shows automatically.
Note: The "5 minutes" in the title refers to the time from the moment the toolchain is ready — docker-compose up, edit four TOML files, log into the web UI, add the first Gateway Profile. It is not end-to-end time from a blank machine to first packet being processed (see the engineering estimate in section 9).
Two standard install paths, often mixed.
For: Linux servers or a Raspberry Pi; want to see the web UI within an hour.
The community-maintained chirpstack-docker repository (github.com/MontagniAgustin/chirpstackV4-docker) was last updated to May 2025. The docker-compose.yml includes:
chirpstack (v4 main service)chirpstack-gateway-bridge (v3.14+) — two instances: one listening on UDP 1700 for the Semtech UDP Packet Forwarder, the other on TCP 3001 for Basic Stationchirpstack-rest-api (optional)pg_trgm extensionTypical timing:
registry.cn-hangzhou.aliyuncs.com if needed)Total about 30 minutes to an hour, dominated by the initial docker pull.
For: Don't want to configure a Packet Forwarder per gateway; need unified management across many gateways.
ChirpStack Gateway OS is an OpenWrt-derived embedded image that packages all of the stack (Concentratord, MQTT Forwarder, UDP Forwarder, Gateway Bridge) into either an SD card image or a firmware blob. Currently supported hardware:
Two image flavors: Base image is gateway-side components only (you bring your own NS); Full image additionally packages ChirpStack v4 NS plus Node-RED v3.1.15 — this is the actual "flash and run."
For a Raspberry Pi 4 with Full image plus one RAK7289v2 commercial gateway, field-tested timing:
Total about 1 to 1.5 hours from blank to first payload reported.
A common misconception: many people think Gateway OS is bound to ChirpStack. The Base image only contains gateway-side components and forwards data to any NS (TTN, self-hosted ChirpStack, ThinkLink, AWS IoT Core for LoRaWAN). The convenience of the Full image is mostly for personal/small-team PoC — you do not need to maintain a separate NS server.
For: Going to production, running SLA, no desire to carry docker-compose's hidden "upgrade compatibility" debt.
The community Ansible playbook chirpstack/chirpstack-ansible-playbook covers the entire production-grade deployment:
artifacts.chirpstack.io), managed by a systemd unitProduction hardware reference:
The benefit of going Ansible is idempotency: a configuration change will not be silently overwritten if a teammate hand-edited some file and the next ansible-playbook runs. This matters enormously for "operations handover to a new team member" — they can run the playbook once and the system returns to the documented state.
ManThink GD6's strong point is that the entire protocol stack is supported out of the box — Semtech UDP Packet Forwarder, ChirpStack MQTT Forwarder (replacing UDP), Basic Station. This means there are two standard paths for connecting to ChirpStack v4:
Path 1: UDP Packet Forwarder → ChirpStack Gateway Bridge (v3.14+) → ChirpStack
This is the classic chain, and most commercial gateways ship with this configuration as the default.
GD6's UDP forwarder config sits at /etc/lora/global_conf.json (the regional section) plus /etc/lora/local_conf.json (per-gateway section). The fields you need to change:
server_address: IP or hostname of the ChirpStack Gateway Bridge (default port 1700 UDP)serv_port_up / serv_port_down: uplink and downlink ports (both default to 1700)gateway_ID: matches the Gateway ID you entered when adding the gateway in the ChirpStack web UI (8-byte hex, written in EUI format)Path 2: ChirpStack Gateway Bridge Installed Directly on the Gateway → Connect to Mosquitto
This is the more modern approach. The ChirpStack Gateway OS approach on RAK / Seeed commercial gateways is exactly to put the Bridge on the gateway itself, eliminating the uncontrollable UDP-back-network segment.
For GD6 — built on ESP32-S3 + SX1302 with open hardware — users can compile the GD6 community firmware and bring up chirpstack-gateway-bridge as a child process (via OpenWrt buildroot or as an ESP-IDF subproject). This takes about 1 to 2 engineering weeks for the porting and testing.
Path 3: Basic Station (Recommended for Production)
Basic Station is Semtech's next-generation backhaul protocol — WebSocket + mTLS. More secure than UDP (uplink frames are encrypted, client certificates authenticate the gateway). ChirpStack's Gateway Bridge has supported the Basic Station backend via reverse-proxy TLS since v4.1.0 (via PR #241 in August 2024).
GD6's Basic Station path requires:
chirpstack-gateway-bridge-basicstation instance on the ChirpStack server (listening on 3001/TCP/TLS)/etc/lora/basicstation//etc/lora/basicstation/station.conf to point at the server hostname and the certificate pathIf the gateway is shared by multiple users / teams, or if data traverses a carrier network, Basic Station becomes mandatory. v4's default recommendation is also Basic Station.
Six items you must verify when integrating GD6 with ChirpStack v4 — any one missed produces the classic "gateway connected but no uplink" symptom:
region_eu868.toml and chirpstack-gateway-bridge-eu868.toml must agree on topic_prefix. If they do not, the MQTT message will never reach the consumer.allow them explicitly; on CentOS / RHEL also check firewalld.Many readers ask: I'm already running ThinkLink (ManThink's homegrown platform), why would I need ChirpStack?
Two layers of answer:
Layer 1: NS vs Platform. ChirpStack is an NS (Network Server). Its job is device activation, ADR, deduplication, downlink scheduling. ThinkLink is a platform. Its job is device management, rules engine, integration, visualization. They do not conflict — ChirpStack handles the LoRaWAN protocol at the bottom; ThinkLink does data routing and business integration at the top.
Layer 2: MQTT forwarding lets both coexist. ChirpStack publishes device uplinks onto an MQTT broker. ThinkLink subscribes via MQTT Forwarder to perform application-layer processing. A typical deployment:
thinklink.manthink.cn, permanently free up to 1,000 devices (about 100,000 messages per day)This "NS + Platform" dual-stack deployment's key advantage: no single point of dependency. If any one component falls over, the other can keep going short-term. The same logic applied to the TTN era, but the difference is that ThinkLink is fully self-hostable, while TTN is not.
The ManThink GD6 series firmware now supports configuring three backhaul destination addresses simultaneously — one gateway can ship to both ChirpStack (for production) and ThinkLink (for business visualization). This is a capability ManThink added incrementally after the article 16 platform landscape piece.
Counter-thinking: when should you run only ChirpStack, without ThinkLink?
When you must connect to ThinkLink or an equivalent application layer:
Once a private ChirpStack deployment is up, the biggest anxiety is "who finds out first when it goes down?"
Three minimum-viable health signals:
systemctl is-active chirpstack, or curl http://localhost:8080/api/ returning 200. Ansible playbooks typically install a cron job pinging every 5 minutes and sending WeCom / Slack / email on failure.SELECT pg_database_size('chirpstack');.Backup and recovery:
pg_dump to offsite storage — typically 1-3 GB, completed in under 10 minutes; compresses to 200-400 MB.Upgrades:
apt upgrade, start, recovery plan is the Postgres backup.One hidden gotcha: v4 removed the Concentratord backend from Gateway Bridge (Bridge v4.1.0 changelog explicitly states). So if you are using the Semtech SX1302 + Concentratord path (the legacy one), v4 Bridge no longer supports it directly — you must either switch to ChirpStack MQTT Forwarder installed on the gateway, or move to ChirpStack Gateway OS. GD6 users do not need to worry — GD6 defaults to the UDP Packet Forwarder path and is unaffected.
The 10 most-reported root causes from 2024 to 2026 GitHub issues, Hackaday comments, and community forums:
| Rank | Symptom | Real cause |
|---|---|---|
| 1 | "Gateway added but no uplink" | Gateway ID case or colon copy-paste error |
| 2 | "Device join 100% fails" | DevEUI and AppKey are not a matching pair (OTAA must match) |
| 3 | "Uplink works, downlink never arrives" | In Class A mode, the device must uplink first; the RX1 / RX2 window opens after |
| 4 | "Same frame appears twice" | Two gateways both covered the device; ChirpStack internal deduplication is working as intended |
| 5 | "Mosquitto disconnects the bridge" | mTLS certificate expired; systemd did not restart |
| 6 | "PG slow query" | Device metrics dashboard never reindexed after large-scale delivery |
| 7 | "v4 cannot find device codec" | Codec name case mismatch; v4 resolves by path, not by registration number |
| 8 | "In-container config edits are lost on restart" | docker-compose did not bind-mount; the config is read-only and the container must be recreated |
| 9 | "Basic Station CUPS auth fails" | TC URI is missing quotes; certificate path contains special characters |
| 10 | "v3 API errors after upgrading to v4" | REST API runs as a separate process in v4; chirpstack-rest-api must be started separately |
Do not try to memorize this checklist — you cannot — but work through it row by row when something is not working. 90% of "why won't it come up" issues live in this table.
Back to the title's "5 minutes" — actual delivery time by role:
| Engineering role | Workload | Main steps |
|---|---|---|
| DevOps / SRE, knows Docker but not LoRaWAN | Half a day | docker-compose up → edit region TOML → browser add gateway |
| LoRaWAN engineer, knows hardware but not operations | 1 day | GD6 firmware flash + band file + add first end device + verify |
| Full-stack developer, knows both | 2 hours | Run docker + write a script to batch-add device profiles |
| Embedded developer, knows only C, not Python | 1 week | Must first learn Docker, write codec, configure PG backup |
| No Linux experience at all | 2-3 days | Starts from Raspberry Pi image flashing; first time seeing the web UI |
Real engineering load = install time + four things:
Typical production private-network build cycle: 2 weeks to 2 months — covering hardware validation, capacity stress testing, disaster recovery drills, SLA documentation, training.
"5 minutes" is the time after the toolchain is ready until you first see the dashboard. It is not end-to-end "to production" time. But compared to v3, "toolchain ready" is now a very friendly concept.
The ManThink GD6 series has an often-overlooked word in its positioning: open source. This implies two things:
Recommendations for integrators and end users:
ManThink's perspective: we do not sell cloud, we do not sell subscriptions. GD6 gateway + ThinkLink platform + ChirpStack ecosystem together are an engineering path where "you can read every line of code, all your data lives on your machines, and in three years the supply chain will not be interrupted by a platform deprecation."
Is installing ChirpStack v4 actually "5 minutes"? Yes, and no.
Yes: docker-compose one-liner to the browser dashboard is achievable in 5 minutes.
No: from a blank slate to the first reliable, end-to-end data-into-business pipeline is at least 1-2 weeks. 95% of that time is not in ChirpStack; it is in the device codec, in business integration, in disaster recovery drills, in capacity verification.
When we say "5 minutes to set up," what we really want to say is: make the cost of trying and failing as low as 5 minutes; make the cost of giving up as low as an afternoon coffee. That is the value of open source private networking — it is not cheaper than commercial, it lets you fail often.
That is the shared baseline between ManThink and projects like ChirpStack.
chirpstack-ansible-playbook GitHub repositoryMontagniAgustin/chirpstackV4-docker example repository (May 2025)