In-house Projects
A selection of in-house products built by Lothringer — from consultancy websites to full-stack web and mobile applications.
Building products, not just delivering projects
Lothringer builds its own products in addition to serving client engagements — not as side projects, but as production-quality software running real users through the same delivery practices applied on client work. Each product represents full-cycle ownership: from initial concept and architecture decisions through to deployment, monitoring and ongoing maintenance.
The portfolio spans nine products across three themes: productivity tooling for managing work and organising tasks, language learning platforms for structured independent study, and lifestyle applications for everyday personal use. The technology stack covers server-rendered Node.js web applications, REST APIs with Swagger documentation, native Flutter applications for Android, PostgreSQL and SQLite databases, and Azure cloud hosting with automated CI/CD pipelines.
Building in-house products creates something client work alone cannot: a direct stake in the quality, performance and longevity of the software. When the engineer is also the user, the incentives to ship clean, maintainable, well-tested code are immediate rather than theoretical. These products are available as reference case studies for prospective clients — source code, architecture decisions and lessons learned are available on request.
| Project | Platform | Summary |
|---|---|---|
| Productivity | ||
| This Website | Web | The Lothringer consultancy site itself — bilingual, SEO-optimised, built on Node.js and deployed to Azure. |
| Task Manager | Web + Mobile | Cross-platform task and project management tool with a REST API, server-rendered web UI and a native Flutter mobile app. |
| Test Runner | Web + Mobile | Manual QA test execution platform — import test cases, run them from browser or smartphone, and track pass/fail results over time. |
| List Manager | Android | Offline-first Flutter app for managing multiple personal lists with typeahead suggestions that learn from past entries. |
| Learning | ||
| LëtzLearn | Web | Subscription SaaS platform for learning Luxembourgish, with mastery-based progression, quizzes and a CEFR-level assessment. |
| French Verbs | Web | Interactive French verb conjugation trainer with tense coverage, instant feedback and progress tracking. |
| Adages | Web | Full-stack platform for collecting and sharing proverbs and quotes, with user management, search and a REST API backend. |
| Lifestyle | ||
| Let's Split It | Web | Group expense tracker that calculates the minimum number of transactions needed to settle shared costs. |
| My Steps | Android | Samsung Health step tracker with charts, goal monitoring and HTTP export to Home Assistant or custom backends. |
Engineering decisions
Each project involved meaningful technical choices — not just which framework to use, but how to structure the system, where to draw the boundaries and what to optimise for. A selection of those decisions is documented below.
Single backend, two clients
Task Manager & Test Runner
Both Task Manager and Test Runner expose a REST API that serves two entirely different clients from the same codebase: a server-rendered web interface using session cookie authentication, and a native Flutter mobile app using API key headers. This is a deliberate architectural choice that avoids the typical outcome of divergent backends — where the mobile API drifts from the web backend over time and eventually becomes a maintenance burden.
The shared backend pattern requires discipline in the API contract: routes must return clean JSON without assuming a browser on the other end, authentication middleware must handle both schemes without coupling them, and error responses must be meaningful to both a rendered error page and a Flutter error handler. Getting this right from the start means new features added to the backend are immediately available to both clients without duplication.
Offline-first architecture
List Manager & My Steps
Both List Manager and My Steps are built around a local-first data model: SQLite is the source of truth on the device, and the app works fully without network connectivity. This is the right design for personal productivity and health tracking tools, where the absence of connectivity should never block the user from doing the task the app exists to support.
The tradeoff is sync complexity. My Steps addresses this with incremental sync: on launch the app queries Health Connect for the last sync timestamp and fetches only the delta, with a full historical backfill on first run. List Manager takes a simpler approach — single-device, no sync — which is the right call for a personal list tool with no multi-device requirement. Knowing when not to build a feature is part of the design.
Minimising debt settlement
Let's Split It
The naive approach to group expense settlement — asking everyone to pay everyone they owe directly — scales badly. For a group of n people this produces up to n×(n−1)/2 separate transactions: fifteen payments in a group of six. Let's Split It uses a greedy algorithm instead: compute each person's net balance, then repeatedly pair the largest creditor with the largest debtor, settling as much as possible per transaction until all balances reach zero. This always produces the minimum number of transactions needed, in O(n log n) time.
The algorithm was designed before a line of code was written — identified in the scoping conversation as a core requirement, not an optimisation to add later. Retrofitting a settlement algorithm into a data model designed around direct payments would have required a schema change and a rewrite of the results view.
Health data ownership
My Steps
Samsung Health stores step count data on-device but provides no native export mechanism for external systems. My Steps solves this through Google's Health Connect SDK, which acts as a structured data bridge: the app requests permission to read step data from Health Connect (which Samsung Health writes to), retrieves it at the required granularity, and POSTs it as JSON to any HTTP endpoint the user configures — Home Assistant automations, InfluxDB instances, personal dashboards, or custom backends.
The non-trivial part was not the HTTP export but the historical backfill on first install. Health Connect can hold months or years of data. Fetching it in a single request risks out-of-memory errors on lower-end devices. My Steps pages through history in weekly chunks, writing each batch to local SQLite before moving on, and resumes from the last synced date on subsequent launches — making the initial sync restartable and the ongoing sync lightweight.
AI-Augmented Engineering in Practice
All of the projects below were built using Claude AI as a core part of the development workflow. This is not a novelty — it reflects how Lothringer approaches engineering delivery both for its own products and within client engagements.
AI-assisted development does not replace engineering skill or judgement. It accelerates the mechanics of building: generating boilerplate, writing tests, reviewing code, and helping think through architecture decisions. The engineer remains responsible for the design, the quality and the outcome.
- AI used throughout the development lifecycle — not just for code generation but for requirements, testing and architecture review
- Each project delivered to production quality: structured, documented, tested and deployed with CI/CD
- Demonstrates the shift-left QA and AI tooling approach Lothringer brings to client teams
- Available as a reference case study for organisations considering AI-assisted engineering practices