Skip to main content

Rust development

Backend services in Rust for situations where performance, memory safety, and predictable operation matter more than rapid prototyping — from APIs to services that run unattended for months.

Hand-drawn illustration for Rust

Tools and frameworks we use

  • Rust
  • Axum
  • Tokio
  • SQLite and rusqlite
  • BDK (Bitcoin Dev Kit)
  • rust-bitcoin and secp256k1
  • Electrum
  • JWT, Argon2, and TOTP
  • rust-i18n
  • Nostr
  • Docker

Rust for backend services that need to stay stable

Rust offers performance on par with C and C++, but with a type system that prevents memory errors and data races at compile time. That makes the language well suited to services that run unattended for long periods, handle sensitive data, or withstand heavy load without using more resources than necessary.

We have used Rust over time in our own open-source projects. Canary is a self-hostable, watch-only service for monitoring Bitcoin wallets, with around 1,800 commits. It is built with Axum and Tokio, uses BDK and Electrum to follow the blockchain, and has sign-in with JWT, Argon2, and TOTP, alerts by email and Nostr, multiple languages through rust-i18n, and packages for StartOS and myNode. Canary Mining is a Stratum V2 server for solo mining that talks to Bitcoin Core over IPC.

Rust, Go, or TypeScript — when we recommend Rust and when we do not

Rust is a good tool, but not a default. We recommend it when at least one of these requirements carries real weight:

  • the service will run for months unattended and must handle network failures without stopping
  • it handles keys, sign-in, or financial data, where a memory bug could become a vulnerability
  • it will run on constrained hardware, for example for users who self-host
  • a well-defined component is a bottleneck for performance or memory use

For ordinary CRUD APIs, internal tools, and products whose requirements are still changing quickly, we rarely recommend it. There, TypeScript or C# gives faster progress and a larger pool of developers. Go is a good middle ground for network services that should be easy to read and operate, with a gentler learning curve than Rust.

The cost of Rust is longer compile times, a steeper learning curve, and fewer developers to hire from. It is worth paying when bugs in production are expensive — not otherwise.

Memory safety and security-sensitive backends

Many vulnerabilities come from memory errors. Rust removes most of them, but secure software takes more than a safe language. We focus on storing passwords securely with Argon2, two-factor authentication, minimal access to sensitive data, and mature, well-maintained dependencies. In a Bitcoin context, this means for example building solutions that only need public keys and descriptors, so the service never has access to the funds it monitors.

Typical engagements

Long-running background services

Services that monitor, synchronise, or notify around the clock, and must handle failures in networks and external systems without stopping.

Security-sensitive backends

APIs that handle sign-in, keys, or financial data, where Rust’s type system and memory safety remove entire classes of bugs.

Performance-critical components

Individual components that must be fast or use little memory, written in Rust and connected to an existing system.

Software for self-hosting

Services that run on the user’s own hardware, packaged with Docker and for platforms such as StartOS and myNode.

Relevant experience

Projects and open-source work where the technology has been used in practice.

Open source

  • canary

    Self-hostable, watch-only monitoring of Bitcoin wallets with email and Nostr alerts. Written in Rust with Axum, Tokio, and BDK.

  • canary-mining

    A self-hosted Stratum V2 server for solo mining against Bitcoin Core over IPC, written in Rust.

Frequently asked questions

When is Rust worth choosing?

Rust fits best when a service will run for a long time, handle sensitive data, or have strict requirements for performance and resource use. For simple CRUD services or quick prototypes, TypeScript or C# is often the more practical choice.

Can you write parts of an existing system in Rust?

Yes. We can extract a well-defined component, such as a background job or a compute-heavy service, and connect it to the rest of the system through an API or a queue.

Which frameworks do you use?

For web APIs we usually use Axum on Tokio, with SQLite or Postgres as the database. Library choices depend on the domain, and we prefer mature, well-maintained dependencies.

How do you test Rust code?

We combine unit tests with integration and system tests that run the service against real dependencies in a test environment. The tests run automatically in CI on every change.

Is Rust hard for our team to maintain?

Rust has a steeper learning curve than many languages, but the compiler catches many mistakes early. We write clear code, document our decisions, and can help your team become confident with the codebase.

Need help with Rust?

Tell us briefly about the product, the team, or the system. We will respond with a practical suggestion for the next step — a complete delivery, senior capacity in your team, or technical advice.

Your email address and message are used only to respond to your enquiry.

Location
Oslo, Norway