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
+13
View File
@@ -0,0 +1,13 @@
<div class="wrap">
<article class="prose" style="margin-top:2.5rem">
<h1>Contact</h1>
<p>Reach us at <strong>hello@example.com</strong> replace with your production inbox before launch. Typical response time is two business days.</p>
<h3>Common topics</h3>
<ul>
<li><strong>Abuse reports</strong> include URLs and timestamps.</li>
<li><strong>DMCA / copyright</strong> see the <a href="/dmca">DMCA policy</a> for notice requirements.</li>
<li><strong>API access</strong> tell us your expected volume.</li>
<li><strong>Bug reports</strong> the tool page URL plus what you expected vs. saw helps enormously.</li>
</ul>
</article>
</div>
+12
View File
@@ -0,0 +1,12 @@
<div class="wrap">
<article class="prose" style="margin-top:2.5rem">
<h1>Cookie Policy</h1>
<p><em>Last updated: <?= date('F Y') ?></em></p>
<p><?= esc(config('Site')->name) ?> sets exactly one cookie:</p>
<table>
<tr><th>Name</th><th>Purpose</th><th>Lifetime</th></tr>
<tr><td><code>tv_session</code></td><td>Links your uploaded file to its processing job so you can download results. Contains no personal data.</td><td>Session (deleted when you close the browser)</td></tr>
</table>
<p>No analytics cookies, advertising cookies, or third-party trackers are used. Because the only cookie is strictly functional, no consent banner is required.</p>
</article>
</div>
+18
View File
@@ -0,0 +1,18 @@
<div class="wrap">
<article class="prose" style="margin-top:2.5rem">
<h1>DMCA &amp; Copyright Policy</h1>
<p><?= esc(config('Site')->name) ?> respects intellectual property rights. We respond promptly to valid notices under the DMCA and comparable laws.</p>
<h2>Filing a notice</h2>
<p>Send takedown requests through the <a href="/contact">contact page</a>, including:</p>
<ol class="steps" style="list-style:none;counter-reset:none">
<li style="--x:0"><strong>Identification</strong>of the copyrighted work you believe is infringed.</li>
<li><strong>The URL</strong> on our site allegedly hosting infringing material.</li>
<li><strong>Your contact details</strong> and a good-faith statement of authority.</li>
</ol>
<p>Valid notices are actioned within two business days.</p>
<h2>Design of this service</h2>
<p>This platform does not host a public library of user files: uploads are private to the uploading session and expire automatically. Tools that interact with third-party platforms are designed around applicable platform terms and can be disabled by operators.</p>
</article>
</div>
+31
View File
@@ -0,0 +1,31 @@
<div class="wrap">
<article class="prose" style="margin-top:2.5rem">
<h1>Privacy Policy</h1>
<p><em>Last updated: <?= date('F Y') ?></em></p>
<p><?= esc(config('Site')->name) ?> is built to need as little of your data as possible. This page explains exactly what is stored and what is not.</p>
<h2>Files you process</h2>
<ul>
<li>Uploads and generated results live in <strong>temporary storage</strong> only for processing.</li>
<li>They are deleted automatically after a short retention window (two hours by default), or sooner once you download them and the job expires.</li>
<li>Files are stored under random UUID names, outside the web root, and never shared with other users or third parties.</li>
</ul>
<h2>What we log</h2>
<ul>
<li><strong>Anonymous usage events</strong>: which tools are viewed and used, output formats chosen, success/failure counts. Session and IP values are one-way salted hashes — we cannot reverse them to identify anyone.</li>
<li><strong>Search terms</strong>, in aggregate, to find missing tools.</li>
<li>No advertising cookies, no cross-site trackers, no fingerprinting scripts.</li>
</ul>
<h2>Cookies</h2>
<p>One functional session cookie keeps your upload/result association while you use a tool (see the <a href="/cookies">cookie policy</a>). No consent banner is needed because no tracking cookies exist.</p>
<h2>Third-party requests</h2>
<p>YouTube metadata lookups query YouTube's public oEmbed endpoint with your pasted URL. Thumbnail downloads fetch directly from Google's image CDN. Nothing else about you is sent anywhere.</p>
<h2>Data removal</h2>
<p>Because files expire quickly and logs are anonymous hashes, there is generally nothing to delete. For any question, use the <a href="/contact">contact page</a>.</p>
</article>
</div>
+27
View File
@@ -0,0 +1,27 @@
<div class="wrap">
<article class="prose" style="margin-top:2.5rem">
<h1>Terms of Service</h1>
<p><em>Last updated: <?= date('F Y') ?></em></p>
<h2>Acceptable use</h2>
<p><?= esc(config('Site')->name) ?> provides media utilities. You agree to use them only for content you own or are permitted to process, and never to:</p>
<ul>
<li>circumvent DRM or technical protection measures;</li>
<li>access private or paid content without authorization;</li>
<li>infringe copyright or other rights of third parties;</li>
<li>upload malware or attempt to abuse the infrastructure.</li>
</ul>
<h2>Third-party platforms</h2>
<p>For platforms such as YouTube, downloading capability is provided for your own uploads and properly licensed material. You are responsible for complying with that platform's terms and applicable law. Features may be disabled by operators where required.</p>
<h2>No warranty</h2>
<p>Services are provided "as is" without warranties of any kind. Processing results depend on input quality; always keep originals of important files.</p>
<h2>Rate limits</h2>
<p>To keep the service fast for everyone, fair-use limits apply per IP address and session. Automated access requires an API token with its own quota.</p>
<h2>Contact</h2>
<p>Questions about these terms: see the <a href="/contact">contact page</a>.</p>
</article>
</div>