✦ Preferences saved
TYRUS
angel@tyrus : ~$ _
// software builder  ·  web craftsman  ·  digital architect
Precision tools for those who build the web.
Digital Craftsmanship
tyrus.dk

Freelance web developer & software builder — Angel Tiru. Custom websites, fixes, audits. No WordPress. No templates. Available for hire. Single-file tools that ship with zero dependencies — and custom websites that outlast every trend they were built in. Self-taught. Obsessive. Vamdrup, Denmark.

Software Products
Full-Stack Dev
CI4 & PHP
Game Modder
Numismatist
0+ Yrs Dev
Experience
Self-taught since 2014
Full-stack PHP & JS
Full-stack PHP & JS
0 Deps
Zero bloat
No composer
No npm
No database
{ }
0+ Languages
Syntax aware
PHP, JS, CSS, SQL
Python, Lua, YAML
+ 54 more via CM5
📄
0 File. Full IDE.
PHP File Manager
476 kB single file
CodeMirror 5 IDE
Upload & run instantly
Server Files
📁..
📁application
📁assets
📁uploads
📁writable
📄.env0.3kB
📄.htaccess0.4kB
app.js12.1kB
📦backup.zip38.2kB
🌐index.php75.0kB
🌐manager.php476kB
🎨style.css18.3kB
zip-browser.js9.7kB
↑ upload file (or drag & drop)
tyrus.dk  /  PHP File Manager v1.0.0
🌐index.php
🌐manager.php
🎨style.css
2515
2516
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
}
// return outside any function - brace depth tracking
$phpLines = explode("\n", $code);
$funcDepths = []; // stack - depth where each function started
$depth = 0; $inString = false; $strChar = '';
foreach ($phpLines as $rli => $rlline) {
    $rltrimmed = trim($rlline);
    if (substr($rltrimmed, 0, 2) === '//' || substr($rltrimmed, 0, 1) === '#') continue;
    $rlen = strlen($rlline); $i = 0;
    while ($i < $rlen) {
        $c = $rlline[$i];
        $next = $rlline[$i+1] ?? '';
        // skip inline comments
        if (!$inString && $c === '/' && $next === '/') break;
        if (!$inString && $c === '#') break;
        // string tracking - don't count braces inside strings
        if (!$inString && ($c === '"' || $c === "'")) {
            $inString = true; $strChar = $c; $i++; continue;
        }
        if ($inString && $c === $strChar && $rlline[$i-1] !== '\\') {
            $inString = false; $i++; continue;
        }
        if ($inString) { $i++; continue; }
        if ($c === '{') {
            $depth++;
            $prevLine = trim($phpLines[$rli-1] ?? '');
            if (preg_match('/\bfunction\s+/i', $rltrimmed) ||
                preg_match('/\bfunction\s+/i', $prevLine))
                $funcDepths[$depth] = true;
        } elseif ($c === '}') {
            unset($funcDepths[$depth]);
            $depth = max(0, $depth-1);
        }
        $i++;
    }
    // depth=0 + no open function = global scope
    if ($depth === 0 && empty($funcDepths) && $rli > 2) {
        if (preg_match('/^\s*return\b/i', $rltrimmed))
            $issues[] = ['type'=>'warning', 'line'=>$rli+1,
                'msg'=>'return outside any function — misplaced code',
                'source'=>'PHP Structure'];
    }
}
Linter112 PHP patterns
Zero deps1 file only
107 LanguagesCodeMirror 5
PHP File Managerv1.0.0
CodeMirror 5Full IDE
107
107 LanguagesSyntax highlight
PHP & CSS & JSLinter · 112 patterns
ZIP BrowserDrag & Drop
IP BanBrute-force Shield
ENRODK
EN / RO / DK UIZero Reload
Full-stack PHP & JSFull-Stack
CK3 WorkshopSteam Mods
Classical GuitarFingerstyle
Ancient CoinsMedieval Numismatics
1
Single PHP FileZero Dependencies
Side-by-side Diff.bak backup
Mobile · DrawerHaptics
VamdrupDenmark · EU
PHP File Managerv1.0.0
CodeMirror 5Full IDE
107
107 LanguagesSyntax highlight
PHP & CSS & JSLinter · 112 patterns
ZIP BrowserDrag & Drop
IP BanBrute-force Shield
ENRODK
EN / RO / DK UIZero Reload
CodeIgniter 4Full-Stack
CK3 WorkshopSteam Mods
Classical GuitarFingerstyle
Ancient CoinsMedieval Numismatics
1
Single PHP FileZero Dependencies
Side-by-side Diff.bak backup
Mobile · DrawerHaptics
VamdrupDenmark · EU
Software Products

Precision tools
Your entire server, managed.

Not a dashboard. Not a framework wrapper. A real code editor, ZIP browser, linter and diff tool — compressed into a single PHP file that you place anywhere and it works. Instantly.

Available Now Single File PHP 7.0 → 8.4
PHP File Manager
by Tyrus Angel  ·  v1.0.0

Not a dashboard. Not a framework wrapper. A real code editor, ZIP browser, linter and diff tool — compressed into a single PHP file that you place anywhere and it works. Instantly.

“Managing server files should not require SSH access, a VPS, or three separate tools. It should require exactly one file — and thirty seconds.”

  • CodeMirror 5 code editor — Dracula theme — 107 language syntaxes (syntax highlighting) + autocomplete
  • 112 PHP patterns, CSS property validator, JS bracket checks — with inline markers
  • Visual diff against .bak — backup created automatically on every single save.
  • ZIP browser with expandable tree, cascading selection, drag & drop extraction to any folder.
  • Brute-force IP ban — animated horror canvas shown to blocked visitors.
  • Full EN / RO / DK UI — 240+ translation keys, animated pill switcher, zero page reload
  • Side-by-side compare — Multi-rename with live preview — Content search inside files.
  • Slide-out drawer, long-press context menu, haptic feedback on mobile
// What is inside
🔬
Code Linter
112 PHP patterns, CSS property validator, JS bracket checks — with inline markers
📦
ZIP Browser
Expandable tree, cascading checkbox select, drag & drop extraction to any folder.
Compare & Diff
Side-by-side file compare + .bak visual diff with one-click restore
🔒
Login & Security
Bcrypt auth, brute-force IP ban, 30-min session timeout, full activity log
📱
Mobile
Slide-out drawer, long-press context menu, haptic feedback on mobile
🌐
Multilingual
Full EN / RO / DK UI — 240+ translation keys, animated pill switcher, zero page reload
Multi-Rename
Batch rename with prefix, suffix, find/replace — live preview per file
🔍
File Search
Text search inside files, grouped by file — click to jump to the exact line
PHP 7.0+CodeMirror 5 Vanilla JSZero deps1 file BcryptZipArchiveDiff
// Choose your license — one-time payment, yours forever
Personal
One website you own
19one-time
  • 1 personal website
  • All features included
  • Lifetime access
  • Free future updates
POPULAR
Developer
Unlimited personal projects
49one-time
  • Unlimited own sites
  • All features included
  • Lifetime access
  • Free future updates
Agency
Client sites included
99one-time
  • Unlimited + client sites
  • All features included
  • Lifetime access
  • Free future updates
In the forge
More tools.
Same philosophy.
Security Scanner Cache Manager Task Scheduler Perf Monitor
security.php 1 file cache.php 1 file scheduler.php 1 file monitor.php 1 file
How I build

I build what you need.
From scratch. No shortcuts.

A full-stack developer who actually builds. No agencies, no middlemen, no templated output. If you can describe it precisely, I can build it — or I'll be honest if I cannot.

01 — Foundation
Entirely self-taught.
Starting from zero.

Over a decade of building — entirely self-taught, starting from zero, never using a shortcut I didn't understand first. From single landing pages to full e-commerce systems in CodeIgniter 4, every project gets the same level of care.

10+ years · self-taught
02 — Craft
I understand why things break.

I've rebuilt themes so completely they no longer resemble the original. I've debugged codebases others gave up on. I understand things break — and I build so they don't break again.

rebuilt · debugged · hardened
03 — Direct
Not an agency.
The person who writes the code.

You're not hiring an agency. You're talking directly to the person who writes the code. That changes the quality of the conversation, and the output.

direct · no middlemen
01 /
<html> <head> <body> <div> ... </html> LIVE
Software Service
Custom
Websites

Built from scratch or on top of your stack. Clean code, no page builders, no WordPress dependency. Exactly what you described.

HTML/CSS PHP CI4 MySQL
02 /
NULL 500 ERROR TRAPPED fix → 200 OK ✓ 🔒
Software Service
Site Repair & Rescue

Broken layouts, silent PHP errors, slow loading, outdated code, security holes —I find the root cause and rebuild it permanently fixed.

Debug Optimize Secure
03 /
BEFORE oldsite.com MY WEBSITE Click Here © 2009 All rights reserved AFTER tyrus.dk TYRUS GET STARTED © 2026 TYRUS · VAMDRUP
Software Service
Theme
Transformation

Total redesign of any existing theme. I've done it enough times that nothing of the original usually survives. That's the point.

CSS JS PHP hooks
04 /
MySQL CI4 API HTML/JS DEPLOY // layers Database · MySQL Backend · CI4 REST Frontend · HTML/JS // what ships E-commerce platform Booking system Internal tools / CMS Custom REST API
Software Service
Full-Stack
Project

A complete application from database architecture to the last pixel. E-commerce, booking, internal tools, custom CMS — anything that can be described precisely can be built precisely.

CI4 MySQL REST API JS Responsive
$ tyrus --process

Four steps. No exceptions. Every project, every time.

01
Understand
tyrus understand --client new
02
Architect
tyrus architect --no-shortcuts
03
Build
tyrus build --mode deliberate
04
Deliver
tyrus ship --honest
STEP 01 / 04 — UNDERSTAND
tyrus.dk

Some tools are installed. Others are simply placed — and they work. That is the only standard I build to.

Angel Tiru  ·  Founder, Tyrus  ·  Vamdrup, Denmark
The Builder

The Builder.
Ten years in. Still building.

My name is Angel Tiru, no courses, no mentors, under consistent financial pressure. What I know was built from nothing, tested in production, and refined by failure.

The name Tyrus comes from my family. The ancient city of Tyrus Tyrus was the engine of Mediterranean commerce — built on precision craft and earned trust. That is the standard I work to, not the one I claim.

In October 2025, I moved to Vamdrup, Denmark with my wife Claudia and our daughters Julie and Jessica. In February 2026, I officially founded Tyrus. Building under real pressure. Not stopping.

I don't build fast. I build correctly — and those two things are rarely the same.

Multilingual
One file. Upload it. Open it. It works. The complexity is inside — the experience is immediate.
🔬
Code Linter
112 PHP typo patterns. Cascading ZIP selection logic. Levenshtein-based CSS suggestions. Nothing here is approximate.
🏛
Direct contact. No ticket queues, no agencies, no bots. You know exactly who built it and why every decision was made.
>Direct contact. No ticket queues, no agencies, no bots. You know exactly who built it and why every decision was made.
🌍
VAT-compliant invoicing. Transparent, one-time pricing. No subscriptions, ever. I operate under Danish and EU law.
VAT-compliant invoicing. Transparent, one-time pricing. No subscriptions, ever. I operate under Danish and EU law.
Beyond the Code

Not just a developer.
A builder of things.

The obsession that shapes the code extends to everything else. The same patience that lets me read 8000 lines of PHP is the same patience that lets me identify a 2nd-century Roman coin by its patina.

⚔️
Crusader Kings III Mods
Published on Steam Workshop with thousands of active subscribers.

Game modifications for Crusader Kings III — complex event chains, new mechanics, rebalanced systems. Same logical precision as code, applied to medieval simulation.

View on Steam Workshop ↗
🎸
Classical Guitar
Fingerstyle · Self-arranged · Since Age 13

Guitar since 13. After a long break, fingerstyle on classical guitar captured me completely — now arranging pieces that have never been transcribed for solo guitar. The same stubbornness. Learning things no one else bothered to write down.

YouTube Channel ↗
🪙
Numismatics
Ancient & Medieval · Since Age 23

Identifying, photographing and documenting ancient coins, medieval pieces, banknotes and faleristics since age 23. Every piece gets complete detail regardless of value — because the history matters more than the price.

Visit cjagora.ro ↗
The Road

No degree. No mentor. No safety net. Just a trajectory that kept going — because stopping was never actually an option.
Every step counted.

No degree. No mentor. No safety net. Just a trajectory that kept going — because stopping was never actually an option.

On craft
“I never had the luxury of half-measures. When you build everything yourself, you either build it right — or you rebuild it.”
On tools
“The best tool is the one that disappears. You stop thinking about it — and just use it.”
On detail
“Some people are bothered by the obsession with detail. I consider that their problem, not mine.”
On family
“Everything I build is for Claudia, Julie and Jessica. That's not a slogan. That's the only reason this all matters.”
Age 10 – 11
Commerce before school taught it
Helping parents sell things — second-hand clothes, handmade items, CDs, whatever was needed. Work was never optional — it was simply how things were. That reality shaped everything that followed. Getting a second-hand Pentium II from my parents was the spark.
Age 13
First guitar. First code. Same year.
A cheap, nameless guitar sparked something that never stopped. Curiosity about IT started the same year. Two obsessions born from the same restless curiosity.
Age 22
First site — from scratch, not from a template
First attempt at a site — from scratch, not from a template. No WordPress. No shortcuts. From that point on I was set on being completely independent — no reliance on any CMS. The struggles that followed were worth it. Own CMS, own control, own logic. That has never changed on any project since.
Age 23
Numismatics as a craft, not just a hobby
A deep passion for history since childhood — so I didn't just sell, I collected, studied, photographed every detail. Complete documentation on every piece — whether it sold for €3 or €300. The history always mattered. Building a site around this passion came naturally — the two worlds were always intertwined.
Oct 2025
Denmark. New chapter.
Moved to Vamdrup, Denmark with Claudia, Julie and Jessica. We invested everything in this move — defining, deliberate, long considered. Romania never felt like home. This was the step we had been thinking about for years. New country, new beginning. Under real financial pressure — building anyway, because that is the only mode I have.
Feb 2026
Tyrus — officially founded.
Registered the company. Tyrus is now real — not just a name on a file. The brand I've been building toward for years, now with a foundation under it.
Let's Work Together
A product. A website.
Or something entirely new.

License PHP File Manager, commission a custom website, or bring me a problem worth solving. You'll talk to me directly — not a support queue, not an account manager. A real conversation.

View Software →
Response within 24h  ·  No obligation  ·  Vamdrup, Denmark  ·  EU