Tools Hub Reference Public

Module Research Notes

Evidence gathered from the current Tools Hub module files — controllers, models, configs, and migrations — before writing these user guide pages.

Guide version: r1 Module version: 1.2.0 Updated: 2026-07-30 Estimated time: 4 min
You are viewing version r1 of this guide. View the current version
Module Research Notes

Tools Hub

Evidence gathered from the current module files before writing the user guide pages.

Slug: toolsVersion: 1.2.0Category: ProductivityReviewed: 2026-07-11

Research Sources Inspected

Source path

modules/Tools

Feature flags marked true

  • Controllers
  • Models
  • Views
  • Language
  • Permissions
  • Left Menu
  • Routes
  • Migrations
  • Cron Jobs
  • Api Endpoints

Evidence Summary

Manifest

module.json defines slug tools, version 1.2.0, category Productivity, and the module capability flags used in this guide.

Runtime surface

6 controller file(s), 11 view file(s), and 25 route mapping(s) were found.

Data surface

10 model file(s), 8 declared table(s), and 9 migration file(s) were found.

Operations surface

5 permission key(s), 3 job(s), 0 seeder(s), and 2 test file(s) were found.

Detailed File Evidence

Controllers and methods

  • Tools - index, category, view, asset, track_view, like, comment, run, sitemap, result, og_image, result_og_image
  • Tools_admin - index, list_data, modal_form, save, sync, comments, comments_data, comment
  • Tools_api - index, categories, view
  • Tools_euapi - index, categories, view
  • Tools_sharelink - preview, save
  • Tools_shortlink - resolve, og_image, mint

Jobs and schedules

  • Purge expired short links (15 3 * * *) - Deletes expired short links (tool_shortlinks) minted by the URL Shortener / Pages share.
  • Purge expired Tools Hub results (0 3 * * *) - Deletes expired shareable result pages (tool_results) for the public Tools Hub.
  • Purge old Tools Hub usage logs (30 3 * * *) - Deletes Tools Hub usage logs (tool_logs) older than the retention window. Disabled by default.

Routes sampled

RouteTarget
toolsTools/index
tools/sitemap.xmlTools/sitemap
tools/category/(:any)Tools/category/$1
tools/likeTools/like
tools/commentTools/comment
tools/track-viewTools/track_view
tools/runTools/run
tools/url-shortener/mintTools_shortlink/mint
tools/sharable-link-generator/previewTools_sharelink/preview
tools/sharable-link-generator/saveTools_sharelink/save
s/(:any)/og-imageTools_shortlink/og_image/$1
s/(:any)Tools_shortlink/resolve/$1
tools/(:any)/result/(:any)/og-imageTools/result_og_image/$1/$2
tools/(:any)/result/(:any)Tools/result/$1/$2
tools/(:any)/og-imageTools/og_image/$1
tools/(:any)/asset/(:any)Tools/asset/$1/$2
tools/(:any)Tools/view/$1
admin/toolsTools_admin/index
admin/tools/list-dataTools_admin/list_data
admin/tools/modal-formTools_admin/modal_form
5 additional route(s) omitted for readability.

README topics

  • What it provides
  • Adding a new tool
  • Console commands
  • Database
  • Architecture notes

Operating Implications

  • Permission coverage is part of the module contract, so every workflow should be tested with a role-limited user and an administrator.
  • The module has migrations, so fresh installs and tenant databases need migration validation before go-live.
  • The module has API documentation or routes, so response examples and query filters should stay aligned with user-facing screens.
  • Scheduled jobs can change statuses, notifications, or summaries after users leave the screen; support should check cron status during troubleshooting.

Known Risks from the Manifest

  • The 8 tool_* tables are GLOBAL/public content and are pinned to the PRIMARY database by the Tool_* models (they explicitly open the 'default' connection). Module migrations still run per-tenant via migrate:modules, so empty copies may exist in tenant databases; they are unused - the canonical store is the primary DB.
  • Public POST endpoints (/tools/like, /tools/comment, /tools/run) require the native CodeIgniter CSRF token, which the public layout renders for AJAX. Anonymous likes/comments are deduped by a salted visitor hash and comments default to 'pending' for moderation.
  • tool_logs is a DELIBERATE usage audit trail and - unlike the privacy-safe analytics tables (tool_views/tool_likes store salted hashes only) - stores raw request context (session, IP, user, tenant) plus the submitted input and produced output. Treat its rows as sensitive. The input/output blobs are capped at 256 KB each (Tool_log_model::MAX_BLOB_BYTES). Growth is bounded by Tool_log_model::purge_older_than(); the PurgeOldToolLogsJob cron (DISABLED by default) enforces a 365-day retention when an operator opts in.
  • By design every GENUINE successful run is logged and counted (tools.run_count), so usage == runs with no per-visitor dedup - unlike the view counter (5-min throttle) and likes (toggle). A share/save re-run (POST /tools/run with save=1) is intentionally NOT recounted/relogged. This means run_count can in principle be inflated by repeated runs; the only ceilings are the global RateLimit middleware (60 req/min per IP) and the optional retention purge. 'Times used' is therefore an engagement metric, not an audited-unique count.

Report a content problem