All Activity
- Past hour
-
pideluxe started following PW Native Analytics — a native analytics module for ProcessWire
- Today
-
matjazp started following Context Module - AI-Optimized Site Documentation with TOON Format
-
Context Module - AI-Optimized Site Documentation with TOON Format
matjazp replied to maximus's topic in Modules/Plugins
@maximus, thank you for all the modules! Just to let you know: there are 2 occurences of formatBytes() in Context.module.php -
Roych started following PW Native Analytics — a native analytics module for ProcessWire
-
Hi everyone, I wanted to share a module I’ve been building for ProcessWire: PW Native Analytics. The main idea behind it was simple: to have 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 nice fit for projects where you want a simpler, more 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 The reason I built it 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. Tell me if you find it usefull 😉 Download it Here: PwNativeAnalytics.zip
-
- 5
-
-
PrompWire MCP (new name) is now public on Guthub. Use at own risk 😀 https://github.com/PeterKnightDigital/PromptWire-MCP PromptWire MCP for ProcessWire (blog introduction) Documentation can be found here. https://www.peterknight.digital/docs/promptwire/v1/ Enjoy 😊
-
@Juergen OK I'll try with the custom validation rules. Need to check how it works more deeply. Actually I have a specific case, but I often use this for several scenarios. A very simple example would be a form where user must enter the username he is using in a game (I developed a site to manage competitions in sim-racing games), and we need to verify that it's not already used by another user. If already used, invalidate the form and display an error on the username field.
-
Peter Knight started following New blog: ProcessWire and AI
-
This is briliant, @maximus. I was just considering such a thing, so looking forward to contributing if it becomes a repo.
-
@maximus This is awesome! I already heard from Diogo that it helped him fix something in admin.css, which we just pushed a fix far. Can you tell us more about it? For instance, do you recommend this for testing all the admin components in PW? Is this using the AdminThemeUikit default theme admin.css file? Thanks for putting it together!
-
DrQuincy started following Disable webp generation for GIFs
-
If you enable WebP, it creates variants for all images. However, Ryan's .htaccess code is from here: https://processwire.com/blog/posts/webp-images-and-more/#webp-image-strategies-in-processwire Doesn't rewrite GIFs, I presume this is because they can be animated. RewriteRule ^(.*?)(site/assets/files/)([0-9]+)/(.*)\.(jpe?g|png)(.*)$ /$1$2$3/$4.webp [L] Given this, it seems inefficient to create a webp variants for GIFs. Does the core have an inbuilt way to disable this, or is it by design that this isn't offered/done automatically?
-
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 -
Ran into this issue here in another project using the latest version from the module directory. The file AgentToolsSitemap.php in the module directory is actually named AgentToolsSiteMap.php (capital M) and also renamed the class. I renamed the file and it seems to work for now. Also ran (not me, the agent) into some other issue.
-
It'd be brilliant if there was a way to copy a image path list to the clipboard from this module to use with your Add Image URLs module. I frequently copy images from site to site.
- Yesterday
-
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
- 36 replies
-
- 11
-
-
-
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.
-
- 11
-
-
-
Thanks! Yeah I had deleted my first account after I got 100k followers... don't ask why. Then on my second account @somartist2 I tried to leave 2-3 times but then reactivated the account. And finally I did it. I'm on bluesky now, and still on Instagram and other platforms. No I didn't realize, but yeah I was very active for many years answering and helping many. It's great to hear tho. 🙂 Oh @ryan, thanks for the warm welcome back. Yeah I went on a long journey, glad you been following me. Great to see you're still running this thing haha. And now even using llm's! Yeah OMG so many names that I almost forgot about. I'm an old man now hehe.
-
PHP code isn't rendered, but referenced images are being pulled
markus-th replied to Joachim's topic in General Support
@Joachim Exactly, when you use wireRenderFile() (or include), the variable $page remains the current page being viewed in the browser—in this case, the Home page. Since your Repeater fields live on the child pages (the modules), $page->introimg_field is looking at the Home page, finding nothing, and returning an empty object. When you loop through your child pages to render them as components, pass the specific child page into the options array of wireRenderFile. foreach($page->children() as $component) { // We pass the $component page object into the file echo wireRenderFile("components/{$component->template->name}.php", [ "item" => $component ]); } Inside the child (module) template: <section id="<?php echo $item->name; ?>" class="module"> <div class="landing_images"> <?php foreach($item->introimg_field as $intro_image): ?> <a href="<?php echo $intro_image->page_picker->url; ?>"> <h3><?php echo $intro_image->title; ?></h3> <img src="<?php echo $intro_image->image->url; ?>" alt="<?php echo $intro_image->description; ?>"> </a> <?php endforeach; ?> </div> </section> This should give you the correct array. -
PHP code isn't rendered, but referenced images are being pulled
Joachim replied to Joachim's topic in General Support
var_dump($page->introimg_field) gives: object(ProcessWire\RepeaterPageArray)#258 (5) { ["field"]=> array(4) { ["id"]=> int(111) ["name"]=> string(14) "introimg_field" ["label"]=> string(13) "Landing image" ["type"]=> string(17) "FieldtypeRepeater" } ["forPage"]=> array(6) { ["id"]=> int(1027) ["name"]=> string(7) "landing" ["parent"]=> string(6) "/home/" ["template"]=> string(16) "module_introImgs" ["title"]=> string(7) "landing" ["text"]=> string(0) "" } ["count"]=> int(0) ["items"]=> array(0) {} ["selectors"]=> string(0) "" } (I've never used this function, so I'm not entirely sure how to interpret this. Maybe ["count"]=> int(0) ["items"]=> array(0)count"=> int(0) is a bad sign?) It seems no matter what I do, the foreach function isn't working—until for some reason the images load, apparently randomly, after which the function works after every reload, suggesting a cache issue, I'm guessing (this is also why I tried loading the images in the main CSS file). EDIT: I am loading children pages as modules into the main pages. Take the following structure, for example: HOME - text - images - marquee - text2 The subordinate pages are loaded into the Home page using echo wireRenderFile(). Could it simply be that I'm referencing $page (in foreach($page->introimg_field as $intro_image), so it is looking for my Repeater Fields in the Home page, while in actuality they are on a child page? -
PHP code isn't rendered, but referenced images are being pulled
Joachim replied to Joachim's topic in General Support
Right, I had hoped loading them through CSS would fix the problem somehow, but forgot about that 😬 That explains that part, thank you, Markus! Locally the page always loaded correctly, but I have sanitised the code a bit and perhaps introduced a mistake, although sometimes the pictures do load fine. I'll try your suggestions and get back to you. -
PHP code isn't rendered, but referenced images are being pulled
markus-th replied to Joachim's topic in General Support
Hi @Joachim the most common reason a foreach loop "fails" silently is that the array/WireArray being looped over is empty. Have you tried to test $page->introimg_field via var_dump? oh and, your images are loaded via css: -
Joachim started following PHP code isn't rendered, but referenced images are being pulled
-
I have the following code on a website: <?php namespace ProcessWire; ?> <section id="<?php echo $page->title ?>" class="module"> <?php echo "{$page->text}"; ?> <div class="landing_images"> <?php foreach($page->introimg_field as $intro_image){ echo " <a href='{$intro_image->page_picker->url}'> <h3> {$intro_image->title} </h3> <img src='{$intro_image->image->url}' alt='{$intro_image->description}'> </a>"; }; ?> </div> </section> For some reason, most of the time this code doesn't seem to get executed. The strange thing is, that the referenced images (the $intro_image fields) are being pulled, as they appear in the console: As you can see from the turtle icons, the server response times are very slow (around 650 ms), but then again, the code above is rendered client-side as: <section id="landing" class="module"> <div class="landing_images"> </div> </section> So the $intro_image fields inside the code are read, but the code surrounding it, i.e. within .landing_images, is not rendered at all. Does anyone know what could be the problem here?
-
benbyf started following AI environmental and societal concerns
-
Hi all, sorry haven’t been around Processwire in a while as I’ve been doing games and AI ethics work mostly these days. If you want some more things to read and hear then check out my podcast on the subject or my article about the end of programming…. Yep 🫠 Machine ethics podcast Programming is dead, we’re all code engineers now
-
GitSync – Keep your (private) modules in sync with GitHub
Mikel replied to Mikel's topic in Modules/Plugins
Update: Improved "Link Module" UX We had an internal discussion about the "Link Module" interface and optimized how the different states are handled: Match found – The repo is resolved and ready to link. The green link opens the repository on GitHub so you can verify it's the right one before linking. This appears instantly when the module declares its GitHub URL in getModuleInfo() or has been resolved before (cached), otherwise after a quick GitHub search. No repo found – ProModules like RepeaterMatrix have no public GitHub repo. GitSync shows a clear "No repositories found." instead of false matches. Multiple repos – When a module exists in several repos (forks, different maintainers), you get a list to pick from. Selected, with "change" – After picking one, a "change" link lets you switch. It only appears when there are actually alternatives. Other improvements: single results are now auto-selected (no unnecessary click), the GitHub search uses Code Search API for exact .module.php filename matching (works even when repo name ≠ class name), and results are cached client-side so re-selecting a module is instant. Cheers, Mike - Last week
-
@ukyo Thanks for your awesome work with those modules, really impressive what you are building, and it's a big help for improving the AI friendliness of ProcessWire. The AgentTools module readme is now linking to your boost project as well. Glad you like the API.md files. Admittedly it was not my idea, but I asked Claude what would be helpful and he said these API.md files, plus an abbreviated sitemap json file so that it can get a big picture overview of a PW installation at a glance. That sitemap feature was actually added to the AgentTools module today. Several API.md files have been added to the core today as well. For Fieldtypes that don't have their own directory, they are in a combined /wire/modules/Fieldtype/API.md file. We're also adding dedicated Field classes specific to each Fieldtype, which will improve field documentation but also allow for custom field API methods separate from the Fieldtype (where useful).
-
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, Mike
- 1 reply
-
- 9
-
-
-
@adrian noted. For me, the DB abstraction would open a lot of doors for us, special if we could use SQLite. I really want to make an app/desktop using PW and NativePHP.
-
No plans on that from me - I was just seeing if Claude could do it - I think it would be something that would require core modifications and maybe modules that plugged into the core abstraction layer for each DB.
-
Is a new module coming up? 🙂