Why we build the way we do.

A CVE count is not a risk score: reachability in Go

A scanner that counts CVEs in your go.mod tells you what you have, not what you run. How govulncheck checks if your code can reach the vulnerable function.

GolangSecurityDevelopment Process

Metadata is data: what leaks even when messages are encrypted

Encryption hides what you say, not who you talk to, when, how often or from where. Why metadata reveals more than content, and what apps can do about it.

PrivacySecurityData ProtectionSoftware Philosophy

Data that is never collected cannot leak

Encryption, firewalls and audits all help, but the strongest security control is simpler: don't keep the data. Why data minimisation beats every defence.

PrivacySecurityData ProtectionSoftware Philosophy

Flutter on Desktop: What Broke on Windows, macOS and Linux

Shipping one Flutter game to three desktop systems taught us where the code really differs. Video, store packaging, rendering and window size, with the fixes.

FlutterGame DevelopmentDevelopment Process

Go or Rust? How We Pick the Language for Each Project

We ship both Go and Rust. The choice is rarely about speed. It comes down to where the code will live: on a server of its own, or inside an app on every device.

GolangRustSoftware PhilosophyDevelopment Process

What is inside our apps: a dependency audit

We say our apps have no tracking, no ads and no crash reporting. Here are the real dependency lists of three shipped apps, so you can check that claim.

PrivacyMobile AppsFlutterData Protection

F-Droid and what it means to own your data

Owning your data is not a setting you switch on. It starts with where the app came from, what it stores, and whether it needs an account at all.

PrivacyData ProtectionMobile AppsSoftware Philosophy

One payment instead of a subscription: the honest tradeoff

Habit Observer sells one PRO unlock instead of a monthly plan. Here is what that choice costs us, what it gives the user, and when it is wrong.

Software PhilosophyMobile AppsPrivacyDevelopment Process

Your Android app should work without Google Play Services

Many Android apps quietly assume Google Play Services is installed. Here is what breaks when it is missing, and how to degrade instead of crash.

Mobile AppsPrivacyFlutterSoftware Philosophy

Why Rust Is the Best Language for Vibe Coding

Vibe coding is only as safe as the thing checking the output. Rust ships the strictest checker in mainstream use, which makes it a surprisingly good fit for AI-written code.

AIRustDevelopment ProcessClaude Code

We Let an AI Agent Do QA on Real Hardware

An AI agent tests our apps on a physical phone instead of an emulator. What it catches, what it costs, and where the approach stops being worth it.

AIMobile AppsDevelopment ProcessPrivacy

Triple Space Is Out on Google Play, With Nothing Attached

Our space merge puzzle is live on Android. Merge three alike to build moons, planets and black holes. No ads, no tracking, no account, works offline.

FlutterGame DevelopmentPrivacyMobile Apps

Why We Build with Go, Flutter, and Rust

Go for backends and tools, Flutter for cross platform apps, Rust for the hot paths. Here is why each language earns its place in the work we ship.

Software PhilosophyDevelopment ProcessGolangFlutterRust

OxiType: the Typing Game That Makes You Faster by Accident

OxiType is a cyberpunk arcade typing game. Shoot down word-carrying alien ships, survive 80 levels, and get faster without ever opening a typing course.

FlutterGame DevelopmentPrivacyMobile Apps

AI-Driven Development with Claude Code: A Security and Privacy Argument

Why AI-assisted coding with Claude Code often produces more secure and privacy-respecting software than manual engineering, and where it doesn't.

AIClaude CodeSecurityDevelopment Process

Why OxiSoft Apps Don't Track You

Privacy-first app development isn't a feature you add. It's an architecture choice that rules out entire categories of revenue, SDKs, and convenience.

PrivacyData ProtectionSoftware PhilosophyMobile Apps