Leaderboard
Popular Content
Showing content with the highest reputation since 05/10/2026 in Posts
-
This week on the dev branch we have around 35 commits that cover mostly minor bug fixes. Most of them were submitted by @adrian and several others were found by Claude and GPT 5.5 Codex using the WireTests framework. Claude and Codex seem to work well together, each having different strengths, and they are always complimenting one another. Codex seems to be more accurate with the technical stuff, so is reviewing everything before it gets committed, often finding and fixing details along the way. Claude usually writes better commit messages, so Claude is handling most of the commits. A couple new API.md files were added this week also: WireCache ($cache) and WireMail ($mail). We're getting close to having all the API variables covered, and all the Fieldtype modules have already been covered. Some new tests were added and updated in the WireTests module as well. WireTests has also been updated with the ability to support external tests. This enables you to specify a different directory or php file to run for tests, rather than the default. This will come in handy as we start moving the test files into the core. But the majority of this week was actually spent setting up a new computer. I got a M5 Macbook Air to replace my 2017 iMac, and it's taken most of the week to get things setup the way I want, and I'm still working on the details. It's been so long since I've had a new computer that I forgot how much work it is to get things just right. π Thanks for reading and have a great weekend!21 points
-
Hi everyone, Every site I've launched eventually had a database incident β corrupted table, failed migration, bad deploy. Having a reliable backup system that runs automatically and stores offsite is non-negotiable. This module is what I use in production. GitHub: https://github.com/mxmsmnv/ProcessDbBackup What it does: Three independent backup types β Regular, Weekly, Monthly β each with its own LazyCron schedule and retention count Admin home widget β shows status (π’ OK / π‘ Outdated / π΄ No backups) per type with "Create now" buttons Backblaze B2 upload β optional offsite storage after every backup, keep or delete local copy Chunked upload β upload .sql.gz from your computer in 2MB chunks, bypasses upload_max_filesize entirely Streaming restore β reads .gz line-by-line, flat memory usage regardless of dump size Partial restore β select individual tables from a backup Pre-restore auto-backup β safety backup of current DB before any restore Backup integrity verification β gzip check + SQL structure validation Lock file β prevents concurrent backup processes Exclude tables β skip cache, sessions etc. from all backups Storage protected with .htaccess deny-all Backup methods: mysqldump (preferred, InnoDB-safe hot backup) with PHP PDO fallback. Restore via mysql CLI with PHP PDO streaming fallback. Requirements: ProcessWire 3.0+, PHP 8.0+, zlib, PDO. mysqldump/mysql CLI optional but recommended for large databases. MIT License.13 points
-
Hi all, a small confession from the frameless corner of the PW universe: in the last 15 years we've spent way too many evenings doing the same FTP-shuffle on shared hosting. Delete everything in site/, drop the DB via phpMyAdmin, re-upload, run install.php, log back in, find out the bug we were chasing only reproduces after a reset, sigh, repeat. The reason we do this on real hosting at all is that the gnarly bugs in modules-under-development never show up locally β AllowOverride, mixed file ownership, mod_security, you know the drill. But "let's test cleanly on the real server" and "no SSH access" don't combine well. So we built ProcessWireReset: a module that wipes a PW install back to clean profile state from inside the admin. No SSH, no FTP, no phpMyAdmin. Click the button, log back in, you're at a freshly installed PW with your superuser intact and any modules you marked as keep re-installed automatically. A few things worth knowing, since destructive modules deserve some care: Modules to keep + Directories to keep. Two fields in the config: one picks which modules survive (transitive dependencies included), the other is a free-form list of paths under site/ that should be spared by the cleanup β handy for things like templates/RockIcons or assets/backups that live outside the module directories. Custom tables go into a snapshot. After the reset you can pick which module-specific tables to restore. Auto-restoring everything turned out to fight with re-installed schemas more often than we liked. The reset can crash mid-way β a kept module's install() can fatal in surprising ways. The confirmation modal hands you a one-time recovery URL with a 256-bit token. If the worst happens, that URL gives you a clean reinstall with your original credentials. Belt, braces, and one extra strap. It's interactive only. No cron triggers, no CI hooks. The destructive button has a real human in front of it, on purpose. Pairs nicely with GitSync: If you're already using our GitSync module, ProcessWireReset is the missing other half. GitSync pulls a fresh module version from your GitHub repo into the live install at the click of a button β but it doesn't touch the DB or re-run install(). After a GitSync pull that changed schemas, fields, or admin pages, the previous install state and the new code drift apart. Hit Reset, the module is removed and re-installed cleanly from the freshly pulled code, and you're testing what you actually shipped instead of a frankenstein of old DB state and new files. That GitSync β Reset β test loop is what we use daily on shared-hosting test installs where SSH isn't an option. Repo (MIT): https://github.com/frameless-at/ProcessWireReset Modules Directory: https://processwire.com/modules/process-wire-reset Caveat the obvious: this thing is for development, not for production. Treat it accordingly. Curious to hear what you build/break with it. Bug reports and pull requests welcome. Cheers, Mike7 points
-
Hey everyone I'm pleased to report that MediaHub 1.16.0 has been released. Here's a breakdown of the changes. The next release will optimise bulk upload and crops. I will also add integrated focus points cropping. 1.16.0 Changelog Admin navigation Optional MediaHub link in the admin top bar. A new module setting (Show MediaHub link in main navigation) adds Media Hub to the admin top bar. Custom label for the top-bar link. When the top-nav option is on, a new Custom label field lets you override what appears in the top bar. Useful when the localised "Media Hub" string is verbose or when your team prefers a different term (Media, Assets, Library, DAM). Leave blank to keep the localised default. Setup β Media Hub label is unaffected. Library and inputfield Drag-to-reorder thumbnails in MediaHub fields. Just like the native InputField, you can reorder thumbnails to take advantage of first() and last() etc. Works across any view mode (grid, proportional, detail). Master "select all visible" checkbox in the table view header. Tick the column header to select every row currently rendered; untick to clear. "Add more" button now matches stock InputfieldFile Font, colour, hover state, and icon spacing across AdminThemeUikit, Reno, and Default are more consistent Bug fixes Library search now covers Alt/Description, Labels, and Collections. Previously search only matched the asset title and filename. Searching by exact ID is also now reliable. Renamed filename and title in the upload queue are now applied on upload. Editing the filename stem or title in the upload queue rows had no effect; the values were not transmitted to the server. Both fields are now picked up and saved with the new asset. Duplicating an asset preserves its Collections and Labels. Cloned assets were losing the page-reference fields. Both are now copied explicitly to the new asset. The duplicate confirmation message also clarifies that crops are not copied (they can be re-generated on the duplicate). Cleaned up a stray PHP warning in the library view left over from the v1.15.0 Tags β Labels rename. PHP 8.5 deprecation notice in the MediaHub inputfield resolved (explicit nullable parameter typing). Defensive changes Server-side upload batch limit now matches the configured browser-side limit. Previously the server hard-capped to 50 files per request even if Maximum upload batch had been raised higher; both ends now read the same setting. Bulk-import requests are now capped at 500 selections per request. Selecting thousands of existing site images at once was holding a single PHP request open for many minutes with no progress feedback and no resume path on failure. Larger jobs now surface a clear message asking you to import in batches. Upload temp-file cleanup window extended from 60 seconds to 5 minutes, to avoid deleting an in-flight temp file mid-write on slow connections. Container pages at the site root reinforced as hidden + system on upgrade, so the data-tree containers (Media Hub, Labels, Collections, Assets, Crops) cannot accidentally appear in front-end navigation. Security Import-by-URL is now safer on shared and self-hosted servers. Imports from external URLs are now hard-capped at 5 MB per file and refuse URLs that resolve to private or reserved IP ranges (mitigating server-side request forgery), and reject any non-HTTP(S) protocol on the initial request and on any redirect. Cheers Peter6 points
-
NativeAnalytics v1.0.19 β update This release mainly focuses on privacy/consent handling and admin UI polishing. Added / improved: Added optional cookie-less visitor/session mode for sites that want to avoid browser visitor/session cookies. Added PrivacyWire localStorage consent helper support. Added helper methods for custom consent integrations: window.PWNA.trackIfConsented() window.PWNA.setConsent() window.PWNA.clearConsent() window.PWNA.syncPrivacyWireConsent() Improved consent-based tracking flow, so tracking can start correctly after consent is granted. Tracking-related settings are now hidden/disabled when global tracking is turned off, to avoid confusing combinations like βtracking off + event tracking onβ. Added a module settings shortcut button in the analytics dashboard header. Improved AdminTheme compatibility and tab spacing across ProcessWire admin themes. Polished the flat admin UI and removed rounded corners. Fixed panel alignment issues in dashboard grid layouts, especially where side-by-side panels appeared vertically offset. Note: Multi-site analytics is not included yet. It is planned as a possible future improvement because it needs proper per-site separation in stored analytics data. Download is updated in first post!5 points
-
Hi Mikel and SEO specialist Thanks for taking so much time to list your thoughts. I completely agree, and it's a testament to both SEO Modules and ProcessWire itself that they have worked together for so long. I hope my original post doesn't come across as a criticism of either Module or the developers. Life moves on, and understandably, the developers have new priorities. Yes, agree too. And I don't intend to recreate existing Modules simply for the sake of it. But I also want SEO Neo to rely on other modules as little as possible. So it's likely that SEO Neo will act as an umbrella/coordinating layer for companion Modules. All working together. It's an ambitious task, but I would prefer to build from the ground up with modular components (sub-modules) that can work together rather than end up with a Module which relies on various "3rd party" modules. I realise this somewhat contradicts my earlier statement. But to answer your specific points: SEO health (missing descriptions, duplicate titles, noindex flags) as a Lister-based audit view β this genuinely doesn't exist in the ecosystem yet Yes, this is on the roadmap and has been on my mind for some time. The module should have an SEO health dashboard that can display the basic rolled-up audit of your site. I use SEM Rush extensively (alongside several other SEO tools). SEO Neo won't try to replace them, but will surface critical issues within PW itself. I see this as a big benefit to SEO specialists, developers and editors, even if it serves as a launch pad for deeper investigation via more powerful SEO tools. 404 hotspots from the logger with a "create redirect" action wired into ProcessRedirects Yes, this is being developed currently with a focus on 404 logging. AI crawler activity from Wire Request Blocker Have added to the roadmap. SeoMaestro field status across templates SEO Neo will have a field status overview if that's what you mean? It won't report on other SEO modules' gaps. Native urlSegments support β as psy mentioned earlier in the thread, currently needs a hook in SeoMaestro urlSegments is done and working since my last post. I am stress testing on a larger site shortly. Canonical, og:url, twitter:url and hreflang all preserve $input->urlSegmentStr() natively. I also have a config setting for sites that want segments collapsed instead. The hook needed for SeoMaestro isn't required in SEO Neo. Yoast-style content analysis with traffic-light scoring β tends to produce text optimized for the algorithm rather than the reader. I am keen for SEO Neo not to become a Yoast copy. Schema.org helpers with documented hooks β ready-made generators for the common types (Article, FAQPage, Person, Organization, BreadcrumbList) that developers can call from templates. Not auto-detection (that doesn't work without explicit mapping), but a clean API. Noted. Finally, the rollout of SEO Neo's core module and individual components will likely be phases. The Neo in SEO Neo is more a nod to a new approach rather than Nearly Everything at Once. P5 points
-
Hi everyone SEO NEO is ready if anyone is available for early testing. I have been testing on a fictional purpose-built site to stress-test multilingual content, URL segments and a heap more. If you'd like to try it on your next real PW build, please DM me, and then we'll work quickly towards the general release and availability via PW modules and GitHub. Cheers, and have a great weekend π P4 points
-
AgentTools updates (v12) New AgentTools Page Engineer Fieldtype: provides a page editing assistant with the ability to make page edits like writing or summarizing text, importing data from external sources, generating image descriptions, managing child pages, and more. To use it, create a new PageEngineer field, add to a template and edit a page. You get an in-page assistant where you can ask for page editing help. The PageEngineer comes with full knowledge and expertise of your entire site, built in. Also new to AgentTools this week is an upgrade to the migrations system. Now you can copy/paste migrations between dev and production sites. Just check the box next to one or more migrations and click export. Transferred migrations are encrypted with unique salt values from your /site/config.php file. So for security, it's not possible for import a migration that wasn't generated by AgentTools. Lastly, AgentTools also gained a "tattletale" feature. When enabled, if you ask the agent to do something that could compromise security or is otherwise suspicious, it triggers a special tool in AgentTools that blocks the user from making further requests for an hour. It also emails you (the admin) to let you know what specifically the agent found suspicious. Core updates (3.0.261) ProcessWire 3.0.261 is on the dev branch this week and continues with our reorganization of core classes for documentation purposes. New API.md documentation files were added for: $session, $config, $files, $database, $input, $sanitizer, and PagesRaw ($pages->raw). Because most classes are getting their own directories and API.md files, I'm thinking that the WireTests module might be merged into the core, and classes and modules will come with their own tests file (i.e. Class.tests.php and ModuleName.tests.php). It just seems to make sense that tests live alongside the class they test, so that they can be easily updated with the class. All of this core recorganization is leading towards ProcessWire 4.x. LazyCron was updated with CLI support for running jobs (with option to disable http running), and $modules was updated to now have its own CLI tools (visible when typing "php index.php"). Many more API variables will be getting their own CLI tools as well. I'm now using both Claude Sonnet 4.6 and GPT 5.5 Codex to do code reviews and write API.md documentation for the core. I find they each have their upsides so am trying to put them both to good use as much as possible. This week GPT 5.5 covered several core classes, and the entire /wire/core/Pages/ set of classes. For more details on this week's updates see the full commit log here. New versions of the following ProFields have also been released this week: FieldtypeTable, FieldtypeCombo, FieldtypeCustom and FieldtypeRepeaterMatrix. In addition to new features and fixes, these all have gone through AI code reviews and now have their own API.md files as well. More modules on the way too. I think that covers everything updated this week but it's late and I'm probably forgetting something, so I'll reply with more if it comes up. Thanks for reading and h ave a great weekend!4 points
-
Hey folks, we at frameless Media often develop across multiple devices β laptop, tablet, sometimes even from a phone with an AI coding assistant. Git is our single source of truth, but getting those changes onto a staging or production server has always been annoying. Especially on shared hosting where there's no SSH, no git, and git-based FTP via YAML configs is more hassle than it's worth. We also frequently need to test new modules directly on shared hosting environments where the server setup differs from our local machines. Manually uploading files after every push? No thanks. So we built GitSync. π― TL;DR: β Link any installed module to its GitHub repo β See all branches and their latest commits β One-click sync β only changed files are downloaded β GitHub Webhook support β auto-sync on every push β Works on shared hosting β no git, no SSH, no cron β Private repo support via GitHub Token What's the difference to ProcessUpgrade? ProcessUpgrade is great for updating published modules from the PW modules directory. But it tracks releases, not branches. During development, when you're pushing to `develop` or `feature/xyz` ten times a day, you need something different. That's where GitSync comes in. π How it works Install the module, add your GitHub Token (optional for public repos) Go to GitSync > Add Module, pick any installed module from the dropdown GitSync searches GitHub for matching repositories automatically Link the module to a repo + branch β done From now on, you can sync with one click. GitSync compares file hashes locally and remotely (using the same SHA1 blob hashing that git uses internally) and only downloads what actually changed. No full re-downloads, minimal API usage. Want it fully automatic? Set up a GitHub Webhook β enter a secret in the module config, point the webhook to `https://yoursite.com/gitsync-webhook/`, and every push triggers an automatic sync. The module overview shows a β‘ webhook badge on auto-synced modules so you always know what's wired up. The real power: remote development with AI π± You're on the train, phone in hand, chatting with Claude via the Claude app. Claude writes code, commits to a feature branch on GitHub. GitSync picks up the webhook and syncs the module to your dev server. Automatically. You open the edited webpage on your phone, check the result, give feedback, iterate. The entire development loop without ever opening a laptop. π€― This works just as well for teams: multiple developers push to GitHub from different machines, and the staging server always reflects the latest state β no manual deploys, no SSH sessions, no FTP. We've been using a prototype internally for a few weeks now and it's become part of our daily workflow β especially the webhook auto-sync is something we don't want to miss anymore. As proof of concept we built the public release entirely as described above π Technical details for the curious The differential sync works like GIT itself: every file's content is hashed as `sha1("blob {size}\0{content}")`. GitHub's Trees API returns these hashes for the entire branch in a single request. GitSync computes the same hash locally. Matching hash = identical file = skip. Requirements ProcessWire >= 3.0 and PHP >= 7.4 with cURL Module and Docs π GitHub: https://github.com/frameless-at/GitSync π Module Directory: https://processwire.com/modules/git-sync/ Would love to hear your thoughts, ideas, and edge cases we might not have considered! Cheers, Mike3 points
-
I remember that there were some attempts to create courses on PW, but none of them really stuck in my memory. I think it is better to make one's way through tutorials and read through the docs. There are some videos that can be useful. These come to mind: https://www.youtube.com/watch?v=IHqnLQy9R1A - a really dated walkthrough I have once started with; everything looks different but the essence is the same) https://www.youtube.com/playlist?list=PLOrdUWNK38ibz8U_5Vq4zSPZfvFKzUuiT - a comparaison to WP3 points
-
LoginPassKey has undergone some changes. Latest version is 0.3.1 available at https://github.com/clipmagic/LoginPassKey As well as some 'under the hood' security upgrades, you can now login without entering a username/email. Simply click the 'Login with PassKey' button and if all the checks pass, you're automatically logged into either the admin area, or the frontend via LoginRegisterPro depending on your config/setup. A full list of the changes available at https://github.com/clipmagic/LoginPassKey/blob/main/CHANGELOG.md3 points
-
Hi Peter, great to see someone tackling this. SeoMaestro is solidly built and still maintained for bugfixes, but the last feature release was June 2022 and Wanze himself has mentioned he's stepped back from active PW work, if I remember correctly. A few things that come up in client work aren't covered by it alone. I showed your announcement to our SEO specialist and asked him to put together a wishlist. We then discussed it internally and stress-tested every point. What kept coming up wasn't really "we need new features" β it was "the pieces exist, but they don't talk to each other". There's already a lot of good, actively maintained tooling in the ecosystem: Wire Request Blocker (Ryan) β AI bot throttling since September 2025 ProcessRedirects (apeisa / teppokoivula) β 301s, wildcards, CSV import/export, v2.2.5 released Dec 2025 Process404Logger (kixe) β clean 404 logging SeoMaestro (Wanze) β the meta/OG/sitemap foundation everyone already uses The actual pain in daily work is that these live as separate islands. A site owner has to install four modules and configure each one in its own admin section. The obvious workflow between them doesn't exist either β a 404 logged by Process404Logger doesn't surface in ProcessRedirects as a redirect suggestion, even though that's exactly the kind of pairing that would save real time. So the honest question for SEO NEO might not be "what new features do we need" but rather: could SEO NEO act as the umbrella that connects what's already there? A central admin section that surfaces: SEO health (missing descriptions, duplicate titles, noindex flags) as a Lister-based audit view β this genuinely doesn't exist in the ecosystem yet 404 hotspots from the logger with a "create redirect" action wired into ProcessRedirects AI crawler activity from Wire Request Blocker SeoMaestro field status across templates Plus the few things that are genuinely missing on the meta-handling side: Native urlSegments support β as psy mentioned earlier in the thread, currently needs a hook in SeoMaestro Schema.org helpers with documented hooks β ready-made generators for the common types (Article, FAQPage, Person, Organization, BreadcrumbList) that developers can call from templates. Not auto-detection (that doesn't work without explicit mapping), but a clean API. What we deliberately left off the list: llms.txt generator β recent log file audits show GPTBot, ClaudeBot and PerplexityBot don't actually fetch the file. The spec is unofficial and no LLM lab has committed to honoring it. Worth revisiting if that changes. Yoast-style content analysis with traffic-light scoring β tends to produce text optimized for the algorithm rather than the reader. Whether the right path is one big new module or a coordination layer on top of the existing ones is your call. But from the user side, the bigger win would be coherence rather than yet another standalone tool. Looking forward to seeing where this goes. Cheers, Mike3 points
-
Hi everyone, Iβve released a new module: ProcessLegalDocs GitHub: https://github.com/mxmsmnv/ProcessLegalDocs ProcessLegalDocs generates legal documents directly from the ProcessWire admin, including: Privacy Policy Terms of Use Cookie Policy Data Processing Agreement CCPA Notice Refund Policy Disclaimer It currently supports 93 jurisdictions and 44 languages, with jurisdiction-aware language selection and document requirements. This is also the first module built on top of my new Context module: https://github.com/mxmsmnv/Context Context acts as the AI/site-analysis base layer. ProcessLegalDocs uses it to understand the site structure, installed modules, fields, pages, and configured AI gateway, then uses that context to generate more relevant legal documents. The module can still work without Context, but in that case it falls back to more generic templates. For best results, Context should be installed and configured with AI. Main features: Generates Markdown legal documents with YAML frontmatter Stores files in /site/assets/legal/ Includes dashboard, preview, download, validation, regenerate, delete, and ZIP export actions Supports many privacy/data protection regimes, including GDPR, UK GDPR, CCPA/CPRA, COPPA, PIPEDA, LGPD, APPI, PIPL, DPDP, PDPA variants, and many US state privacy laws Includes settings for owner/company data, DPO, business audience, data categories, processors, analytics, payments, email/marketing tools, cookies, refunds, subscriptions, review status, and optional ProcessWire page publishing Uses ProcessWire admin UI conventions / AdminThemeUikit Requirements: ProcessWire >= 3.0.255 PHP >= 8.3 Context module optional, but recommended for AI generation Letβs take a look at the module interface: Install: Clone into /site/modules/ProcessLegalDocs/ Refresh modules Install ProcessLegalDocs Open Setup β Legal Docs GitHub: https://github.com/mxmsmnv/ProcessLegalDocs Context module: https://github.com/mxmsmnv/Context This is an early release, so feedback, testing, issue reports, and ideas are very welcome.3 points
-
Hi everyone, I've been timing my bigger releases with the lunar cycle β new moon for launches, full moon for milestones. Collections shipped on the full moon two weeks ago. Tonight the moon is invisible. The module isn't. π GitHub: https://github.com/mxmsmnv/Ichiban Why Ichiban? Ichiban (δΈηͺ) is Japanese for "number one" β fitting for an SEO module whose entire purpose is to help your pages rank first. Why another SEO module? There hasn't been a comprehensive SEO module for ProcessWire for a while. Yoast and RankMath solve this for WordPress β both charge $59β$99/year for the full feature set. Ichiban is MIT, free, and built specifically for ProcessWire. What it does Page field β five-tab editor per page: Meta (Google-style SERP preview), Social (OG + Twitter/X cards), Schema, Sitemap, Advanced. Render with echo $page->seo; or enable auto-injection. Source expressions β resolve field values dynamically: title|truncate:70 field:summary|truncate:160 {splash} Admin sections: Dashboard β battery-style site score, health stats, GSC highlights, indexing issues Bulk Editor β edit all meta titles/descriptions in one table, grouped by Critical/Warnings/Healthy Audit β site-wide SEO rule checks, priority cards, CSV export, hookable rule system Redirects β 301/302/307/410/451, regex rules, hit counts, CSV import/export, auto-redirects on slug change Insights β Google Search Console OAuth, metrics, top pages/queries, countries, devices, URL Inspection scan Backlinks β Moz API snapshots, cached history, links/domains/anchors views Schemas β database-backed Schema.org builder, map properties to PW fields Revisions β tracked SEO field changes with restore Cleanup β remove low-value head tags, block spam crawl queries Migration β SeoMaestro β Ichiban converter (15 fields mapped) Reports β scheduled SEO email reports, DOCX export AI β OpenRouter-backed SEO prompt workspace with Context module integration XML Sitemap β built-in generator with hreflang, image sitemap, LazyCron auto-regeneration IndexNow β one-click key generation and verification robots.txt / llms.txt β dynamic serving (companion to RobotsTxt module) Known alpha limits GSC requires a Google OAuth client setup β not plug-and-play Moz free API quota is very small β refresh intentionally Schema Builder is alpha β test before production Auto head injection can conflict with existing theme SEO tags β use manual echo $page->seo; first SeoMaestro migration is experimental β always backup before running Disable debug mode before production Requirements: ProcessWire 3.0.200+, PHP 8.1+ MIT License β free, no Pro tier, no upsell.2 points
-
Hi everyone, I'd like to share a module I've been working on: WirePDF β a PDF generation module with full UTF-8 and Cyrillic support. What it does Adds a toPdf() hook to any page, so generating a PDF is as simple as: $page->toPdf(['filename' => 'document.pdf']); You can also pass custom HTML, use a dedicated template file, or save the PDF directly to disk. Key features Two engines: mPDF (recommended) and Dompdf Full field support: all native PW fields + ProFields (Table, Repeater, RepeaterMatrix, Combo) Typography: 14 fonts including DejaVu Sans for multilingual/Cyrillic content Headers & footers with {PAGENO}, {nbpg}, {DATE}, {sitename} variables Watermarks, password protection, configurable margins and paper sizes Logging via ProcessWire's built-in log system (Setup > Logs > wirepdf) Installation cd /site/modules git clone https://github.com/mxmsmnv/WirePDF.git cd WirePDF composer install Then install via Modules > Refresh in the admin. GitHub: https://github.com/mxmsmnv/WirePDF Feedback and bug reports welcome!2 points
-
Hey Brendon This took me back. When I first started freelancing, I distinctly remember a period where I felt the same. It was impossible to keep up, know everything, have time to stay current and be in a relationship. And for a brief while, I was trying my best to do all those things. Two revelations really helped me relax and enjoy life and stop stressing. 1. A friend reminded me that my relationships were more important than my work 2. I realised the most important challenge is knowing what I don't need to know So, to clarify number 2, it was a case of switching from: I need to know Adobe Flash, Actionscript 1, HTML and CSS, PHP (3), JS, Dreamweaver etc etc etc to I don't need to be an expert in all these fields. I just need to know how to solve the client projects in front of me. If I don't know something at the time, I'll learn, buy a book or suggest an alternative. So I hope that helps. I notice you're looking for a system to cram it all in, but the thing that actually helped me was accepting I couldn't (and didn't need to). So don't sweat. It's funny because lately I had to remind myself of my 2000 AD self. I began to feel with AI and AI Development that there's no way I can keep up. I've been bookmarking 50 pages a day (but reading none) and can occasionally feel burnout approaching. So I'm going to relearn to calm down a bit, because that girlfriend from 25 years ago is now my wife, I have a good freelance business, and the most important things are relationships, health and peace of mind. Everything else is a bonus and worth chasing, but not at the expense of the fundamentals. Also, you mention your friend's life, but you're measuring yourself against someone you're painting as superhuman. That could easily be a confidence and happiness killer right there, and unlikely to be helpful.2 points
-
Hi, @matjazp thanks for the report! We fixed it by removing the 3 calls. Just upgrade the module to 0.2.1 They solve different problems. ProcessWireUpgrade is for stable releases, GitSync is for branch-based development workflows. ProcessWireUpgrade pulls from the official modules.processwire.com directory and compares semantic version numbers. It can upgrade the ProcessWire core itself (master or dev branch) and existing installed modules, but it cannot install new modules that aren't already present, doesn't support private repositories, doesn't support arbitrary branches per module, and uses a pull model (no webhook / no auto-sync on push). Each upgrade is a full download. GitSync pulls from any GitHub repository β public or private (using a fine-grained Personal Access Token for the latter). It works at the branch and commit level rather than the release level, lets you switch any linked module to any branch, and detects changes by comparing git blob SHAs file-by-file, so only modified files are downloaded. It can install brand-new modules from a GitHub URL (even ones not listed in the official directory), supports private repos, and offers GitHub webhook integration for automatic sync on every push. It does not upgrade the ProcessWire core. When to use ProcessWireUpgrade: Production servers that should only move to officially released versions Upgrading the ProcessWire core itself Mostly relying on modules from the official directory When to use GitSync: Test/staging servers that should track a development branch (e.g. develop, feature-x) live Deploying your own modules from private repositories without FTP Installing GitHub-hosted modules that aren't (yet) in the official directory Auto-deploy on every git push via webhook They can be combined: use ProcessWireUpgrade for the core, and GitSync for modules that you develop yourself or that arenΒ΄t in the PW directory. To narrow this down β could you share: Which action failed? Install from GitHub, Link Module, or Sync/Upgrade of an already-linked TracyDebugger? The error or behavior you saw β blank page, timeout, rate-limit message, partial sync, etc. The last lines of the gitsync log under Setup > Logs > gitsync. Whether you have a GitHub Personal Access Token configured (without one you're capped at 60 API requests/hour). The file count alone (~1,250) shouldn't be a problem for a normal upgrade β only changed files are downloaded. But it would be a problem for a fresh Install from GitHub, where every file is fetched in its own API call. The log will tell us which case you hit. We just tested and ran into zero problems: We installed Tracy via the Modules page added it to GitSync via the dropdown synced master branch One known gotcha worth checking: TracyDebugger writes runtime files (logs, bluescreens, dumps) into its own module directory. GitSync deletes local files that don't exist in the remote repo, so a large toDelete list with permission-protected files could also cause the upgrade to fail mid-way. Cheers, Mike2 points
-
I just did, but still waiting for approval. Cheers R2 points
-
AIOM is alive π I am pleased to announce that the AIOM module will be further developed and supported by @matjazp. My original repository is now archived, and matjazp's fork is now the official one. The forked version is now also listed in the Processwire module directory. This should make it possible for everyone to update the old version to the new one, either manually or via the ProcessWire upgrade module.2 points
-
Hey @ryan and fellow AI enthusiasts, This might be slightly off-topic, but I think it could be really valuable for the ProcessWire community if someone created a practical guide or tutorial on building projects with PW and AI tools. Iβm new to this space, and honestly, it feels a bit overwhelming because there are so many different approaches and workflows. For example, after installing Codex or Claude, whatβs the next step? Should I create specific .md files for context or instructions? If so, which ones? Is it better to have the AI read the entire ProcessWire codebase first, or should I simply ask it to build a module or website directly? Iβd really appreciate any guidance, workflow examples, best practices, or general tips from people already using AI successfully with ProcessWire.1 point
-
Hi Zilli PromptWire is available, and it handles 100% of my AI development in ProcessWire. It's built as an MCP from Cursor to AI, and it's free. https://www.peterknight.digital/docs/promptwire/ It can build almost anything with the right prompts, and it's really quite powerful. Any questions, just DM or reply here. Cheers Peter1 point
-
Dear Community, I am currently looking for a web developer to implement a website based on a fully completed and professionally designed layout provided by a design agency. The scope of work is limited to HTML, CSS, and JavaScript development. All other components, such as PHP integration, CMS setup, cookie banner, and backend functionality, will be handled by me. The website must be fully responsive and optimized for desktop, tablet, and mobile devices. For tax and legal reasons, the developer must be based in the European Union and able to provide a valid EU VAT ID. I look forward to hearing from interested developers. Best regards Nomak1 point
-
I can recommend OpenCore Legacy Patcher for upgrading macOS on older Macs. You could upgrade your iMac to Sonoma with it. π1 point
-
2017? That IMac has certainly earned its keep by now π Did you copy everything manually or use Time Machine?1 point
-
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.1 point
-
Yes, I have a day job, and it's not programming. I work on it mostly in the evenings after work.1 point
-
Hi everyone I've started a new module called SEO NEO It's a new SEO module built for today's SEO, on today's ProcessWire. I hadnβt planned another module, but I keep returning to the same niggling thought: SEO is too important to our clients' sites (and businesses) to depend on modules that are not being actively developed keeping pace with how SEO works today. So that's pretty much it. SEO NEO will be free. An Ultra/Pro version will follow and include genuinely useful additions for industry professionals. I'll have more soon, but if you have any SEO requests, my DMs are open. Cheers Peter1 point
-
1 point
-
I assume you want those other RM types that should not be editable by the user with the given role still to be shown in admin, but with all their fields being disabled. The best way to achieve this is via hooks. Look here or search for similar topics for inspiration. Check RestrictRepeaterMatrix's source code for another example. You need to get the InputfieldRepeaterMatrix field at some point (maybe after the renderReadyHook method), foreach through the blocks and change their fields' output based on your conditions. Sorry for no ready-to-copy-and-paste code))1 point
-
Hi everyone, Iβve uploaded an updated version of the module. It is now called NativeAnalytics. This should be treated as a new module release, not just a small update of the earlier test versions. Important: If you previously tested PW Native Analytics, please uninstall the old module first and then install NativeAnalytics as a fresh install. I did not add a migration path from the old module to the new one, because the module name and structure changed during development. A clean install is the safer option. The main idea behind NativeAnalytics is simple: to provide a useful analytics dashboard directly inside ProcessWire, without relying on external analytics platforms, third-party scripts, or external APIs. Everything is handled natively inside the CMS, which makes it a good fit for projects where you want a simpler, self-contained analytics solution. The module currently tracks and displays things like: page views unique visitors sessions current visitors top pages referrers devices and browsers 404 hits engagement events such as form submits, downloads, tel/mail clicks, outbound clicks, and custom CTA events It also includes: charts and trend views comparison between periods custom date range filtering page-level analytics inside the page edit screen exports to CSV, PDF, and DOCX helper examples and a small snippet generator for custom event tracking ! In this latest version I also added several privacy and usability improvements: optional cookie-less visitor/session mode improved consent-based tracking helper functions for custom consent integrations optional PrivacyWire localStorage consent helper support cleaner behaviour when global tracking is disabled improved admin theme compatibility and spacing polished dashboard layout and panel alignment added a shortcut button to the module settings from the analytics dashboard The reason I built this module was that I wanted something that feels natural inside ProcessWire itself, instead of just embedding another analytics service into the admin. For many sites, it can be useful to have core traffic and engagement data available right where content is managed, with no need for external integrations. Multi-site analytics is not included yet, but it is something I am looking into. It would need proper per-site separation in the stored analytics data, so I want to approach that carefully rather than adding a quick workaround. (Also I don't have any multisite testing environment atm ...) Download it Here: NativeAnalytics_1_0_19.zip Enjoy!1 point
-
Hi @AndZyk You are not alone. Same here. Uninstall and install the module again helps. Gideon1 point
-
Hi @Mikel I use a custom JavaScript function (that name is entered in the PrivacyWire module settings) to check for consent and then set the cookie for activating NativeAnalytics: function initNativeAnalytics() { const consent = JSON.parse(localStorage.getItem('privacywire')); //console.log(consent); if (consent && (consent.cookieGroups.statistics || consent.cookieGroups.marketing)) { document.cookie = "pwna_consent=1; path=/; max-age=" + (60*60*24*365) + "; SameSite=Lax"; if (window.PWNA && typeof window.PWNA.trackIfConsented === 'function') { window.PWNA.trackIfConsented(); } } else { document.cookie = "pwna_consent=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT"; } }1 point
-
Honestly, youβve got everything you need with just the files and a database dump. Iβve done this exact migration a few times, and ProcessWire is actually one of the easiest CMSs to move because it doesnβt hardcode paths in the DB. Just upload your files to the Ubuntu server, import the SQL via phpMyAdmin or CLI, and update your /site/config.php with the new database credentials. The only real "gotcha" is usually file permissions or missing .htaccessβmake sure mod_rewrite is enabled on the new Ubuntu box and double-check that your /assets/ folders are writable by the server, otherwise your images won't render. You definitely don't need a fresh install first; just "drop and swap" works fine.1 point
-
Hey! Yeah, that's a classic snag with ProcessWire's Repeater Matrix. The ->type property actually returns the "name" (slug) of the type, but ->label isn't a direct property of the item itself. To grab the human-readable label, you have to pull it from the field's definition. You can do it like this: PHP $label = $item->getRepeaterMatrixType()->label; echo $label; Essentially, $item->getRepeaterMatrixType() returns the actual type object, which contains all those extra details like the label, icon, and description. Super handy if you're building out a custom page builder and want the UI to match the backend!1 point
-
Just a heads up for everyone - the latest release of RepeaterMatrix v14 will result in a 500 internal server error on PW v3.0.257. It works fine on v3.0.261 but I haven't narrowed down the min required version. Be sure to test thoroughly on dev first before upgrading.1 point
-
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!1 point
-
Thanks @ryan - so the "page content" part is my concern but I am assuming that so long as we only add the PE field to pages that have publicly available content (frontend viewable) then it should be safe because it won't be able to read the page content from the "entire site" as per your initial post. I know I probably sound pedantic here, but I think this distinction is VERY important.1 point
-
I feel that! But it became way better than it was a few years back when the world was going nuts. The things I changed in the last 12-18 months: getting all the regular vitamins and supplements for someone my age getting additional supplements that help my brain to keep working checking in on gut health and eating less/none heavily processed foods checking calories and protein in-take - fixing both and removing empty carbs and calories getting back to the gym - first only cardio, now additional strength training All the above helped me to not being stressed out everytime and all the time. I couldn't care less about things thrown at me these days. A full day with meetings, a workshop, and a coffee with friend somewhere in-between, and of course the usual time at the desk don't affect me in a negative way anymore. I don't know how the math works here, but these days I have enough hours each day to have plenty of time, even time to balance everything out. PLUS the weekends for side-projects, fun, friends, family, and just things.1 point
-
1 point
-
This sounds very cool, but I wonder if you can allay some concerns I have. Does that mean it can read any content from any field on any template/page in the site? I am just worried about it accessing and processing private data. Or does it only have access to field/template/page structure and not actual field data?1 point
-
Both issues are fixed in v1.9.3 just released! @jacmaes - the sort direction bug is fixed. Root cause: the default sort direction parameter was always 'asc' (a non-empty string), so the fallback to the collection's configured direction was never reached. Now when no explicit sort is in the URL, both the sort field and direction come from the collection settings. @iank - both your suggestions are implemented, and your code was pretty much used as-is, thanks for that! View icon is now hidden for pages where $page->viewable() returns false Added canAddNew() to the Collection class that checks noParents β hides the Add button when set to "no new pages" or when it's a singleton and a page already exists And thanks to @elabx for the kind words!1 point
-
https://processwire.com/talk/topic/11925-repeater-matrix-intro-and-docs/1 point
-
Hello, everyone. I was wondering if it wouldn't just be better to switch TinyMCE with SunEditor instead as the "official" WYSIWYG editor of ProcessWire. It's licensed under MIT and it outputs cleaner code. I'm not a developer, so I'm afraid I cannot create a module and implement it myself. I don't need it personally, but I'm sure there are people (clients) who do need a WYSIWYG editor.1 point
-
Hi everyone, Built this for a financial news site that needed live stock quotes embedded inline in editorial content. Drop a ticker into any text field and it renders as a live badge with price, change, and direction - clicking opens a full detail popup. GitHub: https://github.com/mxmsmnv/Stocks What it does: Live price badges - ticker, price, change amount/%, direction arrow; click opens a popup with open/high/low, 52-week range, P/E, volume, market state Three data providers - Yahoo Finance (free, no key needed), Finnhub, Alpha Vantage TextFormatter with three parse modes: Explicit [stock:AAPL] tags Cashtag/hashtag - $AAPL, #TSLA Auto-detection by company name and aliases in text Company Manager - tracked companies with names, aliases, enable/disable toggles, bulk CSV import Four CSS frameworks - Vanilla CSS (built-in), Tailwind, Bootstrap 5, UIkit 3; auto-detected or manually set File-based cache with configurable TTL and per-ticker clear from admin Circuit breaker - pauses API calls after repeated failures, serves stale cache with ~ marker Custom provider API - add any data source by extending StocksProviderBase $stocks = $modules->get('Stocks'); echo $stocks->renderBadge('AAPL'); echo $stocks->renderBadgeAs('TSLA', 'bootstrap'); Requirements: ProcessWire 3.0+, PHP 8.2+ MIT License.1 point
-
@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.1 point
-
I feel the same way when things I'm used to change. E.g. the switch from XD to Figma a few years ago felt unfamiliar at first and it slowed me down. Mainly because I had a lot of things stored in my head that turned out to be different. Now it's the other way around and I could never go back to working with XD. I was also pissed at apple when they updated the OS to use the new Liquid Glass design system, now everyone seems to love it and designers copy it (still not the biggest fan, but I can live with it now) π. I hope the new theme will grow on people. The simpler color scheme (compared to the original Uikit theme) and CSS variables make theming much easier. You can quite easiely customise it to your taste if you don't like the defaults. And it shares some concepts with AdminThemeCanvas like the fixed header and a more minimal modern aesthetic that fit very well for a web app like PW in my opnion. I am using the Konkat theme for all my new projects. @diogo has already sent detailed documentation for the Konkat theme to Ryan, which he will hopefully publish on the site soon. The new docs are especially interesting for module developers. @maximus has also done a great job with the style system guide. I think that will also help demonstrate the benefits of the new theming system. The theme now also supports UIkit components out of the box. We will have to wait a bit for Ryan to decide where those docs will be published. AdminTheme Canvas has served me well for many years, and Iβm glad so many of you have used it! If anyone wants to take it over, feel free to send me a DM. But I think itβs better to use the core theme as a replacement.1 point
-
Very useful, indeed! May I suggest an example in its docs for the developer to implement: - A URL segment `/md/` or, even better, adding `.md` to the URL to trigger the display of the markdown version of the page?1 point
-
Useful utility indeed, thanks for sharing! Are you planning to add TinyMCE support as well? Given that CKEditor has been replaced by TinyMCE as the default RTE, on new sites I always use TinyMCE.1 point
-
After probably 12 years with Processwire, I just discovered that pressing the π² tree icon link, in the breadcrumbs, opens a modal with the page tree.1 point
-
I've been using PW for quite a while, now, so I would like to give back to the community that helped me so many times. I had this customer that wanted to use the Google Translate API to automatically translate the site, so I built this function that takes advantage of it without the need to use the API on every page cycle. I put it on a file that gets called on the _init.php, so that I can use it on every template. Here it is: <?php function googleAutoTranslate($page, $field) { // Turn off outputFormatting $page->of(false); // Get current language and field content for this language $current_language = wire('user')->language->name; $field_content = $page->getLanguageValue($current_language, $field); // Is there any content for this language? if($field_content != '') { // Do nothing! } else { // No content, lets translate... // Get default language text $text = $page->getLanguageValue('default', $field); // Translate only if there's content in the default language if($text != '') { // Translate it $apiKey = 'YOUR API KEY HERE'; $default_language = 'pt'; // Your default language here! $url = 'https://www.googleapis.com/language/translate/v2?key=' . $apiKey .'&q=' . rawurlencode($text) . '&source=' . $default_language . '&target=' . $current_language; $json = json_decode(file_get_contents($url)); $field_content = $json->data->translations[0]->translatedText; // Save translated text $page->$field->setLanguageValue($current_language, $field_content); $page->save(); } } // Turn on outputFormatting $page->of(true); // Return result return $field_content; } ?> Whenever you use a field on a template that should be auto translated, just call the function with a page object and the field name, like so: echo googleAutoTranslate($page, 'body'); Features: Translation occurs only once per field, so you don't need to keep paying translations (it stores the translation into the field language); You can correct the translation in the admin area and it won't be overwritten; If you need the translation to be made again, just delete the field content in the needed language. For the translation to occur, content must exist in the default language. I had to fight a little to get this working, so I hope this helps anyone, who comes across this particular need. Nice Things To Have If someone wants to give it a shot to make this into a module, please do. It would be nice to have a checkbox "Enable Google auto translate for this field", when you edit a field input features. Don't Spend Too Much Mind you that the Google translate is a payed service! and needs a Credit Card to get it going (even with $300 free credit); With a relatively small site (and the tests made to get this to work) I already spent about 80.000 translated characters = $3, Hope this helps someone!1 point