Studio
Software that works while you run your business.
- Custom CRM and systems
- Automation, bots and integrations
- Websites and mobile apps
- IT maintenance for a fixed fee
The first conversation is free. A fixed quote before we start.
Software studio and electronics workshop · Costa Adeje, Tenerife
We build software for businesses and repair electronics, right down to soldering the board. Over 15 years in IT, 4 of them here in Tenerife.
Software that works while you run your business.
The first conversation is free. A fixed quote before we start.
Your device, back and working.
Free diagnosis if we do the repair (€30 if not). 3-month warranty.
We designed and built everything you see here ourselves, and all of it is up and running.

Website for a film studio in Los Angeles: booking with Stripe payment and a guest account.
19 spaces · 4 booking channels
See the case
Guest app: booking on a time tape, a set picked from a photo, entry with Face ID.
iOS · Android
See the case
Studio CRM: bookings from every platform, enquiries, tasks, money and AI assistants.
43 tables · 836 automated tests
See the case
Team app: the studio’s day, push with action buttons, Live Activity and Face ID.
iOS · Android
See the case
CRM for real estate agencies that sell properties and then manage them.
59 screens · 7 languages
See the case

The client signs with a finger on their phone and both sides get the document.
See the case

Engineering
Excerpts exactly as they sit in the repository: the request form, contract signing, repair status and workshop hours. Anything we cut is marked “// …”.
if (form.company) return json({ ok: true });
const name = String(form.name ?? '').trim().slice(0, 200);
const contact = String(form.contact ?? '').trim().slice(0, 200);
const about = String(form.about ?? '').trim().slice(0, MAX_LEN);
if (!name || !contact || !about || form.consent !== true) {
return json({ error: 'validation' }, 400);
}
if (env.TURNSTILE_SECRET) {
const ip = request.headers.get('cf-connecting-ip');
const ok = await verifyTurnstile(env.TURNSTILE_SECRET, form.turnstile, ip);
if (!ok) return json({ error: 'captcha' }, 400);
}A bot trap plus a Turnstile check: your inbox gets requests from people, and spam is dropped silently.
export async function sha256Hex(text) {
return toHex(await crypto.subtle.digest('SHA-256', enc.encode(text)));
}
// …
const now = new Date().toISOString();
await env.DB.prepare(
`update contracts
set status = 'signed', signed_at = ?, signer_name = ?, signer_image = ?,
signer_ip = ?, signer_ua = ?, signed_hash = ?,
signer_phone = ?, signer_address = ?
where id = ? and status <> 'signed'`,
)
.bind(
// …
await sha256Hex(row.body),
// …
)
.run();We record the time, IP, device and a SHA-256 of the text the person saw when signing: the signature can be proven and the document can’t be swapped.
const status = ALL_STATUSES.includes(b.status) ? b.status : row.status;
const now = new Date().toISOString();
// …
if (status !== row.status || clean(b.comment, 500)) {
await addEvent(env, id, status, clean(b.comment, 500), now);
}
let mailed = false;
if (status === 'ready' && row.status !== 'ready') {
mailed = await mailOrder(env, 'ready', {
email: row.client_email,
lang: row.lang,
number: row.number,
device: row.device,
url: new URL(`/o/${id}`, SITE.url).href,
});
}Every status change goes into the history the client sees on their link, and the email goes out once — when the repair is ready.
function canary(d) {
const f = new Intl.DateTimeFormat('en-CA', {
timeZone: 'Atlantic/Canary', year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', hourCycle: 'h23', weekday: 'short',
});
const p = Object.fromEntries(f.formatToParts(d).map((x) => [x.type, x.value]));
const dow = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 }[p.weekday];
return { date: `${p.year}-${p.month}-${p.day}`, dow, mins: Number(p.hour) * 60 + Number(p.minute) };
}
const toMins = (hhmm) => Number(hhmm.slice(0, 2)) * 60 + Number(hhmm.slice(3, 5));
const workday = (c) => (HOURS[c.dow] && !HOLIDAYS.has(c.date) ? HOURS[c.dow] : null);
export function shopStatus(now = new Date()) {
const c = canary(now);
const h = workday(c);
if (h && c.mins >= toMins(h[0]) && c.mins < toMins(h[1])) return { open: true, closes: h[1] };
// …
}The site knows on its own whether the workshop is open: Tenerife time, daylight saving and holidays, from the same source as the data Google reads.
Only what HostBase, Hourgrid, Mansaria and this site actually run on. Nothing listed for show.
Already know what you need? Tick the tasks, the stack and how you want to work — the request builds itself.
Build your project in the configuratorWorkshop
We give you a rough price before you even leave home.
A fixed price before we start. If a repair isn’t worth it, we tell you.
You follow every step through a link, with before-and-after photos.
3-month warranty on the repair.
Studio
Before writing a single line, we work out which process is eating your time or money. Sometimes the answer isn’t an app, and we say so.
We don’t reinvent login, payments or notifications. We spend the time on what is unique to your business.
Code, domain, hosting and database are yours. You can take it all to another team whenever you want.
This page is built the way we build systems: light, fast and free of trackers. Your browser measured these figures as the page loaded.
In San Eugenio. If you are coming from far away, message us first so we can make sure we have the part.
28.076 N · 16.733 W
Opening hours
Tenerife ·