-
Posts
106 -
Joined
-
Days Won
29
Everything posted by maximus
-
Late to the thread, but wanted to add a real-world data point. I run a spirits/wine catalog (~12,000 products) and a chocolate e-commerce store on ProcessWire. Both are in production and both have maintenance contracts attached. What I've found: the "update treadmill" problem simply doesn't exist with PW. Core updates are rare and painless. Module updates — same. That frees up retainer hours for things clients actually care about: new filters, catalog improvements, performance work. My maintenance plans now look like this: Backups + uptime monitoring (minimal time, easy to automate) A fixed block of hours for small improvements, content ops, or feature requests Reduced hourly rate for anything beyond that block The key insight for recurring revenue: clients with active e-commerce always have a backlog of small improvements. The retainer becomes a comfortable way for them to drain that backlog without opening a new project each time. For simpler marketing sites, the retainer is lighter but still justified by the "someone is watching this" peace of mind. SEO and analytics reporting also fit naturally into retainers — especially if you're running something like Plausible and can send a monthly digest.
-
The structure you want is actually slightly different from what Option #1 describes, but it's achievable. Option #1 assumes all sites share the same web root — the multi-site switching happens via index.config.php in that single root. Your setup (separate vhost docroots) requires a different approach. The cleanest way to do this with separate docroots: In each domain's docroot (/domaintwo/, /domainthree/, etc.) you only need: A symlink (or include-based) index.php that bootstraps from domainone's /wire A site/ directory with its own config.php, templates, modules The trick is the index.php in each secondary domain. Replace it with something like: <?php // /domaintwo/index.php $rootPath = '/var/www/html/domainone'; chdir($rootPath); require($rootPath . '/index.php'); And in each domain's site/config.php make sure $config->paths->root isn't hardcoded — ProcessWire resolves this dynamically, so it usually just works. You also need to copy (not symlink) .htaccess from domainone to each secondary docroot, since Apache serves it per-vhost. No index.config.php needed since routing is handled by vhosts at the server level — each domain already hits its own docroot. So the final structure: /domainone/wire/ ← shared core /domainone/site/ ← site 1 /domainone/index.php ← original /domainone/.htaccess /domaintwo/site/ ← site 2 (own db, templates, modules) /domaintwo/index.php ← bootstraps from domainone /domaintwo/.htaccess ← copy from domainone Each site/config.php points to its own database. Works cleanly without symlinks to /wire (which can cause issues with __DIR__ resolution in some PW internals).
-
AgeWire — Age Verification Module for ProcessWire
maximus replied to maximus's topic in Modules/Plugins
AgeWire has been updated — here's what's new since the original release. Multi-framework support The module now supports four CSS frameworks. You pick whichever one your project already uses: Vanilla CSS — fully self-contained, no dependencies, no CDN required Tailwind CSS — the original experience, 13 themes and 4 animations (unchanged) Bootstrap 5 — renders using native Bootstrap card, btn, form-control and alert classes UIkit 3 — renders using native UIkit card, button and grid components Each framework has an independent CDN toggle. If you already load Bootstrap or UIkit in your templates, just uncheck it and the module won't load anything extra. Security fixes CSRF token is now validated on every verification POST Fixed a bug where ProcessWire would render the full page HTML after the JSON response, causing JSON.parse errors in the browser. The AJAX handler now calls ob_clean() before sending JSON to discard any buffered output Strict date parsing with DateTime::createFromFormat — relative strings like "tomorrow" or "-18 years" are rejected Redirect URL validated to http://, https://, or site-relative paths only Custom CSS field sanitized against </style> injection JS console.log output is now gated behind $config->debug — no noise in production Admin UI The config page is now a two-column layout. General Settings and Framework & Theme are open side by side on first load. The rest (Modal Content, Date Picker, Agreement, Exclusions) are collapsed into logical groups — much less scrolling. PHP 8.2+ The module now requires PHP 8.2 and uses typed return types, match expressions, str_contains, str_starts_with, and unnamed catches throughout. GitHub: https://github.com/mxmsmnv/AgeWire Feedback and PRs welcome as always!- 1 reply
-
- 1
-
-
Rapid — EditorJS block editor fieldtype for ProcessWire
maximus replied to maximus's topic in Modules/Plugins
It looks amazing! So much work has been done and so much more is still to come... And then I'll want to make custom blocks and so on. Keep going, it's so exciting! -
Context Module - AI-Optimized Site Documentation with TOON Format
maximus replied to maximus's topic in Modules/Plugins
Context Module v1.4.0 - Pure UIkit Design System 🎨 Complete dashboard redesign following ProcessWire standards! What's Changed 100% UIkit Compliance Removed ALL custom CSS Removed ALL inline styles Pure UIkit components throughout ProcessWire CSS variables for theming Dashboard Components: Cards: uk-card-default / uk-card-primary Tables: uk-table uk-table-divider uk-table-small Labels: uk-label uk-label-success/danger/warning Alert: uk-alert uk-alert-success Buttons: Clean HTML with uk-button classes Visual Improvements: Templates/Fields/Pages: Light cards Success metrics: Brand color cards (green) Adaptive grid: 2 cols mobile, 3 tablet, 6 desktop Automatic light/dark theme switching UI Cleanup: Removed "NEW!" label Removed version footer Removed "Edit configuration" link Consistent spacing and typography Bugfix: Removed duplicate formatBytes() method Why This Matters: ✅ Matches ProcessWire admin design ✅ Automatic theme support ✅ Zero maintenance CSS ✅ Better accessibility ✅ Mobile-first responsive Install/Update: cd /site/modules/Context/ git pull Then: Modules → Refresh -
@szabesz TinyMCE support is on the list! CKEditor conversion was the first priority since it's still widely used, but TinyMCE is the logical next step given it's now the default RTE. I'll add it in an upcoming version. @Sergio Great suggestion! A /md/ URL segment or .md extension that returns the Markdown version directly would make the module much more useful for static site generators, AI pipelines, and content migration workflows. Added to the roadmap.
-
Rapid — EditorJS block editor fieldtype for ProcessWire
maximus replied to maximus's topic in Modules/Plugins
Thanks for the kind words and the thoughtful question! Just to clarify — Rapid is a ProcessWire fieldtype wrapper around EditorJS, the open-source block editor from the Codex team. The editor itself is their work — my contribution is the PW integration: field storage, server-side PHP renderers, upload handling, and the admin UI. Why I built it: I needed a press release submission system — companies fill in their details, write a press release, pay via Stripe, and it goes to moderation (similar to manufacturingdive.com). The site already used TinyMCE fields across many templates. Giving external users access to those fields was a security risk — one wrong permission and they could edit content site-wide. Creating a dedicated FieldtypeRapid field isolated the editor completely: external users write in their own field, the rest of the site is untouched. So the isolation and the clean JSON output were the primary drivers, not just "try a new editor." On your FieldtypeMulti question — I went with a single JSON column because block order needs to be preserved, EditorJS saves atomically, and I wanted to keep v1 simple. Per-block translation is a real limitation — if that matters to you, FieldtypeMulti might be the better foundation. Would love to see your original implementation if you revisit it. -
Hi guys, I've been working on a full EditorJS integration for ProcessWire and it's reached a point where I'd like to share it and get some testing feedback before calling it stable. GitHub: https://github.com/mxmsmnv/FieldtypeRapid This is a development preview. The core functionality works, but I'm looking for testers on different server configurations and ProcessWire setups before a stable release. Please report issues on GitHub. Why EditorJS instead of CKEditor or TinyMCE? CKEditor and TinyMCE are document editors — they produce a single blob of HTML. That HTML is hard to restructure, style consistently, or repurpose for different output targets (web, mobile, PDF, API). EditorJS is a block-based editor. Every paragraph, heading, image, and quote is a separate JSON object with a type and structured data. This means: Content is stored as clean JSON, not tangled HTML Each block type can be rendered differently per context Easy to add, reorder, or remove blocks without breaking surrounding content Output is fully controlled server-side via PHP renderers — no frontend JS required It's closer in concept to Notion or Gutenberg than to a traditional WYSIWYG. What Rapid does: 17 block types: paragraph, header (h1–h6 with auto anchor IDs), quote, nested lists, table, code, delimiter, warning, checklist, raw HTML, image (WebP convert + resize), file attachments, YouTube/Vimeo embed, alert (8 color variants), toggle/accordion, link preview with OG metadata Inline tools: bold, italic, underline, inline code, marker, link Template API: echo $page->body; // render all blocks echo $page->body->toText(); // plain text for meta/search echo $page->body->renderWith($renderer); // custom renderer 4 CSS frameworks — Vanilla, Tailwind, Bootstrap 5, UIkit 3 Frontend editing — inline editor on frontend for authorized users No build step needed — pre-built js/dist/editor.js included. Requirements: ProcessWire 3.0.200+, PHP 8.2+ Any feedback on installation, rendering edge cases, or block behaviour is welcome!
- 4 replies
-
- 10
-
-
-
At first, I couldn't get used to it either, and continued using the old one. But then at some point I got used to it and switched all my sites to the Konkat theme.
- 52 replies
-
- 3
-
-
Hello, A small utility I built for my own workflow — export any page directly from the editor as a clean Markdown file. Useful for documentation, content migration, and feeding page content to AI tools. GitHub: https://github.com/mxmsmnv/PageMarkdown What it does: Adds an Export to Markdown button to the page edit form Smart HTML conversion — CKEditor content (tables, lists, headings, links, bold/italic) → standard Markdown Supports ProFields: Table, Combo, Repeater Matrix (with type labels and nested structure) Images and files render as Markdown image/link syntax Page references render as links or titles MapMarker, Email, URL, Color fields all handled Configurable: toggle field labels as headings, ignore lists per field/type, datetime format, empty HTML cleanup Requirements: ProcessWire 3.0+, PHP 8.0+ MIT License.
-
45
-
Thank you Ryan. This was done largely to standardize components so that all modules being developed would look more or less the same, since artificial intelligence does a lot of hardcoding in its own style, which is annoying. Yes, during this development, I gave him the admin.css file, maybe even the folder - for him to process and build. It took several iterations to get this result. I'm still not satisfied, but I can already try using it in my work. For example, I created a beautiful black theme for the upcoming Collections module and other modules. One unified architectural style is much better than hundreds of different styles. Claude still gets confused, but I think this will happen less often. Yes, thank you. I think so, it would be better to create a repository to make changes. Should I make this a separate repository or include it as part of the Context module?
-
PlausibleAnalytics — Full-featured Plausible Analytics dashboard
maximus replied to maximus's topic in Modules/Plugins
Quick update — pushed v1.3.0 today. Added dark mode support (all colors follow AdminThemeUikit CSS variables automatically) and interactive filtering: click any row in Pages, Sources, Geography, Devices, or Browsers to filter all widgets at once. Active filters show as removable tags at the top of the dashboard and are stored in the URL. Thanks @bernhard GitHub: https://github.com/mxmsmnv/PlausibleAnalytics -
Guys, I don't know where to put this, so I'll post it here. Maybe someone will need the Uikit PW design system for use on your development. Attached file. Online here. AdminThemeUikit-DesignSystemUI.html
- 38 replies
-
- 12
-
-
-
Hi everyone, I needed a solid subscription module for a client project — something that handles multiple lists, double opt-in, and plugs cleanly into order and contact forms via a PHP API. Nothing in the directory quite fit, so I built Subscribe. It's been running in production on a few sites since March, so the edge cases are ironed out. GitHub: https://github.com/mxmsmnv/Subscribe What it does: Multiple subscription lists with many-to-many subscriber relationships Double opt-in with configurable HTML email ({confirm_url}, {unsub_url} placeholders) Honeypot spam protection — no CAPTCHA needed IP-based rate limiting (configurable threshold and time window) One-click unsubscribe with unique token per subscription WireMail provider selector — works with default, SMTP, Brevo, or any WireMail module Admin UI (Setup → Subscribers): Sidebar list switcher with subscriber counts Add/toggle/remove subscribers, create/rename/delete lists Search, status filter, pagination CSV import, JSON/CSV export per list Resend confirmation for pending subscribers PHP API — drop it into any template, order form, or contact form: $sub = $modules->get('Subscribe'); $sub->subscribe('user@example.com', $listId); Hookable event for integrations (Telegram notifications, CRM sync, etc.): $wire->addHookAfter('Subscribe::subscribed', function(HookEvent $event) { // $email, $listId, $subscriptionId }); Ships with an Alpine.js form block ready to drop into any template. Requirements: ProcessWire 3.x, PHP 8.0+ MIT License.
-
- 13
-
-
-
Context Module - AI-Optimized Site Documentation with TOON Format
maximus replied to maximus's topic in Modules/Plugins
Yes, it's documented in the README under "Best Practices → Session Continuity" section! I've also just improved the AGENTS.md file to make it more prominent with a clear example prompt. The docs now show: At end of each coding session, use this prompt: Update prompts/project-summary.md with current project state. Follow the existing format in the file: - Be concise and factual - Use bullet points - Update in place (don't overwrite history) - Remove any duplication Save the file. The template file itself also has the rules embedded, so AI sees them every time it updates. This is in v1.3.0 which I'm releasing shortly with CLI support for AI agents. -
Hi everyone, A small but practical module — manage your robots.txt directly from the ProcessWire admin, no FTP or SSH needed. GitHub: https://github.com/mxmsmnv/RobotsTxt What it does: Visual editor under Setup → Robots.txt with dark theme and monospace font Two-column layout — preset sidebar on the left, editor on the right 10 built-in rule presets — click any card to append rules to the editor: Allow all / Block all crawlers Hide admin panel (/processwire/) Block uploaded file assets Block AI training bots (GPTBot, CCBot, anthropic-ai, Google-Extended, FacebookBot, Omgilibot) Sitemap reference, Crawl-delay, Block query strings, Google only, Bing only Rules overview — parses the file after saving and renders a human-readable table with color-coded Allow/Disallow/Crawl-delay badges Status bar with file path, size, and last-modified date File locking (LOCK_EX) on write, CSRF protection, role-based access via robots-manager permission Automatic path detection via $config->paths->root Requirements: ProcessWire 3.0.200+, PHP 8.2+ Screenshot: MIT License.
- 1 reply
-
- 9
-
-
-
PlausibleAnalytics — Full-featured Plausible Analytics dashboard
maximus replied to maximus's topic in Modules/Plugins
Yes, I understand what you're talking about. There is no interactivity in the module, only dry data for the period. I think I'll think about it in the next versions. -
Context Module - AI-Optimized Site Documentation with TOON Format
maximus replied to maximus's topic in Modules/Plugins
Quick bump to 1.2.0: Fixed: Hardcoded Export Paths All /site/assets/context/ paths in prompt templates now use dynamic export_path Works correctly with custom paths like /home/user/context-exports/ Affects: project-context.md, create-template.md, create-api.md Prompts Description Clarity Changed wording to clarify these are templates for manual use "Prompt templates for manual LLM/agent use (not auto-loaded by agents)" Prevents AI agents from mistakenly treating them as project data Added: "Go to Module's Settings" Button Quick access button on dashboard next to "Re-Export" No more hunting through admin menus! Changed Project Summary Preservation project-summary.md no longer overwritten on re-export Preserves your session history and changes Only created on first export Thanks @szabesz and @psy for the excellent feedback! -
Hi everyone, I've built a module that integrates Plausible Analytics directly into the admin — with a full dashboard, charts, and a per-page stats widget on the edit screen. GitHub: https://github.com/mxmsmnv/PlausibleAnalytics What it does: Dashboard under Setup → Analytics with summary cards (Visitors, Pageviews, Bounce Rate, Visit Duration) Traffic trends chart + Top Pages bar chart + Traffic Sources donut chart Tabbed breakdown: Geography, Devices, Browsers Per-page widget on the page-edit screen — shows last 30 days stats inline Period selector: Today / 7d / 30d / 6m / 12m API response caching via LazyCron (configurable interval) Self-hosted Plausible support via custom base URL Chart.js vendored locally — no external CDN dependency Role-based access via plausible-view permission Screenshots: Page-edit widget: Built on Stats API v2 (POST /api/v2/query). The module handles all v2 quirks internally — event vs session metrics split, correct date_range values, visit:entry_page filter for per-page session stats. Happy to answer questions. Bug reports and PRs welcome!
- 5 replies
-
- 12
-
-
-
Context Module - AI-Optimized Site Documentation with TOON Format
maximus replied to maximus's topic in Modules/Plugins
It's always great to hear feedback, it makes modules a must-have for every developer! -
Context Module - AI-Optimized Site Documentation with TOON Format
maximus replied to maximus's topic in Modules/Plugins
Context Module v1.1.9 Released! 🎉 Quick update with two improvements based on your feedback: Fixed Cline Skill Name Compatibility (reported by @szabesz) Changed SKILL.md name: from ProcessWire Context - example.com to context Cline requires exact folder name match to activate skills Now works out-of-the-box when exported to .agents/skills/context/ Improved Better Project Summary Template (improved by @psy) Rules now embedded directly in the file (AI sees them every update) "Update in place" mode instead of overwrite (preserves history) Boundary protection: #### DO NOT UPDATE ABOVE THIS LINE #### Auto-removes duplication More concise and actionable format What this means: More reliable session continuity with AI agents AI won't accidentally modify template structure Cleaner, focused checkpoint summaries Download: GitHub Thanks @szabesz for the testing and @psy for the improved template! -
Context Module - AI-Optimized Site Documentation with TOON Format
maximus replied to maximus's topic in Modules/Plugins
Context Module v1.1.8 Released! Thanks everyone for the great feedback! Here's what's new: New Features SKILL.md Auto-Generation (requested by @szabesz) Automatically generates SKILL.md for AI coding agents (Cline, Junie, etc.) Lists all exported files with descriptions and usage examples Follows Cline/MCP skill format specification Enable/disable in module settings (enabled by default) Project Summary Template (suggested by @psy) Auto-creates prompts/project-summary.md template Helps AI agents maintain context between coding sessions Structured format: project state, decisions, issues, next steps Ask AI to update at end of each session for seamless continuity Setup for AI Agents: Cline (PHPStorm/VSCode): Set export path to .agents/skills/context/ Junie (PHPStorm): Set export path to .junie/skills/docs/ Re-export and SKILL.md + project-summary.md are auto-created Bug Fixes FieldtypeQRCode Compatibility (reported by @psy) Fixed error when exporting field definitions for FieldtypeQRCode Added method_exists() check before calling getModuleInfo() Now works with all fieldtypes using .info.php pattern Documentation Added Best Practices section to README covering: AI coding agents setup (Cline, Junie) Session continuity workflow File upload strategies for optimal token usage Download: GitHub Thanks @szabesz and @psy for the excellent suggestions!