v2026.04  ·  shipping small, shipping often

One developer, every layer of the stack.

I’m Jan — the j and the 8 in j8n, s.r.o. A one-person software studio from Slovakia building production-grade web, iOS and Android applications end-to-end.

Since
2019
Based
Slovakia · EU
Vexo app icon
PHP
Swift
Kotlin
Tailwind
PHP · Laravel
git push origin main
2m ago · vexo · feat: add 2-player rooms
build passed · 0 warnings
ios · iphone 15 pro · 1.2s
01 / intro scroll j8n, s.r.o.
◆ web apps◆ iOS◆ Android◆ SEO engineering◆ API design ◆ infra / devops◆ mobile games◆ Stripe · RevenueCat◆ Supabase · Postgres ◆ design systems◆ LLM integrations◆ 2026 tech
02 · recent work

Currently shipping.

VEXO
geography quiz · iOS & Android

Master the world.

Vexo is a fast, fun geography quiz. Guess countries, capitals, flags, languages and borders — solo, against the clock, or head-to-head with a friend.

  • Daily 5 streak
  • Quick Sprint mode
  • 2-player rooms
  • 6 languages
  • World Tour progression
  • Offline-first
Vexo home screen
Vexo border question screen
+125 · Daily 5
🔥 streak · day 12
Platform
iOS · Android
Stack
React Native · Expo
Backend
Supabase · Edge
Category
Trivia / Education
Vexo.xcodeproj QuizView.swift
swift 5.10
// iOS · haptics wired to every tap
import SwiftUI
import CoreHaptics

struct QuizView: View {
  @State private var score = 0
  @State private var lives = 3

  var body: some View {
    VStack(spacing: 16) {
      FlagCard(country: current)
        .transition(.scale.combined(with: .opacity))
      AnswerList(choices: choices) { pick in
        haptics.play(pick.isCorrect ? .success : .error)
        advance(pick)
      }
    }.animation(.spring(duration: 0.25), value: current)
  }
}
vexo-android QuizScreen.kt
kotlin 2.0
// Android · Compose · same feel, native platform
package sk.j8n.vexo.ui

@Composable
fun QuizScreen(vm: QuizViewModel) {
  val state by vm.state.collectAsState()

  Column(
    verticalArrangement = Arrangement.spacedBy(16.dp)
  ) {
    FlagCard(state.current)
    state.choices.forEach { c ->
      AnswerRow(c) {
        haptic.performHapticFeedback(
          if (c.correct) Confirm else Reject
        )
        vm.advance(c)
      }
    }
  }
}
02.1 · inside vexo

Seven modes.
One clean build.

A polished, localized geography game with seven modes, a 2-player system over Supabase Realtime, and a design language inspired by map projections and passport stamps.

7 game modes
Daily 5, Quick Sprint, 2-Player, World Tour, Similar Flags, Capitals, Languages, Borders.
Race-the-clock Sprint
10 questions, 3 lives, tight haptics, running score. Designed to be replayed while the coffee brews.
2-player rooms
Create a room, share a code, steal points. Low-latency rooms over Supabase Realtime channels.
Vexo 2-player setup
Vexo capital question
Vexo settings
EN · SK · CS · DE · FR · ES
03 · the stack

The tools
on my desk in 2026.

I pick boring, fast, and well-documented. Static where possible, dynamic where it earns its keep. This site, for example, is hand-written HTML and Tailwind — no framework, no build step, hosted behind plain nginx. It loads in milliseconds. That’s the vibe.

Frontend
HTML·Tailwind·React·Vite
iOS
Swift·SwiftUI·Expo
Android
Kotlin·Compose·Expo
Backend
PHP·Laravel·Supabase·Postgres
Infra
nginx·apache·Cloudflare
AI & ML
Claude·local LLMs·RAG
vexo/lib/quiz.php
claude · haiku 4.5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 7 modes, 247 countries, three days, one cup of coffee.
<?php
namespace J8n\Vexo;

final class Quiz {
  public function next(Mode $mode): Question {
    $pool        = $this->loadPool($mode);
    $answer      = pickWeighted($pool, streakOf($this->user));
    $distractors = pickSimilar($answer, 3);

    return new Question(
      id:        Uuid::v7(),
      prompt:    promptFor($mode, $answer),
      choices:   shuffle([$answer, ...$distractors]),
      correctId: $answer->id,
      meta:      ['lives' => 3, 'timer' => 10_000],
    );
  }
}
main php 8.3 · 0 errors // building something small today
zsh — 80x24
~/j8n/vexo on main via node v22
pnpm build && npx expo submit --platform ios
✓ bundled 847 modules in 1.2s
✓ uploaded build 1.0.3 (42.1 MB)
✓ submitted to App Store Connect · status: pending
04 · services

What I do — and how I do it.

Four doors. Same person opens all of them. No account managers, no handoffs — you talk directly to whoever is writing the code.

/ 01

Web applications

Marketing sites, dashboards, internal tools, SaaS MVPs. SSR or SSG, obsessive about speed.

  • · HTML · Tailwind · PHP
  • · PageSpeed 95+
  • · SEO · AI-crawler ready
/ 02

iOS applications

Native Swift or React Native. Haptics, animations, App Store submission and TestFlight beta included.

  • · Swift · SwiftUI · Expo
  • · RevenueCat · Stripe
  • · TestFlight · App Store
/ 03

Android applications

Kotlin / Jetpack Compose, or cross-platform with Expo. Google Play listing, signing, CI & rollout.

  • · Kotlin · Compose · Expo
  • · Material 3
  • · Play Console · rollout
/ 04

Performance & SEO

Audits for speed, Core Web Vitals, schema, and AI-crawler readiness. You get a PR, not a PDF.

  • · Lighthouse · WebPageTest
  • · JSON-LD · llms.txt
  • · Schema · OpenGraph
05 · about

One developer,
every layer.

I run j8n, s.r.o. out of Slovakia. Web, iOS, Android — design, code, ship. If something is slow, I fix it. If a design feels off, I say so.

Based in
🇸🇰  Slovakia
Languages
SK · EN · CS
Timezone
CET
/etc/nginx/sites-enabled/j8n.sk
nginx 1.27
# static. fast. boring. perfect.
server {
  listen      443 ssl http2;
  server_name j8n.sk;
  root        /var/www/j8n;

  gzip           on;
  brotli         on;
  http2_push     /assets/vexo-icon.png;

  location ~* \.(png|jpg|webp|svg|woff2)$ {
    expires 365d;
    add_header Cache-Control "public, immutable";
  }

  location / { try_files $uri $uri/ =404; }
}
zsh — lighthouse
lighthouse https://j8n.sk —-only-categories=performance,seo
Performance 100 · FCP 0.4s · LCP 0.6s · CLS 0
SEO 100 · meta ✓ · JSON-LD ✓ · sitemap ✓
Best Practices 100
07 · let’s build

Have something
worth building?

One email, no forms. I read every message within a day — usually in a few hours. Tell me what you’re trying to ship and when.