A story from earlier work
I wanted to understand a building. The device had to manage without me.
MiTA started as a score. A short recording, a kind of building, a place. Years later I was no longer looking at the formula. I was looking at whether a Raspberry Pi would boot in a room I did not have to stay in.
By Sina Esfahani · Earlier work, not a commission · Updated .
Before the story
This is not a customer case. It is work I carried myself, some of it before OmniTechs existed in March 2023. The first backend starts on 7 January 2022. It is not a current product and not a structural inspection. The numbers later on are what the code did, not a judgement of a real building.
January 2022
I started with the calculation, and the rest grew onto it
A building, for me, had a construction year, a number of storeys, an occupancy, and a frame in two horizontal directions. The plan, not the height. A recording carried a device, a place, and a run of samples. Each place held two accelerations: a level of shaking you expect more often, and a rarer, heavier one. In February 2023, data for other parts of the Netherlands joined them.
All of that lived in one Django project. Users, payments, subscriptions, coupons, support tickets, translations, and the calculation, in the same process. When I read the history through 2 July 2023, I counted 1,379 commits. There were two different Analysis models. There was a folder called exception and a folder called exeptions. In the compose file the background worker was a comment. I had even put a facade and a factory in there, which sounds tidy until you notice they were sitting in the same pile.
Looking back, I can see what I was doing. I was trying to turn a spreadsheet into a company. There was an Iranian payment module, and a PDF link to another domain. The passwords in those old deploy files stay out of this story.
Then the phone
A measurement inside a building does not fit on a desk
After the backend came the phone. Nobody carries a server up a stairwell. The recording had to happen where the building was.
The first phone is Mita_mobile. Expo, the name MiTA, version 3.4.4, held upright. It opens through mitaclassic:// and asks for the location and the motion sensor, sampled fast. Inside are the things you need while you are standing in the building: an account, a building, a recording, a graph, a result. Soil has its own screen. So do payment, a wallet, and a shop. The Android package was first.mita.clever.safety.
The later phone is MiTA_mobile_new, version 4.0.2, written in TypeScript. It opens through mita://. After you log in there is one shell: buildings, the accelerometer, the saved recordings, and a web screen. The package is mita.clever.safety.
The server kept the same agreement. The phone asked for the latest results, for one device, in the reader's language. The admin screen could filter further. The phone got the short answer. Payment went through the bank. When it succeeded, the server marked the analysis paid and showed a page that the payment had gone through, with a button back to the software. That button opened mita://register?page=result. The path was put there in May 2022 as a test of the link. The later phone is the one that answers to it.
When it seized up
One day everything was attached to everything else
You know the pattern if you have pulled on one product for long enough. Every new question found a place in the pile that was already there. Payments beside the score. Tickets beside the recording. The code still ran, and at the same time I could not pull on one piece without dragging the rest.
So I started reading. Not toward another screen. Toward how you take a domain apart when it is in its own way. That reading was the turn.
23 February 2023
I pulled it apart and set it down again
Mita_The_Netherlands starts that day with a Django structure and, the same day, a Next.js structure. Country, building, building class, recording, analysis, notification, and payment became their own apps. The analysis ran through an interface, a service, and a background task. When a calculation failed, the error stayed on the recording. It no longer vanished. I split the results page into a chart, a summary, and the vulnerability.
The rewrite is 219 commits, from 23 February to 12 July 2023. Each axis was calculated on its own. Of several partial scores I kept the weaker side, and that side then weighed the most: 0.64, then 0.10 and 0.26. A guard refused a result in which the rarer level outweighed the total. Above 15 the label was no damage, from 10 through 15 slight, from 5 through 10 moderate, above 0 through 5 extensive, and only exactly 0 was complete. Anything else stayed undefined. That is a boundary I put in the model. It does not replace a structural engineer.
The settings name app.clever-safety.ir. An older admin helper points a PDF at app.clever-safety.com.
September 2022
Two days of separate services
Before the Netherlands rewrite I had already tried to pull two pieces off. MiTA_microservice starts on 6 September 2022. One service for users, one for notifications, each with its own database, and Redis between them. The last change is 8 September.
The website had started earlier, in June 2022. MiTA-website calls itself the official site. It is Next.js, and it wears a full bar: the name, search, English and Persian, a light theme and a dark one, and the words team, products, blog, and contact. Under that bar the home page is empty. The pages that exist are login, register, a panel, and tickets. The note for putting it on a server is one pm2 command.
13–15 July 2023
Then the installation became the product
In the middle of July the question turned. Not whether the score could take another parameter. Whether someone could switch this on after I had left the room.
sensor_network is a much smaller Django project. It keeps the construction year, the frame type on X and on Y, and the occupancy. Gunicorn sits behind nginx. The first boot script sets the hostname to mita and turns SSH on. The commits from those two days are almost entirely install repair: virtualenv, permissions, nginx, static files. That tells you where the work was. At the plug.
I wanted a headless Raspberry Pi, so the device would boot without a screen and without a developer beside it. raspberry_headless is a short public guide: Raspberry Pi Imager, Lite, an ssh file, wifi. mita_automation is a different attempt. It prepares a server disk, with swap and /var, and expects a GitHub token in the environment. One command still hid disks, permissions, and a secret. The Pi image and the server script were two different ways of making the install depend less on me.
If you recognise any of this
Take the order of the work with you
If you have a measurement, a process, or a device that someone has to start without a developer, you may recognise the order. First make the domain small enough to calculate. Then pull the pile apart when payments, tickets, and the calculation are in each other's way. Then make the installation the product, and believe your commit log when it is mostly permissions and nginx.
MiTA cannot be ordered. A similar commission starts with what has to stay true when the formula, the app, or the enclosure changes. Custom software is the route I use now to look at that with a client. An information screen on a Raspberry Pi is a different product, and it stays on its own Lab page.
Do you recognise the room?
Say who has to start the system when you are not there, and where it gets stuck now. Then we can see whether a smaller first step is the responsible one.

