Application development
We build the softwareyour business runs on.
AndreiTech is a software studio. We build business applications — portals, booking systems, payments, internal tools — and we build them in Ubex, a platform where the database, the logic and the hosting come as one thing instead of three contracts.
What that means for you: no servers to rent or patch, a working endpoint you can call in the first week, and a change to a business rule that goes live the same afternoon. This page explains how that works, honestly, including what it is not good for.
- Built in
- Ubex
- First working endpoint
- Week one
- You own
- Data, logic, source
What Ubex is, in plain terms
Most software projects spend a large part of the budget on things you never see: provisioning servers, wiring a database, setting up deployment, keeping it all patched. Ubex removes that layer. An application is assembled as a graph of connected nodes, and the platform runs it.
- Tables
The database is already there
You get real tables with typed columns. No database to provision, no connection strings, no backups to arrange. Each table has an id that the logic refers to, and we keep a written schema next to the code so nobody has to guess what a column means.
- Workflows
The logic is a graph, published as an API
A workflow is a set of nodes joined by links: it receives a request, checks who is asking, reads and writes data, calls outside services, and answers. Each one is published as a real HTTPS endpoint with its own authentication, rate limit and timeout — the same kind of API a hand-written backend would expose.
- Interfaces
The screens are hosted on the same platform
The front end is ordinary React. Ubex compiles and serves it on its own subdomain or on your domain, so there is no separate hosting bill and no third place to deploy to. This page is one of them.
- Vault & buckets
Secrets and files have a proper home
API keys and signing secrets go in an encrypted vault, never into the code. Uploads go into buckets — private ones for documents only their owner may open, public ones for images and video served off a CDN.
Underneath, it is a Go runtime, and parts of a workflow that do not depend on each other run at the same time rather than one after another. That is a design decision you feel as speed on pages that need to pull several things at once.
Where this is the right tool, and where it is not
No platform is right for everything, and a studio that tells you otherwise is selling. Here is the line we actually draw before quoting.
- Business applications shaped around records: customers, bookings, orders, enrolments, tickets.
- Portals where different people see different things — customers, staff, managers, owners.
- Payments through hosted checkout, with the money reconciled back against the right record.
- Transactional email and campaigns sent from your own data.
- Documents and media with real per-person access rules.
- Internal admin: dashboards, imports and exports, audit trails.
- Scheduled work: reminders, follow-ups, nightly syncs.
- Talking to services you already pay for, over their APIs.
- Heavy computation, simulation or data science pipelines.
- Real-time collaboration or anything needing sub-50ms round trips, like a game loop.
- Software that must run offline first and sync later.
- Anything that depends on custom native binaries or a specific runtime you control.
- Very large analytical queries over millions of rows — that wants a warehouse, not an app database.
Constraints we design around, openly
The database does not enforce relationships
There are no foreign keys or unique constraints. So uniqueness, required combinations and cascading deletes are enforced in one reviewed place in the workflow, and that place is tested. It is more discipline for us and identical behaviour for you.
The scripting sandbox is deliberately small
Custom logic runs in a sandbox with a short time limit and no outbound network access. Anything that calls an outside service is its own node, which is a good thing: every external call is visible on the canvas instead of buried in a function.
Runs are the billing unit
You are billed per workflow run, not per node, so a big graph costs the same as a small one. It does mean we design bulk work as batches instead of one run per item — a mailing to 500 people is a handful of runs, not 500.
Your application has three layers
Every project we take on is these three, and we build them in this order. Nothing starts on the screens, because screens built before the data model get rebuilt.
Your data
Tables with typed columns, one per thing your business tracks. We write the schema down before building anything against it.
- Money is stored in whole cents, so arithmetic is never off by a rounding error.
- Statuses are a short fixed list, checked in the logic, so reports never see six spellings of "cancelled".
- Timestamps are recorded in your timezone, not the server's.
- Every change to a record can be written to an audit trail, which is the only way to answer "who did this?" later.
Your rules
One workflow per endpoint, handling the related actions together. The rules live in a single reviewed function rather than scattered across the canvas.
- Who may do what is decided on the server, from the token, not from what the browser sends.
- A caller can never act on someone else's record by changing an id in a request.
- Every outcome has a correct HTTP status, so the screens can react properly to 403 or 409.
- Anything shared — sending email, for instance — is one workflow that everything else calls.
Your screens
React, hosted by Ubex on your domain. Plain source you can read, with no build tooling to maintain and nothing to install.
- One module owns every call to the backend, so a change to an endpoint is a one-line change.
- Permissions are mirrored from the server, so people do not see buttons they cannot use.
- Loading, empty and error states are built for every screen, not just the happy path.
- It is fast because it is small: this page is a single file by the time it reaches you.
What we build most often
Most projects are a handful of these, joined up. Built together, your bookings know about your payments and your staff see both — which is the part that never works when each piece is a separate subscription.
- portals
Customer and staff portals
One way in for your customers, another for your team. Roles decide what each person can open, and the server enforces it rather than the menu hiding it. Adding a role later is a configuration change, not a rewrite.
- scheduling
Booking and scheduling
Availability described the way you actually work — opening hours, per-person calendars, breaks, holidays, buffers between jobs. Double bookings are caught before they are written, and reminders go out on a schedule rather than when someone remembers.
- payments
Payments that reconcile themselves
Checkout is hosted by the payment provider, so card details never touch your system and the compliance burden stays with them. When a payment succeeds the provider tells us, we verify it against their API rather than trusting the message, and the money lands against the right booking or invoice. Refunds and disputes update the same record.
- email
Email from your own data
Confirmations and receipts that fire on the event, not by hand. Campaigns to a list you can segment, sent in batches so a mailing to hundreds of people takes seconds. Unsubscribes are handled and honoured on the next send.
- files
Documents and media
Private uploads that only their owner and your staff can open, checked against the record rather than the request. Contracts, reports and identity documents kept where they belong, and images and video served from a CDN so pages stay fast.
- internal
The admin nobody else builds
The unglamorous half that decides whether the system actually gets used: dashboards on your real numbers, spreadsheet import and export, bulk edits, and an audit trail that answers who changed what and when.
What actually happens when someone books a slot
This is the level of detail we work at, and the thing a visual platform makes possible to show you. One tap in the browser, one run on the server, seven nodes. Follow the signal.
- Step 01
The request arrives, and the token is checked first
The endpoint verifies the caller's token before a single node of your logic runs. If it is missing, expired or tampered with, nothing executes and the caller gets a 401. That is the platform doing it, not us remembering to.
- Step 02
We establish who is asking, from the token only
The customer id comes out of the verified token, never out of the request body. This is the single most important line in the whole flow: it is why nobody can book, read or cancel on someone else's behalf by editing an id in their browser.
- Step 03
Three reads run at the same time
Availability rules, the bookings already in the diary, and the customer's own record are independent of each other, so they are fetched simultaneously and the flow waits for all three. Done one after another this is three times slower for no reason.
- Step 04
One function decides everything
Is the slot inside opening hours? Is it already taken, including the buffer after the previous job? Is this customer allowed to book this service? Have they hit a limit? Every answer is decided in one place we can read and test, and it returns a named outcome: confirmed, slot taken, not allowed, or something is wrong.
- Step 05
The outcome chooses the branch
Confirmed writes the booking, records the audit entry and sends the confirmation email. "Slot taken" answers 409 with a message the screen can show. Each outcome has its own exit and its own status code — no pretending a failure was a success.
- Step 06
The response goes back, and the run is logged
Every run is recorded node by node, with what each node received and how long it took. When a customer says "it did not work at nine this morning", we open that run and see the exact node and the exact data. That is the difference between diagnosing and guessing.
How a project goes
Four steps, always in this order, each ending in something you can read or click. You are never waiting on a progress report.
- 01
Spec
Days, not weeksOne written page per feature: what data it needs, what each screen does, who is allowed to do what, and what happens in the awkward cases. This is where a project is actually won or lost, and it is cheap to change at this stage.
You get: A page you approve before anything is built
- 02
Schema
Before any logicThe tables, the columns and the rules that protect them, written down and created. Getting this right first is what stops the expensive rebuild three months in, and it is why we will not start on screens before it exists.
You get: Your data model, documented
- 03
Build
Something working every weekOne endpoint and one screen at a time, each one tested against the live system before the next begins. You watch it come together rather than hearing about it, and course corrections happen while they are still cheap.
You get: A live URL you can use, updated weekly
- 04
Live
And afterwardsDeployed on your domain, monitored, documented. You get the keys, the written schema, the endpoint list and a system your next developer can pick up without ringing us — which is the test of whether it was built properly.
You get: Keys, documentation, and a handover
Systems we have shipped
Anonymised until each client is happy to be named — sector, what it does, and what it is made of. Named references on request.
Barbershop group
Bookings, staff rotas and a customer portal
Walk-ins and appointments in one diary, per-barber availability and holidays, deposits taken at booking to stop no-shows, and a portal where a regular rebooks their usual cut in two taps.
- Scheduling
- Staff roles
- Reminders
- Payments
Coffee retail
Loyalty programme with QR check-in
Points earned at the counter by scanning a code, rewards redeemed from the phone, and campaigns to regulars who have not been in for a month — with the till staff needing no training beyond "scan this".
- Points
- QR
- Campaigns
- Dashboard
Auto glass
Quote-to-fitting pipeline
Enquiries arriving from three channels into one queue, priced against a parts list, turned into a quote, and booked into a fitting slot with the right technician — replacing a spreadsheet and a phone.
- Enquiries
- Quotes
- Scheduling
- Internal tools
Training academy
Courses, enrolments and access control
Access to materials tied to what each student actually paid for, released module by module, with certificates and receipts handled automatically.
- Programmes
- Enrolments
- Documents
- Payments
The questions we actually get asked
- Who owns the system when it is finished?
- You do. The account is yours, the data is yours, and the front-end source is ordinary React in your repository. We work inside your workspace, not ours.
- What if we want to move off Ubex later?
- Then you should be able to, and you can. Tables export to CSV, every workflow exports as a readable JSON file that documents exactly what it does, and the screens are plain React that runs anywhere. Rebuilding the logic on another stack is real work, but you would be starting from a written specification and your own data, not from a black box. We would rather say that plainly than have you discover it later.
- How quickly can a change go live?
- Changing a rule — a price, a buffer between jobs, who may see a page — is usually the same day, because it is a change in one place rather than a release. A new screen or a new endpoint is days. We will always tell you which of the two you are asking for.
- What does it cost to run?
- Two things: the Ubex subscription, billed on how many times your workflows run per month, and whatever outside services you choose — a payment provider, an email sender. There are no servers, so there is no cost that grows just because the system exists. We size the plan with you from realistic traffic before you commit.
- Is it secure?
- The parts that matter are enforced on the server: tokens are verified by the platform before your logic runs, permissions are checked against the record rather than the request, secrets sit in an encrypted vault, and every endpoint has its own rate limit. Card details never touch your system because checkout is hosted by the payment provider. Every change to a record can be logged with who made it.
- Can it work with the tools we already use?
- If they have an API, yes — that is a node. Payment providers, email senders, accounting, spreadsheets, calendars and messaging are the usual ones. If something only has a CSV export, we build an import for it and stop pretending it is an integration.
- What happens when something breaks at two in the morning?
- There is no server to fall over, which removes the most common cause of a night like that. For anything else, every run is logged node by node, so the diagnosis starts with evidence. Support terms are agreed before launch rather than improvised afterwards.
- Will we be able to understand it without you?
- That is the point of the written schema, the endpoint list and the per-feature specs. A workflow is also a diagram, so your next developer can see what happens without reading anyone's code first.
Tell us whatis not working.
A couple of paragraphs about the problem is enough to begin. You will get a straight answer on scope, what order things should happen in, and roughly what it costs — and if Ubex is the wrong tool for what you need, we will say so and tell you what is right.
Write to usOpens your mail app with a short template. Or write to andrei@techvision.es
- You send
- What breaks today, who touches it, and what "live" would look like.
- You get back
- The order of work, what lands first, what it costs, and an honest yes or no.
- Based in
- Spain — working across Europe