✦ 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 — A. Angel Țîru. Custom websites, fixes, audits. No WordPress. No templates. Available for hire. Single-file tools with no package-manager setup or third-party runtime CDN, plus custom websites built to last. 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+ Editor modes
CodeMirror 5
PHP, JS, CSS, SQL
Python, Lua, YAML
203 filename/content mappings
📄
0 File. Full IDE.
PHP File Manager
1.13 MB · 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.php1.13 MB
🎨style.css18.3kB
zip-browser.js9.7kB
↑ upload file (or drag & drop)
tyrus.dk  /  PHP File Manager v1.0.1
🌐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'];
    }
}
Linter118 PHP typo checks
Single fileNo runtime CDN
203 verified mappingsCodeMirror 5
PHP File Managerv1.0.1
CodeMirror 5Full IDE
203
203 verified mappingsSyntax highlight
PHP & CSS & JS118 PHP typo checks
ZIP BrowserDrag & Drop
IP BanBrute-force lockout
ENRODK
EN / RO / DK UIZero Reload
Full-stack PHP & JSFull-Stack
CK3 WorkshopSteam Mods
Classical GuitarFingerstyle
Ancient CoinsMedieval Numismatics
1
Single PHP FileNo package installs
Side-by-side Diff.bak backup
Mobile · DrawerHaptics
VamdrupDenmark · EU
PHP File Managerv1.0.1
CodeMirror 5Full IDE
203
203 verified mappingsSyntax highlight
PHP & CSS & JS118 PHP typo checks
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 FileNo package installs
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 8.0+
PHP File Manager
by Tyrus Angel  ·  v1.0.1

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 editor with Dracula theme, autocomplete and 203 verified filename-to-mode mappings
  • 118 PHP function-typo checks, CSS property validation and JS bracket checks, with inline markers
  • Visual diff against .bak — the previous version is backed up automatically on every save, using the selected backup location.
  • ZIP browser with expandable tree, cascading selection, drag & drop extraction to any folder.
  • Repeated failed logins trigger a 15-minute IP lockout with a dedicated blocked-access screen.
  • Complete EN / RO / DK interface; 416 UI keys per language, animated switcher and language changes without page reloads
  • 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
118 PHP function-typo checks, CSS property validation and 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 authentication, 15-minute IP lockout after repeated failures, 30-minute session timeout and activity logging
📱
Mobile
Slide-out drawer, long-press context menu, haptic feedback on mobile
🌐
Multilingual
Complete EN / RO / DK interface; 416 UI keys per language, animated switcher and language changes without page reloads
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 8.0+CodeMirror 5 Vanilla JSNo Composer/npmNo runtime CDN1 file BcryptZipArchiveDiff
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 projects are built

Built around what you need.
From scratch. No shortcuts.

Independent full-stack development with no agency layer, no middlemen and no templated output. A precise brief gets a precise technical answer, including when a request is not realistic.

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

Over a decade of hands-on development — entirely self-taught, starting from zero, with every shortcut understood before it is used. 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
Root causes, not surface symptoms.

Themes can be rebuilt beyond recognition of the original, and abandoned codebases can be debugged to the root cause. The focus stays on why a system fails and on rebuilding it so the same failure does not return.

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 —Root cause identified then rebuilt for a durable fix.

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. The transformation can go far enough that almost nothing of the original remains. That is 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.

A. Angel Țîru  ·  Founder, Tyrus  ·  Vamdrup, Denmark
The Builder

The Builder.
Ten years in. Still building.

My name is A. Angel Țîru, 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
118 PHP function-typo checks. Cascading ZIP selection. Levenshtein-based CSS suggestions. Every published number maps to tested behavior.
🏛
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.
Project Enquiries
A product. A website.
Or something entirely new.

License PHP File Manager, commission a custom website, or present a problem worth solving. Communication is directly with the developer — no support queue and no account manager.

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