Retrofitting existing equipment
Generators, pumps and compressors that were never built to be connected, monitored and re-coded without a site visit.
The S2 is an LTE-M IoT board with the SIM and prepaid data built in. Wire up sensors or relays, write a few lines of Lua, and the S2 sends readings to your own API and acts on your commands. Once it's bolted to the equipment, you still change its code and watch its log from your desk.
No monthly fees · 10 MB of credit in the box · then $1 per MB
If you've shipped hardware, you've had a device that worked on your desk and failed on site. Mine came in my first engineering job, more than ten years ago. I built a converter to connect a gas generator to a large energy company's new IoT system. On my desk, it read and wrote every register. On site, it didn't.
Sites are rarely close. Mine was an 8-hour drive, with the car full of debugging gear.
Sites have gates and safety training. I did the training and got through the gate the next day.
Being there doesn't mean you can connect. Plugging anything in risked a spark, so my tools stayed in the bag.
The bug is usually small. Mine was a wrong register address from a typo in the spec. It took three days to find and minutes to fix.
I've hit the same wall on IoT projects ever since. The device sits somewhere hard to reach. The bug only shows up there. The algorithm waits until the real sensors are installed. I built the S2 and Superstack so you can reach the device from your desk instead: change its code, watch its log and read its sensors, wherever it is.
Raj Nakarja, founder
Before the application can bring any value, a cellular IoT product needs hardware, a carrier, an update pipeline and a backend. Building that takes most teams about a year. The S2 and Superstack come with all of it, so you start on the application in minutes.
The S2 Module has six IO ports for I²C, SPI, analog and digital IO. Four of them take Stemma QT and Qwiic boards with no soldering. It's built on Nordic's nRF9151, and runs from USB-C, a 5 to 17 V supply or a single LiPo cell.
The S2 works with any I²C sensor, any SPI sensor or memory chip, and any UART device. It also outputs PWM, reads analog voltages, and drives or reads digital IO for relays, switches and LEDs. We've already built demos for ten sensors, a display, an NFC tag and a relay in the S2 Lua examples.
S2-MODULE
Integrated antenna
For plastic enclosures, in most covered countries.
S2-MODULE-EXT-ANT
External antennas
For metal enclosures, and for the US, Japan and other countries marked in the coverage table.
Field bugs rarely show up on the bench, so the S2 lets you debug the real device where it's installed. Read its sensors, change its code and watch the result from your terminal, while it stays bolted to the equipment.
superstack tail streams every
print() from a fleet or one device.
superstack dev uploads on every save and
follows the log. No compile, no flash, no site visit.
-- Which address is the sensor really on? device.power.set_vout(3.3) device.sleep(0.1) for address = 0x08, 0x77 do if device.i2c.read(address, 1).success then print(string.format("Found 0x%02X", address)) end end
$ superstack dev 350457790012345 scan.lua # uploads on every save, follows the log # Found 0x19 # set MCP9808 = 0x19 in main.lua, then $ superstack upload 350457790012345 main.lua $ superstack tail 42 350457790012345
Lua is the lightest safe layer you can put over C, and one of the easiest languages to learn. The S2 runs Lua 5.5, which has 23 keywords to Python's 35. Most sensors and buses follow a standard scheme, so each S2 call handles the common case in one line, and optional parameters let you go deeper when you need to.
network.post() sends your data over an
encrypted session, from a thread of its own. Thread
safety, memory safety and security are our problem, not
yours.
-- The common case takes one line local reading = device.i2c.write_read(0x18, "\x05", 2) -- Optional parameters go deeper local reading = device.i2c.write_read(0x18, "\x05", 2, { port = "PORTE", frequency = 400, }) -- Send it to your own API local raw = string.unpack(">I2", reading.data) network.post("https://api.example.com/readings", json.encode({ raw = raw }))
Superstack is the pipe between your S2 devices and your systems, and it makes IoT look like the ordinary web. Devices call your REST endpoints. Your services reach devices over REST, or over a WebSocket when latency matters. We did the protocol work, so any backend developer on your team can build on your devices with the tools they already know.
received POST /readings {"temp": 21.44}
sent POST {"motor": "on"} to my device
$ superstack pair "my device"
$ superstack upload main.lua
$ superstack tail
14:52 [my device] 21.44 °C
> Pair my new S2 as "my device"
> Read the BMP280 and post it to our API
> Show me the log
● my device read 21.44 °C at 14:52
Yours. Your Lua code, your sensors, your data and the systems it reaches.
Ours. The S2 firmware, the SIM and LTE-M connectivity, recovery, and Superstack in between.
An S2 posts its readings to your REST endpoints, in the format you choose. There's no MQTT broker to run, scale or pay for.
Your services message a device with a REST call, or hold a WebSocket open for low latency. Your team never hires for embedded networking or touches a UDP socket.
Superstack encrypts your data in both directions and forwards it without reading it, logging it or using it for anything of our own. It never stores your readings, so there's nothing of yours to leak.
A fleet key reaches one fleet and nothing else. Share fleets with teammates by email, and revoke either in one command.
We asked Claude Code to add a new S2 to our Greenhouse fleet and log its MCP9808 temperature sensor. With the Superstack plugin, it found the fleet, paired the module, wrote the Lua driver and read back the first temperatures in 27 seconds.
> Add the new S2 (IMEI 350457790012345) to Greenhouse and log its MCP9808 temperature
Claude: I'll look up your Greenhouse fleet, then pair the module with it.
Claude: Greenhouse is fleet 42. Press the pairing button on the module now.
Claude writes a 23-line temperature.lua. It
sets the port voltage to 3.3 V, checks the MCP9808's ID
register at I²C address 0x18, then reads and sends the
temperature. It runs
superstack upload 350457790012345 temperature.lua
and superstack tail 42 350457790012345 -n 3.
Claude: The sensor is live. The ID check passed, and the
first readings are 21.44 °C, 21.50 °C and 21.50 °C. Each
reading also goes out through network.post,
ready to pipe into your own systems.
Superstack ships no chatbot and no opinion about how you should use AI. It gives your agent the same tools you have, and lets you decide what it does with them.
--json output on every list for scripts and
agents.
> /plugin marketplace add siliconwitchery/claude-plugins > /plugin install superstack@siliconwitchery > Read the BMP280 on PORTA every 10 minutes and post it to our API ● I'll pair the module, write the driver, then follow the log to check the readings.
$ superstack login github Logged in as you@example.com. $ superstack fleet create greenhouse Created fleet "greenhouse" with id 42. $ superstack device pair 350457790012345 42 Press the pairing button on device "350457790012345". Paired device "350457790012345" with fleet 42. $ superstack upload 350457790012345 main.lua Uploaded 1 file to device 350457790012345. It arrives at its next check-in. $ superstack tail 42 2026-10-22T14:52:08+02:00 350457790012345 print [] 21.44 °C
local MCP9808 = 0x18 device.power.set_vout(3.3) device.sleep(0.1) local id = device.i2c.write_read(MCP9808, "\x06", 2) if not id.success or id.data ~= "\x00\x54" then error("No MCP9808 at 0x18. Check the wiring") end
The S2 Module fits any sensor or controller that sits beyond Wi-Fi and out of easy reach.
Generators, pumps and compressors that were never built to be connected, monitored and re-coded without a site visit.
Built-in GPS and battery charging for trailers, tools and anything else that moves.
Temperature logs from trucks, containers and storerooms, straight into your quality system.
Soil, irrigation and livestock sensing across sites that will never have Wi-Fi.
Stations in hard-to-reach places, re-coded remotely instead of revisited.
Low-latency WebSocket links back to a ground station for decisions in real time.
Silicon Witchery designed the S2, its firmware and Superstack. Our engineers can design the carrier board your S2 mounts on, write its Lua, and send its readings to your systems. Or we can design your whole product, through certification and into manufacturing.
The S2 Module ships with its SIM and data plan built in. There's no carrier contract or gateway to set up before the first reading.
The S2 ships from DigiKey with 10 MB of starter credit. Its IMEI is on the label on the back.
The Superstack CLI runs on macOS, Windows and Linux. Or add the Superstack plugin to Claude Code.
$ brew install --cask siliconwitchery/tap/superstack
$ scoop bucket add siliconwitchery \ https://github.com/siliconwitchery/scoop-bucket $ scoop install superstack
$ yay -S superstack-bin
$ nix profile install \
github:siliconwitchery/superstack-cli#superstack
> /plugin marketplace add siliconwitchery/claude-plugins > /plugin install superstack@siliconwitchery
Log in with GitHub or GitLab and create a fleet. Then pair the S2 by its IMEI, and press the button on the board when asked.
$ superstack login github Logged in as you@example.com. $ superstack fleet create greenhouse Created fleet "greenhouse" with id 42. $ superstack device pair 350457790012345 42 Press the pairing button on device "350457790012345". Paired device "350457790012345" with fleet 42.
Wire an MCP9808 temperature sensor to PORTA, save this
main.lua and run superstack dev.
It uploads the file and follows the log of the S2. Every
save uploads again.
device.power.set_vout(3.3) while true do local result = device.i2c.write_read(0x18, "\x05", 2) local raw = string.unpack(">I2", result.data) print(string.format("%.2f °C", (raw & 0x0FFF) / 16)) device.sleep(5) end
$ superstack dev 350457790012345 main.lua Uploaded 1 file to device 350457790012345. It arrives at its next check-in. 2026-10-23T09:14:06+02:00 350457790012345 state [] Code started 2026-10-23T09:14:06+02:00 350457790012345 print [] 21.44 °C 2026-10-23T09:14:11+02:00 350457790012345 print [] 21.50 °C
The S2 Module is a cellular IoT module built on Nordic's nRF9151, with LTE-M, GPS, a global SoftSIM and prepaid data inside. Superstack is the service that sends Lua code and messages to S2 devices over the air, streams their logs back and forwards their readings to your own REST API or WebSocket.
The S2 costs its hardware price, then $1 per MB of data. Every S2 comes with 10 MB of starter credit. Traffic in either direction spends credit, and nothing else does. Superstack has no subscriptions and no per-seat fees. Large fleets and heavy data users can ask for contract pricing. See S2 pricing.
No. Every S2 ships with a global SoftSIM and 10 MB of starter credit. When a fleet runs low, top it up with superstack account topup.
The S2 has full LTE-M coverage in 25 countries, including most of Europe, the UK, the US and Japan, plus partial or city coverage in many more. Check the coverage table before you deploy.
The S2 works with any I²C sensor, any SPI sensor or memory chip, and any UART device. It also outputs PWM, reads analog voltages, and drives or reads digital IO for relays, switches and LEDs. The S2 Lua examples include demos for ten sensors, a display, an NFC tag and a relay.
The S2 is built for debugging devices you can't reach. You change its Lua over the air in seconds without a compile or flash, follow its log live, and pay $1 per MB with no subscription or per-device fee. See the full S2 comparison with Particle, Blues and the Thingy:91 X.
Follow the S2's log live with superstack tail, change its Lua, and push the fix with superstack dev. The new code reaches the S2 at its next check-in. Lua reaches I²C, SPI, UART, analog inputs, digital IO and PWM directly, so you can probe the real sensors on the deployed board without a site visit.
Yes. Pair an S2 to your fleet, then post it to whoever is on site. Once they plug in the sensors and power it up, you write and test your code from your desk against real readings.
No. S2 code is Lua that runs inside Silicon Witchery's firmware, and Silicon Witchery builds and signs every firmware update. Nothing you push can leave an S2 unrecoverable, and a deployed S2 always stays reachable.
Superstack sends your devices' data to your own systems. Superstack keeps your account and fleets, device code, undelivered messages, 14 days of device logs and the credit ledger. Silicon Witchery never reads or logs the data sent to and from your devices, and no AI sits between you and them.
Yes. Superstack groups devices into fleets. Add teammates to a fleet by email, and hand a fleet to a new owner when a project changes hands.
Yes. A Claude Code plugin and open Agent Skills teach your agent S2 Lua and the Superstack CLI, so it can pair devices, write sensor drivers and read logs. You don't have to use AI. The Superstack CLI covers every feature on its own.
Yes. The S2 ships with a housing and standoffs, and pads on its underside let you mount it on your own carrier board with pogo pins. If you need a custom board or enclosure, our consulting team can design it.
Order an S2 from DigiKey, pair it in under 30 seconds, and change its code from anywhere.
Get occasional updates on new hardware and Superstack features.