Toolvana: production-ready media tools platform (CodeIgniter 4)

- 134-tool registry with programmatic SEO (unique titles/H1/descriptions,
  JSON-LD graphs, sitemap index, canonical 301 enforcement via required filter)
- DB-backed job queue (SKIP LOCKED) with drivers: Ffmpeg, Images (GD),
  Pdf (qpdf/gs/poppler), Youtube (thumbnails), Qr (server-side PNG)
- Security: SSRF guard, MIME validation, rate limits, API-key auth,
  bcrypt admin login, security headers
- Admin panel: dashboard, tools/categories/guides CRUD, SEO audit,
  analytics, job inspector with retry, system health, feature flags
- Docker deployment (nginx + web/api FPM pools + scalable workers),
  PHPUnit suite (19 tests / 1139 assertions), PWA manifest + service worker
This commit is contained in:
deepseek
2026-08-23 07:10:30 +00:00
commit beaf0e1f37
217 changed files with 19619 additions and 0 deletions
+87
View File
@@ -0,0 +1,87 @@
<!doctype html>
<html lang="<?= esc(service('request')->getLocale()) ?>">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?= $seo->renderTitle() ?></title>
<meta name="description" content="">
<?= $seo->renderHead() ?>
<link rel="stylesheet" href="/assets/css/app.css">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="manifest" href="/manifest.webmanifest">
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="<?= esc(config('Site')->name) ?>">
<script type="application/ld+json"><?= $seo->renderJsonLd() ?></script>
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<header class="site-header">
<div class="inner">
<a class="logo" href="/">
<span class="logo-mark" aria-hidden="true"><?= icon('layers') ?></span>
<span><?= esc(config('Site')->name) ?></span>
</a>
<button class="nav-toggle" id="nav-toggle" aria-expanded="false" aria-controls="main-nav" aria-label="Open menu"><?= icon('menu') ?></button>
<nav class="main-nav" id="main-nav" aria-label="Main navigation">
<?php foreach (service('finder')->categories() as $c): ?>
<a href="/<?= esc($c['slug']) ?>"><?= esc($c['name']) ?></a>
<?php endforeach ?>
<a href="/blog">Guides</a>
<a href="/tools">All Tools</a>
</nav>
</div>
</header>
<main id="main">
<?= $viewContent ?? '' ?>
</main>
<footer class="site-footer">
<div class="wrap footer-cols">
<div>
<a class="logo" href="/" style="margin-bottom:.6rem">
<span class="logo-mark" aria-hidden="true"><?= icon('layers') ?></span>
<span><?= esc(config('Site')->name) ?></span>
</a>
<p style="color:var(--ink-500);max-width:34ch;margin-top:.6rem"><?= esc(config('Site')->tagline) ?> <?= esc(config('Site')->description) ?></p>
</div>
<div>
<h4>Categories</h4>
<ul>
<?php foreach (service('finder')->categories() as $c): ?>
<li><a href="/<?= esc($c['slug']) ?>"><?= esc($c['name']) ?></a></li>
<?php endforeach ?>
</ul>
</div>
<div>
<h4>Popular</h4>
<ul>
<li><a href="/youtube-to-mp3">YouTube to MP3</a></li>
<li><a href="/video-compressor">Video Compressor</a></li>
<li><a href="/jpg-to-png">JPG to PNG</a></li>
<li><a href="/pdf-merger">PDF Merger</a></li>
</ul>
</div>
<div>
<h4>About</h4>
<ul>
<li><a href="/blog">Guides</a></li>
<li><a href="/privacy">Privacy Policy</a></li>
<li><a href="/terms">Terms of Service</a></li>
<li><a href="/dmca">DMCA / Copyright</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</div>
</div>
<div class="wrap footer-bottom">
<span>© <?= date('Y') ?> <?= esc(config('Site')->name) ?>. All rights reserved.</span>
<span>Files are processed temporarily and deleted automatically.</span>
</div>
</footer>
<script src="/assets/js/app.js" defer></script>
<?php if (! empty($pageScript)): ?>
<script src="/assets/js/<?= esc($pageScript) ?>.js" defer></script>
<?php endif ?>
</body>
</html>