Engineering
One server runs the whole agency.
The website, the CRM, the mobile app, the social media publishing and the backups all read and write in one place, on Cloudflare, with data stored in the European Union. Nothing important lives only on a phone or a laptop.
Architecture
Read from left to right: where data comes from, what the server does with it, where it is stored, and what goes out.
-
1Where data comes from
Website visitors
People send enquiries and sign up for the newsletter. Forms are protected from bots.
iPhone app
The team adds a new listing with photos and location, logs calls and records voice notes.
Instagram and Messenger
Incoming messages become leads in the CRM, so nobody is forgotten.
Publishing laptop
A laptop posts to Facebook groups by plan and reports every step back.
AI agent
Reads portal listings and drafts copy and documents for review.
-
2The server
Website
The multilingual site with the catalogue, search and blog is served from here.
API and CRM logic
The rules for people, deals, listings and approvals. More than 60 modules, with access by role.
Scheduled jobs
Every minute and every five minutes the server sends notifications, publishes and backs up. At night it checks the data.
Publishing planner
Every night it builds the day's publishing plan, with a cost cap built in.
AI on the server
Turns voice notes into text and checks copy before it is published.
-
3Where it is stored, in the EU
CRM database
People, deals, the activity log, the property register and the calendar.
Website database
Public listings, enquiries and the newsletter list.
Document vault
Private storage without a public address. Files open only after sign in.
Photos
Public property photos for the website and listings.
Backups
Encrypted copies of the databases and the vault, kept for 35 days.
-
4What goes out
Live website
When a price or status changes in the register, the website shows it immediately.
Facebook and Instagram
Posts go out at the exact minute set in the calendar.
Facebook groups
A daily plan tells the publishing laptop where to post, by region and language.
App notifications
The team is told about a new lead, a waiting client or a data problem.
Morning email
A short email called Today: viewings, waiting clients and tasks.
Self-checks: every night the server compares the website, the property register, the deals and the publishing plan. If anything does not match, the team gets a notification. A public health check shows whether the server is up.
The journey of a new listing
An example of how data moves through the system, from the phone to social media.
1 · Phone
The broker photographs the property
Photos, location and details reach the server as a draft from the first minute, so nothing is lost on the phone.
2 · Server
Number, location, copy
The listing gets its next number, a location score and AI drafted copy in several languages.
3 · Approval
A person approves
Nothing goes public until the owner presses Approve.
4 · Publishing
Website, social, groups
The listing appears on the website and enters the publishing calendar.
Stack and evidence
Each skill with the project where it is used and what can be counted.
| Skill | Where | Evidence |
|---|---|---|
| JavaScript on Cloudflare Workers | Agency server, Gorgi Drives API | 79 modules, about 27,600 lines |
| SQL and database design | CRM database | 65 tables, 76 migrations |
| Swift | Native iOS app | 218 files, about 46,400 lines |
| Automated tests | Agency server (Worker) | 131 test files, as of November 2026 |
| CI with GitHub Actions | Agency website | A nightly job rebuilds the sitemap and checks articles against the calendar; a listing workflow runs the release checks before it publishes |
| HTML, CSS, SEO and i18n | Agency website, Gorgi Drives | 172 pages; 243 pages |
| Python | Carousel renderer, Salon sites generator, this site's build | Generators and checks |
| Rust and WebAssembly | Office suite | 43 crates, 912 commits |
| AI agents and prompt design | Agency workflows | 24 custom AI assistants |
| Android (TWA) | Gorgi Drives | Installable app from the website |
| Git | Agency code base | 1,778 commits |
Who can access what
Access depends on the role. Personal data is kept apart from everything else and every access to it is logged.
| Who | Can see | Cannot see | How they sign in |
|---|---|---|---|
| Visitor | Public listings, blog, forms | Exact addresses, owner phone numbers, the CRM | No sign in; forms are protected from bots |
| Client | A shortlist of properties made for them | Other clients, internal notes | A private link or the client portal |
| Broker | Their own deals, viewings and listings | Contract personal data, finances | App sign in, 30 day session |
| Owner | Everything, including contract data | ID numbers stay encrypted until needed | Password plus an authenticator code |
| Machines | Only their own job: publishing, calendar, register | Anything outside the scope of their key | A separate, limited key for each machine |
Security and personal data
- 01
Data in the EU
Databases and storage sit in a European data centre, which keeps the business in line with GDPR.
- 02
Encryption and scoped keys
Personal data needed for contracts is encrypted with AES-GCM and backups are encrypted. Each machine has its own key that opens only its own job.
- 03
Retention
Enquiries and personal data are deleted on a schedule instead of being kept forever.
- 04
Access log
Every time someone opens personal data, it is recorded, so access can be reviewed.
- 05
Public kept separate
An owner's address and phone number never reach the website or the listings.
- 06
Human approval
Publishing, sending and changes to live data go through a review step before they happen.
Interested in working together?
Email or LinkedIn is the fastest way to reach me. My CV is one click away.
References available on request.
