Module Research Notes
Evidence gathered from the current module files before writing the user guide pages.
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_imageTools_admin- index, list_data, modal_form, save, sync, comments, comments_data, commentTools_api- index, categories, viewTools_euapi- index, categories, viewTools_sharelink- preview, saveTools_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
| Route | Target |
|---|---|
tools | Tools/index |
tools/sitemap.xml | Tools/sitemap |
tools/category/(:any) | Tools/category/$1 |
tools/like | Tools/like |
tools/comment | Tools/comment |
tools/track-view | Tools/track_view |
tools/run | Tools/run |
tools/url-shortener/mint | Tools_shortlink/mint |
tools/sharable-link-generator/preview | Tools_sharelink/preview |
tools/sharable-link-generator/save | Tools_sharelink/save |
s/(:any)/og-image | Tools_shortlink/og_image/$1 |
s/(:any) | Tools_shortlink/resolve/$1 |
tools/(:any)/result/(:any)/og-image | Tools/result_og_image/$1/$2 |
tools/(:any)/result/(:any) | Tools/result/$1/$2 |
tools/(:any)/og-image | Tools/og_image/$1 |
tools/(:any)/asset/(:any) | Tools/asset/$1/$2 |
tools/(:any) | Tools/view/$1 |
admin/tools | Tools_admin/index |
admin/tools/list-data | Tools_admin/list_data |
admin/tools/modal-form | Tools_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.