Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 10/01/2026 in all areas

  1. Sorry I wasn't able to provide an update last week, and not really able to provide one this week. I'm all caught up in legal matters with my wife unfortunately, and it's consuming all my time. I still am getting various commits on the dev branch though, and hope to have a new dev version ready for you next week. Thanks and have a great weekend!
    27 points
  2. Hi all, I needed a real forum on a ProcessWire site. This is it: Native Forum, fully built, and it installs on an existing site without touching what’s already there. The forum part Structure: groups, categories, topics and replies, with pinned and locked topics, tags, search and a member list. Posting: quotes, “in reply to”, likes/votes, a copy link and share cards for every post. Members: private messages with a “you’ve got mail” popup, followed topics with e-mail notifications, and a “Followed topics” tab that shows what’s new. Profiles: avatar, signature and ranks (manual or by post count). Editor: CKEditor with drag & drop uploads, resizable images and file attachments. Keeping it clean Anti-spam: honeypot, JS challenge, link limits for newcomers, disposable-email and MX checks, StopForumSpam and optional Cloudflare Turnstile. Bots get bored, humans don’t notice. Moderation: a report button and a dashboard with Hide/Lock/Delete in one click. You can edit every topic and reply right from the admin. SEO, GEO & speed SEO: clean meta tags, JSON-LD, RSS and a sitemap. Share cards: Open Graph cards with the right picture for each reply. GEO (AI search): Markdown versions of topics and an /llms.txt file. Speed: fast, with batched queries, and ProCache-friendly. Fits your site, not the other way round It renders inside your own _main.php (Markup Regions or $content) or as a standalone page. One switch hides your site’s page loader on forum pages. You can add your own header, footer, <head> markup, or anything before or after the forum. Looks Six ready-made presets: Obsidian, Light, Dark, Auto, Monochrome and Custom. A Simple or Bootstrap 5 theme, and a Classic or Compact layout. Design Studio, if you want to tweak every colour and size yourself. Pick a preset, and your forum looks finished before your coffee gets cold. ☕ Themes: ... Admin goodies Dashboard: reports, groups and categories (drag & drop), topics, messages and members. Settings: neatly arranged. It also works in Konkat dark mode and on phones. Optional demo content: pinned forum rules and a few sample topics, removable in one click. Export / Import: move the whole forum to another site as one .zip: settings, posts, files, members, and even passwords (encrypted hashes, so members just log in as before). Clean uninstall: it removes everything it created, with a big red warning first. Install: copy the module to /site/modules/NativeForum/, run Modules > Refresh, and install Native Forum. The admin installs itself. Then open /forum/. That’s it. Download: https://processwire.com/modules/native-forum/ Feedback, bug reports and ideas are very welcome. And if you build a community with it, show it off! 🙂 Cheers 😉 R
    20 points
  3. I'll keep this update short because I'm currently in the airport and headed to Amsterdam. This week we've added official support for nginx and caddy to ProcessWire, among various other updates on the dev branch. I'll be in Amsterdam for a week. If any ProcessWire users are in the area and want to meet up for a coffee, beer, or a walk, please let me know. I'll be located near the Amsterdam Centraal station.
    19 points
  4. AdminThemeBridge – a native web-component admin that keeps your existing modules working (beta) Hi friends! And, traditionally, thanks for ProcessWire 😉 For a while I've been building something bigger than my usual in-house modules, and it's ready for other eyes now. Bridge (a working name) is an admin theme for ProcessWire that renders the admin with native web components and a small TypeScript runtime, without jQuery — while every existing Inputfield and Process module keeps working unchanged. The goal A better and faster admin. Faster: far less to download and run on every screen (numbers below). Better: an admin that feels current, in light and dark, with the small daily annoyances fixed. The name says how it gets there: Bridge is a bridge between the jQuery-era admin and the modern web stack. Everything that can be native already is, and your modules stay on their side of the bridge, working exactly as before. Bridge against Uikit and AdminThemeBoss at a glance; the full table with all six themes is further down The idea in one paragraph The admin carries a lot of history: jQuery, jQuery UI, inputfields.js, WireTabs, Magnific. Thousands of modules rely on exactly that, so simply removing it is not an option. Bridge does it the other way round: the shell and the core screens are native, and the whole legacy stack is loaded only on the screens that need it — with the same globals ($, jQuery, ProcessWire.config, Inputfields) and the same reloaded event. A page whose fields are all native loads no jQuery at all; a page with a jQuery-era field gets the classic stack, and that field works as before. What's native today the admin frame: masthead, navigation, notices, light and dark scheme most core fields: text, select, checkboxes, datetime, file, image (incl. crop and variations), repeater, page table, language tabs core screens: page tree, page editor (save without reload), Lister, Modules, Fields, Templates, Users, Roles, Permissions, Profile, Logs, Trash and the rest Small things that got better Multi-level dropdown menus: a submenu stays open while you move the pointer to it, fits the screen height and opens to the left at the right edge. On a phone or tablet the first tap opens a menu instead of following its link, and menus work from the keyboard too. Long content scrolls where it is: a deep page-tree branch or a long menu scrolls inside itself instead of running off the bottom of the screen. Notices never cover the Save button. They have their own place above the content, so showing or closing one doesn't move the page, and a long one pushes the content down instead of overlapping it. Save without reload in the page editor, and in the field, template, module, user, role and profile editors (Shift+click still saves the classic way). No jumping content while the Lister loads, and no stacked tab panels flashing before the tabs are set up. The dark scheme reaches CKEditor, TinyMCE and the other field widgets. Focus rings and button text stay readable in every colour preset, and the top bar turns into a drawer when its items don't fit. What stays exactly as it is wire/ is never edited or patched. Bridge is a regular module. DOM ids and classes, AJAX endpoints (?modal=1, ?render=JSON, renderInputfieldAjax), module class names and hookable methods are kept as upstream emits them, so your modules and hooks find what they expect. It's per user: Uikit stays installed, and anyone can switch back under Profile > Admin Theme. How it's tested A conformance suite renders every admin screen under Uikit and under Bridge and compares what modules see. On copies of nine real sites that's 1,434 screens with no differences caused by the theme, covering 41 of the 45 third-party modules installed there (FieldtypeMatrix, PageTableNext, VersionControl, Fluency, BatchChildEditor, SettingsFactory, AdminThemeBoss, ProcessWireUpgrade and others; the other four have admin screens that already fail the same way under Uikit on those copies, so there was nothing to compare). Behaviour checks run in Chromium and Firefox. It's also running on two live sites. CKEditor and TinyMCE run through the legacy stack and still follow the dark scheme Lighter and faster: the numbers Lighthouse 12 (desktop preset), logged in, cold cache, median of 3 runs, on a copy of a real site. Average over four screens: page tree, page editor, Lister, Modules. Bridge 0.9.3. Bridge Uikit Uikit (2025 look) AdminThemeBoss Reno Default Lighthouse performance 98 69 66 81 83 77 Largest Contentful Paint 0.9 s 3.6 s 3.9 s 1.8 s 1.8 s 1.6 s JavaScript (gzip) 38 kB 272 kB 273 kB 190 kB 186 kB 184 kB CSS (gzip) 55 kB 118 kB 150 kB 59 kB 74 kB 70 kB jQuery loaded no yes yes yes yes yes Fonts 71 kB 237 kB 458 kB 75 kB 75 kB 75 kB The same table as a picture; the forum editor's tables are fiddly Fonts include Font Awesome 6 in full: Bridge serves the icons in common use from small subsets built at release time, and any other icon from the full font, so nothing goes missing. These are localhost numbers, so absolute times will be higher on a real server — the differences between themes are the point. On a screen with a jQuery-era field, that field brings its stack with it, as it should. Want to check on your own site? Chrome DevTools → Lighthouse → Navigation, Desktop, Performance, and untick "Clear storage" in its settings (otherwise it logs you out and measures the login page). Installation Requires ProcessWire 3.0.227+ and PHP 8.1+ (developed against 3.0.274 dev). Download the module from https://github.com/theoretic/AdminThemeBridge (Code > Download ZIP) into site/modules/AdminThemeBridge/, or git clone it there. It's the module only; development happens in https://github.com/theoretic/bridge. The modules directory listing is on its way. Modules > Refresh, then install Bridge. Select it under Profile > Admin Theme. Other users stay on their theme. On a live site please back up the database first and read docs/install-live.md. Two things I learned the hard way: AdminThemeBoss's "activate for all users" must be off (it resets everyone to Uikit on each request), and a plain Modules > Refresh must complete before you install — a site module that loops during the cache rebuild has to be updated first. For module authors There is a small component contract (docs/contract.md) . Implement one interface and your Inputfield or Process runs natively too. If you don't, nothing breaks — your module simply gets the legacy stack, as today. Known limits Beta (0.9.3). The contract is version 1 and may still change before 1.0. Pro modules (ProFields, FormBuilder, ListerPro) are not tested — I have no licences to test with, so I make no claims there. The name is a working name and may change. What I'd love to hear Does your favourite module behave under Bridge? Screens that look or work differently are exactly what I'm looking for. Module authors: is the contract understandable, and what would you need from it? Anything about the look and the dark scheme. Thanks Bridge is mostly inspired by the perfect AdminThemeBoss by Noël Bossart, which was my default admin theme in every ProcessWire project before Bridge existed. Its colour presets (blue, vibrant, black, pink, green) are Bridge's colours, and its extended breadcrumbs are here too. Thank you, Noël! Module: https://github.com/theoretic/AdminThemeBridge . Development, docs and changelog: https://github.com/theoretic/bridge (MIT; files derived from ProcessWire keep their MPL 2.0 header). Advice and critics are welcome 😉
    17 points
  5. @BrendonKoz the current dev branch will become PW4, so a major version, probably around the end of the year.
    15 points
  6. This week we have ProcessWire 3.0.275 on the dev branch. Relative to 3.0.274, this contains more than 90 commits, many related to older issue fixes from our GitHub issues repo. Also released this week is ProcessWire 3.0.260 on the main/master branch. When there is anything potentially security related, I back port those updates from the dev branch to the main/master branch, and bump the master branch version. This maximizes the security and stability of both branches at the same time, so it's become part of the regular work flow these last few months. More next week. Thanks for reading and have a great weekend!
    14 points
  7. Hi all, You know the moment: you're browsing your own site, you spot a typo in a title, an event that already happened, a date that's wrong. And you sigh, because now it's admin → find the page → edit → scroll → save → go back. Five screens for one word. So I built Native Command — a command palette for ProcessWire, like Spotlight/Raycast or the VS Code palette. Press Alt+K (⌥+K on Mac) on any page of your site, front-end or admin, type a couple of letters, hit Enter. Done. What can it do? Things with the page you're looking at: set any simple field (text, number, price, date, checkbox, options, page reference — yes, next friday 19:30 works), publish/unpublish, hide, rename, duplicate, add a child page, move it, trash it. Undo. Everything. Every change shows a little toast with an Undo button. Your editors will love you. You'll sleep better. Bulk actions with selectors. "Unpublish all events that already happened": bulk unpublish → template=event, event_date<today → untick the one you want to keep → Enter. You get a summary of what was done and skipped (and why) — and one Undo for the whole batch. "Wait, who uses this page?" Page info shows who created/changed it, URLs in all languages, and which pages reference or link to it. Trash and Move warn you about it automatically, before you break something. Search & jump to pages (title, ID, template or a selector), admin screens, templates, fields, modules and users. Every page shows its template and ID — click the ID to copy it. And a few extras: system info and latest errors right in the palette, clear caches, refresh modules, add a field to a template, your own no-code shortcuts in the settings (New event | new /events/ event | editor), pins, dark mode, and ? for built-in help. Is it safe to give to editors? Yes — that was the whole point. Every command, page and field is checked against the user's permissions on the server, every time. Commands use CSRF, risky ones ask first, rich-text fields are never touched, user selectors can't sneak past access control, and changes can be logged. No tables, fields or templates are created — uninstall and it's gone. For developers Add your own commands from any module or ready.php — with arguments, page pickers, confirmations, results in the palette and undo: php $wire->addHookAfter('NativeCommand::registerCommands', function(HookEvent $e) { $e->object->addCommand('orders.open', [ 'title' => 'Open orders', 'mutates' => false, 'handler' => function() { return ['message' => wire('pages')->count('template=order, paid=0') . ' open orders']; }, ]); }); Extra screens: Download Works on any site, any profile, no dependencies. ProcessWire 3.0.200+, PHP 7.4+. Download: https://processwire.com/modules/native-command/ Install, press Alt/⌥+K, type ?. If you run into any problems or bugs, please let me know and if it saves you even one trip through the page tree, I'll call it a win. 🙂 Cheers R
    12 points
  8. Hi all, I'd like to introduce LePdf, a small ProcessWire module that wraps mPDF: you give it HTML, it gives you a PDF. You can show it in the browser, send it as a download, save it to disk, or get it as a string. The mPDF instance stays directly accessible, so nothing is hidden from you. Why another PDF module? I use RockPdf in a few projects, and its development has been discontinued. I wanted something small that I can maintain myself, runs on plain shared hosting, and covers what I actually need: output, download, save. LePdf is an independent implementation. The basic idea (a thin wrapper around mPDF) is inspired by RockPdf. I contacted @bernhard beforehand, and he replied that he has no problem with it and is happy about it. ❤️ LePdf is not a drop-in replacement. There is no backwards compatibility with the RockPdf API. Features write(), css(), renderTemplate(), show(), download(), save(), output() Header, footer, title, author (set globally in the module config or per document) Custom fonts and icon fonts (e.g. FontAwesome) Direct access to the mPDF instance via $pdf->mpdf mPDF is bundled, so no Composer is needed (useful on shared hosting) Module configuration page with an explanation and example for every field Config page translatable with ProcessWire's language system; CSV files for DE, FR, ES, PT, IT, NL are included Quick start $pdf = $modules->get('LePdf'); // every get() returns a new, empty PDF $pdf->write('<h1>Hello</h1><p>This is a PDF.</p>'); $pdf->show('hello.pdf'); // show in the browser and end the script Example: attendance list with a signature column <?php namespace ProcessWire; // check access before anything is generated if(!$user->isLoggedin() || !$user->hasRole('editor')) throw new Wire404Exception(); $event = $pages->get((int) $input->get->id); $rows = ''; foreach($event->participants->sort('name') as $u) { $rows .= '<tr><td>' . $sanitizer->entities($u->name) . '</td><td></td><td></td></tr>'; } $pdf = $modules->get('LePdf'); $pdf->title("Attendance {$event->title}"); $pdf->css('td, th { border: 1px solid #000; padding: 4mm; } th { background: #eee; }'); $pdf->write('<h2>' . $sanitizer->entities($event->title) . "</h2> <table width='100%' style='border-collapse: collapse'> <tr><th>Name</th><th width='15%'>Present</th><th width='35%'>Signature</th></tr> $rows </table>"); $pdf->show('attendance.pdf'); The admin configuration page Requirements PHP 7.4 or newer (bundled mPDF 8.3 supports up to PHP 8.5) ProcessWire 3.0 or newer PHP extensions mbstring and gd; zlib recommended Installation Copy the folder to site/modules/LePdf/, then Modules > Refresh > install LePdf. Details are in the README. Status Version 0.1.0, early. I tested it manually on PHP 8.5 on shared hosting; the automated tests (which run without ProcessWire) run on PHP 8.3. Real-world testing on other setups is exactly what I'm missing. Notes LePdf does not check permissions and does not escape HTML. Access control and escaping belong in your template (see the README). The translations were created with AI assistance and have not been reviewed by native speakers. Corrections are welcome. Feedback I'd be glad about bug reports, test results on other hosting setups, corrections to the translations, and ideas for what should come next. I'm deliberately keeping version 1 small. License LePdf is MIT. The bundled mPDF is GPL-2.0-only (see lib/THIRD-PARTY.md in the repo). GitHub repository
    12 points
  9. Hi everyone, A visual menu builder for ProcessWire has been on my to-do list for a long time, and it’s finally ready. Meet NativeMenu: you build every kind of menu visually, with drag & drop and no code. Simple dropdowns, mega menus and a logo in the middle are all possible. What it does Visual editor. The menu bar is edited as it looks. Drag elements or pages from the tree onto it, click an item to edit it, double-click to rename. Undo/redo, drafts, versions and a live preview are included. Mega menus. Columns with a 12-unit grid. Blocks: links, headings, text, images, latest articles, buttons, search and HTML. Mobile. Drawer (left/right), fullscreen or push-down menu. Submenus open as an accordion or as slide-in panels. Each mega menu has its own mobile layout. Design without CSS. Style presets, colors, background, gradient or image, border, shadow and font. “Match my website” reads colors and fonts from your template. Bootstrap 5, UIkit 3 and plain markup are supported, and every class can be overridden. Effects. Dropdown animations (fade, slide, grow, unfold, reveal), hover effects including a sliding indicator, a sticky / shrinking / hide-on-scroll header and an animated menu button. Smart import. Paste the menu HTML of any template, or give a URL. Links are matched to your real pages, and the original markup can be kept. An optional AI assistant can build a menu from a description or match the remaining links. One menu, many outputs. The same menu can also be rendered as footer columns, breadcrumbs (with JSON-LD), an HTML sitemap, an “In this section” sidebar, or as raw data for custom markup. Multilanguage. Labels and URLs per language, page items follow the page title and URL in each language, and there is a language switcher with hreflang. SEO / GEO. Clean <nav> markup and schema.org SiteNavigationElement. rel attributes per item. /llms.txt generated from your menus, per language. Check tab. Flags broken links and pages that were deleted, unpublished or hidden. Flags missing translations, alt texts and low color contrast (WCAG). External links are checked daily. More: show items only on certain pages or templates, scheduled items (from / until), visibility by role, anonymous click statistics (with NativeAnalytics integration), a library of reusable blocks, and a one-click offer to add new pages to the menu. AI assistant (optional) NativeMenu includes an optional AI assistant. It works with Anthropic (Claude) or any OpenAI-compatible API, including Azure, Mistral or a local server. Enter your API key in the module settings to switch it on. Build a menu from a description. In the import dialog, choose Describe (AI) and write what you want. For example: "Main menu with Home, a mega menu 'Services' with one column per category and an image, About us with its subpages, Blog, and a 'Contact' button on the right." The AI only uses pages that exist on your site, so every link works. Match links when importing a template. After a template import, links that could not be matched get an Ask AI to match button. The AI finds the right pages even across languages (e.g. "O nas" → "About us"). Every match it finds is marked "to check". You always review first. Proposals appear in the same review table as a normal import, and nothing is saved until you confirm. Private. Only page IDs, paths and titles are sent to the provider, never page content or user data. Requests are limited to 30 per user per hour. Extendable. NativeMenuAI::request is hookable, so you can connect any other provider. Usage php <?= $modules->get('NativeMenu')->render('main-menu') ?> <?= $modules->get('NativeMenu')->renderColumns('main-menu') ?> // footer <?= $modules->get('NativeMenu')->renderBreadcrumbs('main-menu') ?> CSS and JS are added automatically, only on pages that show a menu. Menus are cached per language and role, and the cache is cleared when a page in the menu changes. Requirements: ProcessWire 3.0.200+, PHP 7.4+ (tested on 8.3). It works with the Uikit (incl. Konkat light/dark), Reno and Default admin themes. Install: copy the folder to /site/modules/NativeMenu/, install the module and open Setup → Menus. Feedback and ideas are very welcome! Download: NativeMenu-1.0.6.zip Enjoy R
    11 points
  10. Messenger is a private messaging module for ProcessWire. It adds direct member-to-member conversations, message requests, moderation tools, encrypted storage, notifications, and administrative broadcasts. Main features Private one-to-one conversations between ProcessWire users Message Requests with accept and decline actions Unread message counters and read state Conversation search and recipient search Message editing, deletion, and hide-for-self controls Archive, restore, mute, and unmute actions Directional user blocking Abuse reports with preserved evidence Temporary messaging restrictions Administrative broadcasts to all eligible members or members with a selected role Recipient preview and explicit confirmation before a broadcast is sent Idempotent batch delivery that prevents duplicate broadcast messages Broadcast progress, cancellation, history, and delivery statistics Optional email notifications through a selectable WireMail provider Responsive frontend and ProcessWire administration interface Support for semantic styles, Designsystemet, UIkit, Bootstrap, Tailwind CSS, and custom frontend mappings Same-origin REST API with session authentication, CSRF protection, rate limiting, and private no-store responses Public PHP API, documented hooks, examples, and a bounded local maintenance CLI Privacy and security Message bodies, report comments, preserved evidence, report resolutions, and broadcast source messages are encrypted at rest using libsodium XChaCha20-Poly1305 authenticated encryption. Messenger uses a dedicated messengerEncryptionKey when configured, with ProcessWire’s tableSalt available as a fallback. Encryption keys are never stored in Messenger database tables. The module provides encryption at rest. It does not claim to provide end-to-end encryption. Permissions are separated between moderation, evidence access, administration, export, and permanent deletion. Uninstalling the module retains private messaging data rather than silently deleting it. Administration The ProcessWire administration workspace includes: Operational dashboard Reports queue and status filters Preserved evidence review Member restrictions Administrative broadcast composer Exact recipient preview Broadcast delivery progress and history Notification provider selection Encryption health information Retention and messaging limits Broadcasts appear as normal encrypted private conversations from the administrator who created them. The selected audience is snapshotted before delivery, and changing the message or audience after preview requires another recipient check. Links GitHub repository API documentation Usage examples Feedback, testing reports, and suggestions are welcome.
    11 points
  11. FormBuilderBlacklist – content-based spam filtering for FormBuilder FormBuilderBlacklist checks the content of submissions against blacklists and a few spam heuristics. It's a companion to FormBuilderAltcha: ALTCHA keeps bots out, and this one catches the spam that still gets through, for example from humans or bots that run JavaScript. Checks (all configurable per form) Keyword blacklists: gambling, medication, merchandise, trading, software, services, hosting, URLs, injection and more. Each list can be enabled on its own, and keywords only match as whole words. Disposable email addresses, using mailchecker Maximum number of links per submission BBCode and HTML links ([url=…], <a href…>) Foreign scripts: flags text that is mostly Cyrillic, CJK, Arabic or Thai Fields to check: all text fields or only the ones you select You enable it under Actions › Filter spam › Blacklist & content check. FormBuilder's own setting "What should happen when spam is detected?" decides what happens to a match: discard silently, show an error, or save it as a spam entry. If you turn on logging, matches are also written to form-builder-blacklist. The module is translatable, and a German translation is included. Requirements: PHP 8.1+, ProcessWire 3.0.200+, FormBuilder You don't need Composer, because all dependencies are bundled. To install, use Modules › New › Add Module From URL: https://github.com/pmichaelis/FormBuilderBlacklist/archive/HEAD.zip GitHub: https://github.com/pmichaelis/FormBuilderBlacklist The blacklists come from IQAndreas/php-spam-filter. If you run into false positives or have suggestions for the lists, please let me know.
    9 points
  12. Just an FYI that the latest version of TracyDebugger includes support for SQLite and Postgres in AdminNeo.
    9 points
  13. Hi everyone, I’ve released WireMail Google, a new WireMail module for sending ProcessWire email through Gmail or Google Workspace. The module is intended for sites that need straightforward Gmail delivery without creating a Google Cloud project or configuring OAuth. You only need the Google account email address and an App Password. Features Works with ProcessWire’s standard $mail and wireMail() APIs Gmail and Google Workspace support Mandatory certificate-verified STARTTLS Encrypted App Password storage Plain-text and HTML messages Reply-To, CC, BCC and custom headers File attachments Unicode subjects and sender names Native ProcessWire configuration interface Connection diagnostics and privacy-safe operational logs For contact forms, a visitor address passed to from() is automatically used as Reply-To. The configured Google account remains the actual sender, which avoids Gmail sender-policy problems. $sent = wireMail() ->to('owner@example.com') ->from($visitorEmail, $visitorName) ->subject('Website enquiry') ->body($message) ->send(); The diagnostics screen can verify DNS, TCP connectivity and certificate-validated STARTTLS without authenticating or exposing the App Password. This is the first public release. It has been tested with authenticated Gmail SMTP delivery, HTML and plain-text messages, attachments, responsive ProcessWire Admin layouts, and both light and dark admin themes. Repository and documentation: https://github.com/mxmsmnv/WireMailGoogle Compatibility: ProcessWire 3.0.184+ and PHP 8.1+ License: MIT Feedback and testing reports are welcome.
    8 points
  14. @ryan same here. Keep your head up and fight for what you deserve. Life first in these situations.
    7 points
  15. Floating Page Save adds a floating copy of the native Save control to ProcessWire’s page editor so it stays within reach while you scroll long pages. GitHub: https://github.com/dlzi/FloatingPageSave
    5 points
  16. AdminThemeBridge 0.9.5 is out Thanks to everyone who tried the beta in its first day and sent reports, here in the thread and by PM. Every report below was reproduced on a clean ProcessWire install with the module in question, then fixed and covered by a test. Modules that use UIkit now work Some modules use UIkit directly, because AdminThemeUikit loads it on every page: grids, cards, modals, UIkit.notification(). Under Bridge there was no UIkit, so those screens looked broken. Special thanks to Matjaž Potočnik, who reported it for his ProcessShowcase module. Its UIkit page compares the admin theme with stock UIkit side by side, which made it the perfect test for this release. Bridge now has a UIkit layer, built the same way as its jQuery bridge: it loads only on the pages that need it. A page needs it when its content uses UIkit markup, when a module script calls UIkit, or when a module adds UIkit's files. Core screens never load it. UIkit's own stylesheet, recoloured with Bridge's colours, so it follows the light and dark scheme, and it can never restyle Bridge's own parts. Core's own UIkit script, so modules get the same UIkit version as under Uikit. A UIkit.something() call made before the layer has loaded still works: the layer loads and the call runs. A new setting in the module's config, "UIkit for modules written for AdminThemeUikit": load only on pages that use UIkit (the default), always, or never. Module authors can ask for it explicitly with $adminTheme->needUikit('YourModule'), and the reasons are hookable (uikitReasons()). Fixes Third-level menus (Pages > Tree > a page with children) opened inside their parent menu instead of beside it. The Add New button at the top of Setup > Templates did nothing. The same went for other list screens with an Add New button. With $config->debug on, the Debug Mode Tools panel didn't work on most pages. It now opens in a dialog on every page. TracyDebugger's bar ran off the left edge of the screen on a phone. In the page editor, the View tab's menu sometimes showed open below the form. Updating Replace site/modules/AdminThemeBridge/ with the new version from https://github.com/theoretic/AdminThemeBridge (or git pull there), then Modules > Refresh. The full changelog is in the development repo at https://github.com/theoretic/bridge . Still open The UIkit layer doesn't support right-to-left layouts yet. I've tested it with ProcessShowcase and the modules on my own sites. If a module that uses UIkit still looks wrong, please post a screenshot and the module's name. Keep the reports coming. A module that misbehaves under Bridge is exactly what I'm looking for 😉
    5 points
  17. PW runs just fine with PHP 8.5. I honestly can't understand why everyone hasn't been running 8.5 since its release (or very shortly after). If you're on shared/managed hosting and they don't support new versions in a timely manner, find a new host, or take the time to learn how to manage things yourself - even if you have no experience, it's a no brainer now with AI agents to guide you step by step (or even do it for you). I run 8.5 everywhere and had all my servers patched within minutes of the release this morning. 8.6 is due next month and if you skip versions it just gets harder and harder to update. And, again, AI agents can easily scan your code and find things that need updating and fix them in no time.
    5 points
  18. @theoretic - I absolutely love the idea of removing all those huge layers of cruft from the PW core, but I'll say what I have said whenever someone releases a new AdminTheme - it won't get used unless it's the core theme. But given the way you've built it so that it only loads legacy components as needed by other modules, perhaps it really could become the new core theme. I haven't tested it yet, but if it works flawlessly in that regard, I'd love to get behind it.
    5 points
  19. A ProcessWire field for self-hosted video files. Editors upload large videos in the page editor, add captions, chapters and overlays, and the website shows them in an accessible player with structured data for search engines. The videos stay on your own server, with no external platform and no cookies. This means you're completely independent of third-party services and retain full control over your videos. For more information visit https://github.com/juergenweb/FieldtypeSelfHostedVideo If you encounter any bugs, please report them here or directly on GitHub. This module was created with Claude AI.
    5 points
  20. Hi Following the release of Palette for MediaHub, the next companion module is here. MediaHub AI brings provider-backed AI tools to your MediaHub fields, starting with AI-generated ALT text for your images. What it does MediaHub AI adds an AI tools group to the MediaHub Actions panel. For any image in a MediaHub field or on the media library detail page, editors get: Quick Alt: one click, one result. The AI analyses the image and writes a ready-to-use ALT description instantly. 3x Options: asks for three alternatives so you can pick the best fit for the context. SEO / preferred words: type in terms you want included before generating. Works best for words that truthfully fit what is in the image; anything that does not fit is left out. Shorten: trims a chosen alternative to around 125 characters in one click. Apply: writes the result straight into the ALT field. Save the page to keep it. This first release works on one image at a time and generates ALT text in English. A multi-language version is already in testing and will follow shortly. Backend config settings All settings live in Modules > MediaHub AI: Filename and title as context Passes the image title and words from the filename to the AI as a hint. Only visible, meaningful words are used; camera codes and numeric IDs are ignored. Site context A short paragraph of house style or site facts sent with every request. Editors can override this per-image using the SEO words field in the dialog. Output language Tells the AI which language to write in. On multilingual sites, each language tab gets its own name so the AI writes in the right one. Provider credentials (API key, model, provider name) are set in config (for now). Supported providers at launch: OpenAI, DeepSeek, and any OpenAI-compatible endpoint (bring your own key). $config->MediaHubAI = [ 'provider' => 'openai', 'providers' => [ 'openai' => ['apiKey' => 'sk-...', 'model' => 'gpt-4.1-nano'], ], ]; Free companion, same install pattern as Palette Like Palette, MediaHub AI is a free companion. Install it alongside MediaHub, add a $config->MediaHubAI block to config with your provider key, and the AI tools group appears in the Actions panel automatically. No field or template changes needed. More AI applications will follow. Thanks @Stefanowitsch for the suggestion 🙂
    5 points
  21. Hi everyone, a while back, I introduced the food blog I built for my wife here on the forums (original post). As the site has grown continuously over the years, it was time for a comprehensive relaunch: a fresh responsive look, streamlined editorial workflows, and a modern technical architecture under the hood – 100% bespoke, without any page builder compromises. The new version is now live at dothiscookingthing.de. Here is a quick look behind the scenes and the tech stack we used: 1. Backend & CMS Architecture On the backend side, ProcessWire shines as the flexible, tailor-made CMF we all love: Custom Page Classes (usePageClasses = true😞 Instead of packing business logic into template files, we use dedicated Custom Page Classes (e.g. RecipeItemPage, TagPage, etc.). This keeps the codebase modular and maintainable – perfect for generating structured data automatically (Schema.org JSON-LD for recipes, including prep/cook times and nutrition facts). Functions API (useFunctionsAPI = true😞 Keeps the template and component code concise, readable, and clean. Custom Content Architecture with Repeater Matrix: The homepage and other content pages utilize Repeater Matrix to manage sections flexibly while adhering to a strict, structured layout. Every block (hero banners, dynamic feeds for popular or hidden-gem recipes, ingredient showcases, action teasers, etc.) has its own dedicated PHP render template, meticulously aligned with our typography and design system. 2. Frontend, Interactivity & User Experience For the frontend, our primary focus was on blazing-fast performance, accessibility, and thoughtful micro-interactions: Tailwind CSS v4: Built with the new Tailwind v4 CLI, using custom design tokens via @theme (bold typography with Jost for headlines and Inter for ingredients and body copy). Reactive Features with Alpine.js: Dynamic Serving Calculator: Visitors can scale ingredient quantities up or down depending on the desired number of servings directly on recipe pages. Bookmark / Favorites Feature: Users can save recipes for later. Clicking the bookmark trigger sets off a subtle animation on the bookmarks icon in the main navigation, giving immediate visual feedback. Custom Dialog & Toast Containers: No native browser alert/confirm dialogues; everything uses unobtrusive, custom UI notifications styled to match the site. HTMX for Asynchronous Interactions: Used selectively where dynamic updates make sense without loading a heavy JavaScript framework – for instance, driving the live search. Locomotive Scroll: Provides a smooth, contemporary scrolling experience across the entire site. PWA & Offline Support: A lightweight service worker handles caching and ensures dependable performance, especially on mobile devices right in the kitchen. 3. Editorial Experience Making day-to-day content creation seamless for my wife was a top priority: Clean, structured separation of ingredients, preparation steps, nutritional values, and metadata in ProcessWire fields. Deep cross-linking: Alongside traditional categories and tags, we built an ingredients glossary (Zutaten-Lexikon) that automatically connects related recipes. A customized admin theme tailored to keep adding and editing recipes fast, clean, and intuitive. Conclusion & Feedback ProcessWire has once again proven how future-proof and adaptable it is: Content structures that evolved over years were seamlessly migrated into modern classes and templates without having to rebuild everything from scratch. Feel free to check it out: dothiscookingthing.de We’d love to hear your thoughts, feedback, or any questions about the technical implementation!
    5 points
  22. Automatically generate captions and transcripts for audio and video files using the Speechmatics API. You can find the module on Github, or in the ProcessWire modules directory (submission pending). A ProcessWire CMS module that watches selected file fields, submits supported media files to Speechmatics for transcription, and automatically saves the resulting WebVTT .vtt caption files back into ProcessWire. Once configured, editors upload audio or video files as usual. The module handles the transcription workflow in the background and stores the returned caption files in a set field, ready for use. Why use this module? Automatic caption generation for uploaded media Supports both audio and video files Bring your own Speechmatics API key Stores standard WebVTT (.vtt) caption files Minimal editor involvement once configured Allows for caption files to be tagged as a 'draft' Improves accessibility and compliance for your media Integrates directly into existing ProcessWire content workflows Requirements PHP 7.3+ ProcessWire 3.0.244+ FFmpeg installed on the server A Speechmatics account and API key An allowed connection between your web server and the Speechmatics API endpoint (both ways, to send the file and recieve a callback) How it works An editor uploads an audio or video file to a configured file field The module detects the new media file on page save The file is submitted to the Speechmatics transcription API Speechmatics processes the media and generates captions A WebVTT (.vtt) caption file is returned via a webhook The caption file is automatically saved into the configured ProcessWire file field The captions are available, optionally tagged to indiciate they have not been reviewed yet Configuration URL to the Speechmatics API Allows you to change the URL used for the Speechmatics API, usually the default is fine. Speechmatics API Key Enter your Speechmatics API key. The module will validate the key when the configuration is saved and display an error if it cannot authenticate with the Speechmatics API. Callback URL Specify the URL in which you would like to recieve the callback from Speechmatics once a job is complete and ready to import. On saving, the route will be tested to ensure it does not conflict with an existing page. Path to FFmpeg The path to run the FFmpeg CLI tool. This is used to strip audio from video files to save bandwidth communicating with the API. Model Allows you to choose which Speechmatics model to use, between 'Standard' and 'Enhanced'. Language The language that content is in. See a full list of ISO language codes. Only 2 letter codes are supported, use en instead of en-US for example. Output Locale Language locale to be used, normally specified as an ISO language code. See a full list of ISO language codes. Full length language codes are supported, like en-US. Content File Field Select which field stores the audio/video file to be sent to Speechmatics for transcription. Only files uploaded to this field will be processed. Caption Output Field Select the file field that should receive generated .vtt caption files. The module will automatically save caption files here once transcription has completed. Caption File Field Select which field to store the .vtt caption file from Speechmatics. Tags to skip Allows you to choose which files are skipped from being transcribed. Can be helpful to skip processing files that are have no dialog, or have another reason to be skipped. Tag to give files that have no dialog Choose what tag is given to media files that have no transcribable dialog detected. Handy for ensuring they are not sent to Speechmatics for repeat processing needlessly. Tag to give caption files that have been added Choose a tag to give any captions files that have been added. handy for tracking drafts that need a review before being used. Phonetic "sounds like" suggestions Allow a list of custom words to be added for each transcription job. This helps when a specific word is not recognised during transcription. Format as a comma seperated list, where the first phrase/word is the correct spelling and the following words/phrases are what it may sound like. Every new line is a new word. Example: gnocchi,nyohki,nokey,nochi The first word is the intended word, following are phonetic phrases the word may sound like. Using this module You can hook the SpeechmaticsTranscription::saveCaptionsToPage to trigger actions when captions are being returned and saved to a page. This can be useful for triggering notifications when captions are ready, such as an email using WireMail. /** * Example of a notification to the author whenever * captions have been added to a page */ wire()->addHookAfter('SpeechmaticsTranscription::saveCaptionsToPage', function (HookEvent $e) { $page = $e->arguments(0); if ($page->id === 0) { return; // null page, cancel notification } // Email body $emailBody = <<<HTML <p>New automated captions have been uploaded for the <em>$page->title</em> page on the <a href='$page->httpUrl'>$page->title</a> page.</p> <p>Edit: <a href='{$page->editUrl(true)}'>$page->httpUrl</a></p> <p>Please review the draft caption file, make any edits necessary and remove the ‘draft’ tag when they are ready to use.</p> HTML; // Send email using WireMail wire('mail') ->to('firstname.lastname@example.com') ->from('noreply@example.com') ->subject("A page has new captions to review") ->bodyHTML($emailBody) ->send(); }); Let us know how you go using this module! We've found it rather useful.
    5 points
  23. Yep this is still a somewhat critical problem; Happening today.
    4 points
  24. Redesign 2026 is live now 🥳 https://www.captiva-power.de/
    4 points
  25. FormBuilderAltcha – self-hosted ALTCHA spam protection for FormBuilder Spam protection for ProcessWire FormBuilder forms using ALTCHA. I've released a small module that adds ALTCHA proof-of-work spam protection to FormBuilder forms. Before a form is submitted, the visitor's browser quietly solves a small computational challenge. The server only accepts submissions with a valid solution that hasn't been used before. Bots that post forms directly or don't run JavaScript get rejected. Features Fully self-hosted: no external service, no API key, no cookies No image puzzles for your visitors Enabled per form under Actions › Filter spam › ALTCHA Three difficulty levels (about 0.2 s, 0.5 s or 2 s) Two display modes: a checkbox above the submit button, or a popup that appears on submit Replay protection, so each solution can only be used once Optional logging of failed checks (form-builder-altcha) Test mode to simulate failures. It only applies to logged-in FormBuilder users, so visitors are never affected Translatable, with a German translation included. The widget follows the language of the current page. Requirements: PHP 8.1+, ProcessWire 3.0.200+, FormBuilder, HTTPS You don't need Composer, because all dependencies are bundled. To install, use Modules › New › Add Module From URL: https://github.com/pmichaelis/FormBuilderAltcha/archive/HEAD.zip GitHub https://github.com/pmichaelis/FormBuilderAltcha Feedback and bug reports are welcome!
    4 points
  26. Hi @maximus, First of all, thank you for developing and sharing this module! It looks like a great and clean solution for consent management in ProcessWire. I'd like to propose a feature request regarding consent granularity: allowing users to toggle individual services on or off, rather than only consenting to entire categories (e.g., Marketing, Statistics, Functional). Why this matters: Legal Compliance (GDPR / ePrivacy): In several EU jurisdictions, data protection authorities and courts increasingly require granular consent per third-party service/processor rather than broad, category-wide bundling. Better User Experience & Control: Visitors often want to allow a specific service (like an embedded YouTube video or Google Maps) without necessarily agreeing to all other marketing or tracking services listed under the same category. As an example, platforms like Usercentrics handle this by providing expandable category accordions where users can toggle the whole category or expand it to individually toggle services like Google Fonts, YouTube, or analytics tags (see attached screenshot). Would it be technically feasible to introduce an optional granular service-level toggle to the module's roadmap or architecture? Thanks again for your work!
    4 points
  27. ProcessWire adds SQLite and PostgreSQL support. This week on the dev branch (3.0.274) you can now install and run ProcessWire on SQLite or PostgreSQL, in addition to MySQL. Read more in this blog post: https://processwire.com/blog/posts/sqlite-and-postgresql
    4 points
  28. Indeed. Here's my running list of the major additions to ProcessWire in the last few months: + MAJOR FIXES + delete speed + subselectors + deadlocks / + CLI Modules + CLI Installer + WireTests + Agent Tools module + Migrations + Skills all the new markdown files + Database Abstraction Sqlite and Postgres + Web Servers Nginx and Caddy I'm utilizing all of them (well not the DB and web server stuff yet, but soon). My queue module will fit in nicely... but hey, if there were a native, standard queue module that would be fantastic too. Truly amazing.
    4 points
  29. I have got claude to make a WYSIWYG input field module using jodit, keeping as close as possible to the original TinyMCE integration, I plan to use it temporarily until a longer term fix comes from upstream. I've made it public in case that's an acceptable solution for anyone else. https://github.com/castusdesign/pw-module-inputfield-jodit
    4 points
  30. Hi, Thank you for the detailed report and clear reproduction steps. I confirmed the issue and have released MCP Server 1.0.5 with the fix. Scopes are now checked immediately before each tool invocation, with audit recording at that boundary. JSON-RPC batches are rejected for all protocol versions; single-message legacy clients remain supported. I’ve added regression tests covering the reported bypass and audit behavior. Thanks again for catching this!
    3 points
  31. Hi everyone, I’m happy to share the first public release of Kontor, an open-source modular ERP, CRM and business operations platform built natively for ProcessWire. Kontor is not intended to turn ProcessWire into one rigid business application. The goal is to provide reusable business components that can be combined according to the needs of a particular website or organization. Business software should become part of the ProcessWire site, rather than forcing the site to become part of a separate business platform. Kontor 1.0.0 contains 35 components. They share one audited core, one organization model and one permission-aware admin workspace, while remaining separately installable. Customers and revenue Contacts — contacts, companies, addresses, company memberships, tags, duplicate detection and import/export foundations. CRM Intake — configurable qualification forms for contacts, leads and deals, including required fields, validation rules and field bindings. CRM — leads, pipelines, stages, deals, lead-to-deal conversion, Kanban data and pipeline reporting. Catalog — products and services, categories, price lists, price entries, units of measure and tax-code references. Sales — quotations, orders, shared document lines, status workflows and quotation-to-order conversion. Invoices — invoices, numbering, issue workflow, overdue state, credit-note foundations and order-to-invoice conversion. Payments — payments, invoice allocations, partial payments, reversals and idempotent provider-integration boundaries. Finance and localization Ledger — double-entry accounting foundations, chart of accounts, journal entries, ledger lines and balances. Germany — German localization contracts, chart-of-accounts support and country-specific business-document formatting. Operations and project work Inventory — warehouses, balances, stock movements, reservations, transfers and barcode support. Purchasing — suppliers, purchase orders, receipts, receipt lines and inventory integration for received goods. Expenses — expense categories, expenses, receipt associations and approval workflows. Projects — projects, milestones, time tracking, billable items and invoice integration. Tasks — tasks, reminders, recurrence, calendar-oriented data and links to business entities. Collaboration, content and customer access Collaboration — notes, threaded comments, mentions, followers, notifications and unread state. Dashboard — widget registry, personal dashboards, role dashboards and configurable layouts. Reports — report-provider registry, report builder, charts, exports, scheduled reports and queued delivery. Documents — versioned document templates, HTML/PDF rendering, multilingual output and immutable issued-document snapshots. Files — private local storage, file metadata, signed temporary URLs, versions and a provider contract for external storage adapters. Mail — outbound history, inbound adapter contracts, shared mailboxes and links between messages and business entities. Portal — customer authentication, quotations, invoices, payments, files, signed downloads and profile access for self-service workflows. Platform, extensibility and integrations SDK — shared contracts, DTOs, event envelopes and value objects, plus conventions and scaffolding tools for new components. Workflow — a reusable state-machine engine with definitions, transitions, permissions, approvals and immutable history. Automation — event-driven rules with triggers, conditions, actions, dry runs, execution logs and recursion protection. Queue — asynchronous and delayed jobs, priorities, retries, progress, a dead-letter queue, handler registry and CLI worker. Cache — namespaced cache access, tag-based invalidation, an in-memory implementation, a ProcessWire adapter and an optional Redis adapter. Search — federated global search, provider and indexer registries, SQL full-text support and asynchronous indexing. Settings — versioned, secret-free workspace settings export, validation, preview and controlled import. Custom Entities — an entity builder with configurable fields, relations, views, permissions and optional API exposure. Marketplace — official and custom component registries, package metadata, publisher trust, security advisories and installability checks. API — bearer-token authentication, organization-scoped CRUD resources, filtering, field projection, OpenAPI, webhooks and idempotency at /api/kontor/v1/. GraphQL — a component-aware schema registry, query execution, permission enforcement and complexity limits at /graphql. MCP — 13 scoped tools for status, discovery, search, record operations, settings migration and API description, with permission and idempotency boundaries. AI — a provider-neutral layer for summaries, drafting and structured extraction, with previews and approval boundaries before sensitive actions. Demo — a connected order-to-cash reference scenario spanning Contacts, CRM, Catalog, Workflow, Sales, Projects, Files, Mail, Invoices, Ledger and Payments. Core and admin workspace The root Kontor module provides the shared service container, organization model, component and capability registries, migrations, audit log, backup and recovery, health checks, import/export and dependency management. ProcessKontor provides the unified ProcessWire admin workspace. Navigation is assembled from the components that are actually installed and the permissions available to the current user. Kontor uses ProcessWire modules, permissions, hooks and the admin interface. It does not replace ProcessWire’s frontend model. The site profile remains responsible for public templates, presentation, routing choices and project-specific composition. A project can install only the components required by its Blueprint. Supported public PHP methods and integration boundaries are documented in API.md; internal ProcessKontor admin handlers are not treated as a public site API. Current status This is version 1.0.0 and the first public release. I still recommend treating it as a testing release until it has received feedback from more ProcessWire installations, database configurations and hosting environments. The release-candidate programme currently includes: all 35 components installed and enabled together on a real ProcessWire site; 1,279 automated tests and 4,939 assertions in the documented release-candidate run; package-level unit, integration, migration and contract coverage; installation, historical upgrade, uninstall and reinstall testing; verification that ordinary uninstall preserves business data; permission, role and organization-boundary testing; browser journeys for CRM qualification and order-to-cash workflows; desktop and mobile responsive checks; accessibility, keyboard, browser-console and failed-network checks; REST, GraphQL, Settings and MCP contract coverage; deterministic local substitutes for mail, payment, webhook, AI and object-storage providers. Kontor is not presented as a certified accounting, tax or regulatory-compliance product. Country-specific rules, production-scale performance and real external providers must still be verified for each project. Please install it first on a development or staging copy. Make a backup before installing it into an existing site, assigning new permissions or enabling integrations. Requirements ProcessWire 3.0.240 or newer PHP 8.2 or newer DOM, JSON and ZIP PHP extensions A ProcessWire-supported database Installation Download or clone the repository into site/modules/Kontor/. Run composer install --no-dev inside that directory. In ProcessWire Admin, open Modules and run Refresh. Install Kontor first. Install only the business components required by the project. Assign the smallest required kontor-* permissions to each role. Repository and documentation GitHub: https://github.com/mxmsmnv/Kontor README: https://github.com/mxmsmnv/Kontor#readme Public PHP API: https://github.com/mxmsmnv/Kontor/blob/main/API.md Integration examples: https://github.com/mxmsmnv/Kontor/blob/main/EXAMPLES.md Components and dependencies: https://github.com/mxmsmnv/Kontor/blob/main/docs/PACKAGES.md Testing plan: https://github.com/mxmsmnv/Kontor/blob/main/TESTING.md Release-candidate evidence: https://github.com/mxmsmnv/Kontor/blob/main/E2E_STATUS.md License: MIT Feedback I would especially appreciate feedback about: installation on different ProcessWire, PHP and database environments; admin UX, naming and navigation; permissions and organization boundaries; missing hooks, services or extension points; real-world CRM, sales, finance and operations workflows; REST, GraphQL, webhook and MCP integration; component boundaries or unnecessary coupling; documentation gaps; scenarios that deserve an additional deterministic regression test. This is a large project and a significant personal milestone. My goal is to give ProcessWire developers a flexible foundation for building business applications while preserving the freedom to compose each website in the ProcessWire way. Testing, issues, architectural feedback and ideas are very welcome.
    3 points
  32. I think my head just exploded LOL. Crazy work. I could see someone creating a business/agency to help small businesses for this very thing: a turn-key solution based on Kontor. CRM Intake + Intake could be just the start of a consultant agency. I have been helping get businesses to market for nearly 30 years. In the end, they have 5–6 tools they end up adopting. But the thought of starting—and building upon their needs—using Processwire means everything would be integrated. Non-profits could be a good fit as most aren’t enterprise-level and they require a little hand-holding and boutique-ish, tailored solutions. Thanks @maximus.
    3 points
  33. Hi everyone, we ran into two issues with Redirects on multi-language sites and I've submitted a pull request that fixes both: https://github.com/teppokoivula/ProcessRedirects/pull/28 1. Redirect targets lose their language When the target is a local path to an existing page, the module stores only the page ID (1234). So a target like /en/products/ is shown as the default-language path in the admin list, and on redirect the URL is built in the current language, which is the language of the source URL prefix. In practice: /en/old-page/ → /en/products/ works (by accident) /old-page/ → /en/products/ redirects to the default-language page /en/old-page/ → /products-default/ redirects to the English page The export also contains the wrong paths, so re-importing an export changes the redirects. 2. "The Redirect From URL already exists as a page path" for non-existing paths getByPath() with useLanguages also returns partial matches. A non-existing source like /en/old/shoe/ matches any page whose English name is shoe, and since $page->name is the default-language name, the check rejects the redirect. Adding the same redirect via CSV import works, because the import doesn't run this check. What the PR does Page targets are stored as [page ID]:[language ID] and resolved with localHttpUrl(), so the language is kept and redirects still follow renamed or moved pages. An exact page/language lookup replaces thegetByPath() check, which fixes the false positive. The edit form gets a language select next to the page picker, and the instructions explain the multi-language usage. Fully backwards compatible: existing redirects and single-language sites behave as before, no database changes. Tested on a fresh PW 3.0 install (PHP 8.3) and on a live multi-language site. Until it's merged, you can grab the module from the branch: https://github.com/frameless-at/ProcessRedirects/tree/multilanguage-targets Feedback welcome! Cheers, Mike
    3 points
  34. I am very curious too what happened to this module. From time to time I am in the need for a e-commerce solution for clients in germany.
    3 points
  35. forgot some few little insides for those of you who are interested: Features - Product import from Shopware 6: ~16,500 product pages. New products are created in batches of 100, with six queries per batch. The online status is synced set-based in SQL in one transaction - FPS calculator: estimated frame rates for 9 games at 3 resolutions from GPU and CPU indices (44 GPUs, 141 CPUs), rendered server-side - Gaming event calendar: a cron checks each date on the organiser's site - Dealer locator: ~1,100 stores, searchable by 16000+ postcodes. A cron rebuilds the data and refuses to replace it with a suspiciously small file - Drivers and downloads: assigned automatically by matching the GPU in the product data, and available through a small read-only API - PDF data sheets per product, in both languages - Game-code redemption for PC buyers, tied to serial numbers from the ERP Redis - We cache rendered fragments, not pages. Every key carries the language and date - The nav is keyed by $page->rootParent: 5 entries instead of thousands - Never cached: form pages (CSRF), logged-in users, search terms over 40 characters Frontend - UIkit 2 and jQuery are gone (~290 KB of JS). 200+ legacy content blocks with UIkit markup still render through a scoped layer that rebuilds only the 20 patterns they use. No database changes - Filters: series, CPU, GPU, RAM, storage, OS, price range and promotions, each option with its hit count. They apply via AJAX, "Load more" replaces pagination, and the server renders the product grid once for both cases - Filter results are cached under a key built from $input->whitelist(), sorted and hashed, so parameter order or unknown parameters can't create new entries - Product images: 80%+ of products share one central image pool, tagged by variant code Sitemap 9000+ discontinued products stay reachable but left the sitemap, via a Page::viewable hook that only exists during /sitemap.xml. Thanks Ryan and everyone, ProcessWire made this fun to build !
    3 points
  36. Fixed a bug where picking a page template in Design Studio could stop the settings page with a selector error. Also colors now match selected preset. Sorry about that! Just update the module. 🙂 If anything still looks off, let me know. We'll see about git ... 😉
    3 points
  37. @eutervogel Just curious, do you have a release date in mind yet? It would be a shame if the e-commerce module were put on hold.
    3 points
  38. These are some massive gains in very short timeframes, Ryan. You're blowing through requests, issues, and the like! It's quite impressive what you've accomplished in such a short time. With the extreme speed of these code changes, I do have to ask the question: With the significant speed of sweeping code changes and additions, what will be the new marker for a stable release? There's now some test coverage, but there's also such a high change rate of code, being able to declare a dev tag as stable might not be as easy since there's less time for users to test out interim changes. To be honest, I'm not terribly worried considering the new changes are expected to increase stability and code coverage, but I was curious what a new stable/master might be coming, and that then had me ask - how would stability actually be determined? 😄 Enjoy the trip to Amsterdam! Hopefully you'll see some community members and get to grab a beer or a walk, or both! Official support for nginx and SQLite are huge milestones.
    3 points
  39. Hi everyone, I'd like to share a small module for module developers who ship their modules with language files: LanguageCSVExporter. The problem ProcessWire's translation tools are great for translating one file at a time. But if you want to ship your module with a language pack, you have to collect the translations of all its files by hand. Most modules have many files (fieldtypes, inputfields, helper classes, …). What the module does It adds a page under Setup > Language CSV Exporter. Select a module and a language, click Download translations as CSV, and you get one CSV file with all translations of that module, e.g. FrontendForms-de-translations.csv. You can put the file straight into the languages/ folder of your module, and ProcessWire offers it for installation ("install translations") on the module info page. Features Uses ProcessWire's own LanguagePorter, so the CSV rows are byte-identical to the core export and can be imported again as usual Separates modules that share one folder: a main module and a companion module (e.g. FrontendForms and FrontendFormsManager), modules in subfolders, and renamed folders like Name-main from a GitHub download Also exports translation files copied by RockLanguage that are not listed on the language page No temporary files: the CSV is created in memory and sent directly to the browser Works in debug mode (PHP notices don't end up in the CSV) Own permission (language-csv-exporter) to control who may export All texts translatable, German translation included Unit tests (PHPUnit) and WireTests included Requirements ProcessWire 3.0.264+ (for LanguagePorter), LanguageSupport, PHP 7.2+ Download https://github.com/juergenweb/LanguageCSVExporter Feedback and bug reports are welcome!
    3 points
  40. FormBuilder GPT-Live lets visitors complete a form through a conversation. It adds a voice assistant to your ProcessWire FormBuilder forms. Visitors can explain what they need in their own words, answer follow-up questions and watch their answers appear in the form. They can read the conversation, correct what was heard and check the completed fields before sending. The ordinary form is always available too. Read more and download from https://github.com/clipmagic/FormBuilderProcessorGPTLive
    2 points
  41. Just posting this in case anyone else is running a PW site with a Plesk and Cloudflare combo. This one bit me for months and it's relatively difficult to catch. Our dashboards were green, consultants were telling us it was an SEO issue, advertising reps told us we simply needed to increase Ads budgets. At the end of the day, the falling traffic and conversions was much more insidious. I've asked AI to summarise below. Heads-up if you run a Plesk VPS behind Cloudflare: check that Fail2Ban isn't banning Cloudflare itself. The mechanism: with Cloudflare proxying, every request reaches your server from a Cloudflare edge IP, not the visitor's. Plesk's default Fail2Ban jails (ModSecurity, Apache, recidive) count failures per source IP. So when some bot scans your site for exploits through Cloudflare, Fail2Ban sees a burst of bad requests from one "IP", which is really a Cloudflare edge serving thousands of innocent visitors, and bans it. Every visitor routed through that edge then gets Cloudflare's "521 Web server is down" page, while the site works perfectly for everyone else. On one server the recidive jail had escalated to 7-day bans, so roughly 1 in 20 requests failed for six weeks; The server looked healthy from the inside the whole time: load near zero, almost no 5xx in its own logs, because the banned requests never reached nginx. The fix is two Plesk settings, no code. Note: triple check these before adding them at your own risk. Tools & Settings → IP Address Banning (Fail2Ban) → Trusted IP Addresses: add all of Cloudflare's published IPv4 ranges (cloudflare.com/ips, 15 of them). Fail2Ban then ignores edge IPs entirely. Per domain, Apache & nginx Settings → Additional nginx directives: a set_real_ip_from line for each of those ranges plus real_ip_header CF-Connecting-IP;. nginx then logs the real visitor IP, so if Fail2Ban does ban someone, it bans the actual attacker. Quick test for whether it's happening to you: fail2ban-client status recidive and look for anything in 104.x, 162.158.x, 172.64 to 172.71.x, 141.101.x, 108.162.x, 188.114.x or 198.41.x in the banned list. But short bans hide it, so also count historic bans: zgrep -h "Ban " /var/log/fail2ban.log* | grep -cE ' (104\.|162\.158|172\.(6[4-9]|7[01])|141\.101|108\.162|188\.114|198\.41)\.'. Anything above zero means it's been happening. You can also check within Cloudflare itself: The fix is two Plesk settings, no code: Tools & Settings → IP Address Banning (Fail2Ban) → Trusted IP Addresses: add all of Cloudflare's published IPv4 ranges (cloudflare.com/ips, 15 of them). Fail2Ban then ignores edge IPs entirely. Per domain, Apache & nginx Settings → Additional nginx directives: a set_real_ip_from line for each of those ranges plus real_ip_header CF-Connecting-IP;. nginx then logs the real visitor IP, so if Fail2Ban does ban someone, it bans the actual attacker. Cheers Peter
    2 points
  42. Hi @rushy, The `0x0` in the variation name tells you what's happening: something is calling `$image->size()` (or `width()`/`height()`) with width and height that both evaluate to 0. That includes `''`, `null`, and unset variables. ImageSizer has always refused a 0x0 resize, which gives the "GD FAILED Resize … (0x0)" log entry. GD and the image itself are fine. If PHP couldn't read the JPG, ImageSizer would throw "not a recognized image" before it got to the resize step. The variation name also has no `-ms` suffix, so it isn't coming from `maxSize()`. I'd look at the template for `/qui-suis-je/` (page 1021), or any partial or module it uses, for the code that resizes images. Something there gives a width and height that come out as 0 for the newly added images. For example, it might read them from a field or setting that's empty for new images, or from a variable that isn't set. A quick way to find it: $wire->addHookBefore('Pageimage::size', function($e) { if(!(int) $e->arguments(0) && !(int) $e->arguments(1)) { $e->log->save('image-0x0', $e->object->basename . "\n" . (new \Exception())->getTraceAsString()); } }); Put that in /site/ready.php, load the page, then check /site/assets/logs/image-0x0.txt for the calling file and line. The "filesize(): stat failed" warning is a small core issue. With $config->debug on, the image-sizer log line calls filesize() on the variation even when it was never created. It only shows up because the resize failed, so once the 0x0 call is fixed it'll go away too. Core fix, for @ryan, in Pageimage::___size(): - "({$width}x{$height}) " . Debug::timer($timer) . " secs $originalSize => " . filesize($filenameFinal) . " bytes " . + "({$width}x{$height}) " . Debug::timer($timer) . " secs $originalSize => " . (is_file($filenameFinal) ? filesize($filenameFinal) : 0) . " bytes " .
    2 points
  43. Thanks, Peter! I've been posting this link for a while now, over 3-4 months now, with zero results. 🙂 I hope this makes me money someday 🙂
    2 points
  44. Agree with @Jonathan Lahijani - pagination for Repeaters is something I really need as well.
    2 points
  45. @ryan Any chance we can fast-track pagination for repeaters? It was discussed in this blog post from 2016: https://processwire.com/blog/posts/fieldtype-pagination/
    2 points
  46. Hello, I'm new to this forum, but I work at an agency that uses processwire for most of our bespoke sites. I've started setting up vulnerability scanning on most of our projects and I've discovered that the version of tinyMCE bundled with processwire has some high severity (according to github) vulnerabilities. https://nvd.nist.gov/vuln/detail/cve-2026-47759 https://nvd.nist.gov/vuln/detail/cve-2026-47760 https://nvd.nist.gov/vuln/detail/cve-2026-47761 https://nvd.nist.gov/vuln/detail/cve-2026-47762 These are XSS vulnerabilities so to spell it out this would mean that one admin could steal another admin's session (which I believe is classed as a medium severity issue) or if users can control something that ends up in an admin wysiwyg (idk maybe in a contact form or something) a non-user could steal an admin session (high severity). They were disclosed in May. The big problem is: tinyMCE v6 is end of life, and the new versions have a new licence that is not really compatible with projects like processwire. I've searched the forums and found some discussion of this from a few years ago, but I think I'm the first to raise the subject in a while and perhaps the first to notice these CVEs. Firstly, I guess I'm just disclosing the issue and warning anyone who uses user data in wysiwyg that they cannot trust tinyMCE and should take action. Secondly I have a few questions Is there an alternative rich text editor module anyone can recommend? Is there an alternative rich text editor that does not yet exist as a module anyone can recommend? Are there plans to move off tinyMCE in the future? I appreciate this is going to be a big task.
    2 points
  47. To quickly test many of your websites to know if they are affected by this, you can use this cURL in the terminal, just edit the urls: urls=( "https://example1.com/" "https://example2.com/" "https://example3.com/" ) printf "%-45s %-12s %-12s\n" "URL" "page_name" "pg_name" for url in "${urls[@]}"; do a=$(curl -s -o /dev/null -w "%{http_code}" -X POST -d "page_name=test" "$url") b=$(curl -s -o /dev/null -w "%{http_code}" -X POST -d "pg_name=test" "$url") printf "%-45s %-12s %-12s\n" "$url" "$a" "$b" done
    2 points
  48. I started adding PostgreSQL and SQLite compatibility to my modules
    2 points
  49. ProcessFileRenamer is a small ProcessWire admin Process module for safely renaming uploaded asset basenames. GitHub: https://github.com/dlzi/ProcessFileRenamer
    2 points
  50. Thanks for merging all this so quickly @ryan - I feel like folks might also be interested in this benchmark table: https://github.com/processwire/processwire/pull/372#issuecomment-5841901625
    2 points
×
×
  • Create New...