Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 05/07/2026 in all areas

  1. Working with AI in PageGrid Inspired by projects like AgentTools, I began investigating how well an AI could handle PageGrid’s native PW structure (Pages, Templates, and Fields). The results were surprisingly good and with a few targeted optimizations, the workflow has become remarkably solid. With the latest updates, an AI agent is reliably able to create and design PageGrid layouts, create new block templates, or perform content updates. To teach AI how to "speak PageGrid", I created a small AGENTS.md file that acts as a central hub. I’ve then added specific "skills" in separate .md files for various tasks ensuring the AI only loads the documentation it actually needs. This approach is highly optimized to minimize token consumption, allowing even "smaller" models like GPT-4o mini or Claude Haiku to produce error-free migrations. To make this possible, I also introduced dedicated Migration Functions that allow the AI to programmatically add items or set styles. For CLI-based projects, I highly recommend the AgentTools Module to streamline the integration. Beyond CLI support, AgentTools also provides a native AI interface directly within the ProcessWire backend editor. Getting Started Install the lastest version of the FieldtypePageGrid module (try for free). Tell your AI agent to read the PageGrid agent guide first: That file gives the agent everything it needs to understand PageGrid and routes it to the right documentation for your task. What You Can Ask the AI to Do Build or modify a layout Create pages with blocks, apply styles, set up responsive layouts using CSS grid columns. Example prompts: "Create a landing page with a full-width hero section and a 3-column feature grid below it." "Add a text block and an image block side by side inside the first group on my homepage." "Make the hero block have a dark background and white text, with 60px padding on desktop and 24px on mobile." The core advantage here is that the AI doesn't write your frontend code from scratch. The HTML and logic are already defined in your PageGrid Block Templates. The AI simply acts as an orchestrator, assembling these blocks and applying styles. This ensures the output remains clean, semantic, and easy to maintain via drag-and-drop later on. Create a custom block template Define a new block type with custom fields and register it with a PageGrid field. Example prompts: "Create a custom block called pg_testimonial with a quote text field and an author name field." "Create a custom card block with a title, description, and link field, and add it to my homepage PageGrid field." Write a site template Render a PageGrid field inside your own PHP template file. Example prompts: "Show me how to render my PageGrid field inside my home.php template using markup regions." "Generate a site template for pagegrid-page that includes the PageGrid output between the header and footer." Docs Documentaion
    3 points
  2. I've just updated the AdminNeo core and included two new plugins: GeminiSqlPlugin and OpenWebUiPlugin for inline prompt based SQL command generation. I haven't tested the OpenWebUiPlugin one, so if anyone has any problems with it, please let me know.
    2 points
  3. @wbmnfktr Thanks for sending over all the info. Sorry about that, it was a bug and we were able to fix it. The issue was that we stopped auto-appending "/chat/completions" to the API URL in v10 or v11 since were were adding support for the "/responses" endpoint too (though not fully supported yet), and the fix was to append /chat/completions to the API URL. But requiring that isn't a backwards compatible strategy so now it auto-appends /chat/completions only if neither /chat/completions or /responses is present in an OpenAI compatible endpoint URL. That fixes the issue. So if you grab the latest commit, the issue should be fixed. I was able to confirm the fix using your GLM info and sent just one prompt to it, see below. (GLM seems nice!)
    2 points
  4. With all of the advancements in AI, and other technologies not slowing down, it's getting even harder to feel like I'm staying relevant. Add to that the pressure to exercise and stay fit, work outside or around the home, and to be sure to retain some amount of leisure... How do you all do it? I see my gaming buddy logging hours of a video game. He works in defensive cybersecurity, so he makes quite a bit and is on-call. Thankfully for him, he works remote (I do not). But he has a family with tweeny triplets (!). He's just this past week mentioned ripping up carpet, last week he ran a trench to run electrical for a man-made pond he's installed with boulders that he moved by hand. Meanwhile I want to learn about n8n, take some AI courses (someone mentioned faster.dev here in the forums), work on personal (dev) projects, but also get things done around the house, and make sure to spend time with the girlfriend and make sure she's happy. I have not figured out a good time management scenario to balance these all out: House/property work. Friends and family time. Leisure time. Exerciise Paid work (job / income). Professional improvement and advancement. What are your tricks, or boundaries, to set time aside for each of these? Are you struggling like I am to properly afford time to each thing and not allow them to thoroughly overtake another's time commitment? Looking for revelations that some of you may have had during your careers or lifetimes to help you sort these things out! 🙃
    1 point
  5. ProcessWire is more alive than ever.
    1 point
  6. Hi @maximus, I've been trying it out this module too and really like it! I have a couple of suggestions, if that's OK? Pages that don't have template view files (<templatename>.php) still show a view icon in the collection list, resulting in a 404 when clicked. This could be solved by adding a $page->viewable() check to the $showViewLink boolean. When a template's "Can this template be used for new pages?" setting ("noParents") is set to -1 (only one page) or 1 (no new pages), the "Add [collectionItem]" button still shows. Maybe a canAddNew() method of the Collection class to hide the button in those circumstances? [this worked for me, though there may be a more elegant way, or that suits your coding style]: /** * Whether the admin "Add" button should be shown for this collection. * Mirrors ProcessPageAdd's logic on Template::noParents: * 1 → template disallows new pages * -1 → singleton; only allowed while no page using it exists yet */ public function canAddNew(): bool { $template = wire('templates')->get($this->template); if (!$template || !$template->id) return false; $noParents = (int) $template->noParents; if ($noParents === 1) return false; if ($noParents === -1) { return $template->getNumPages() === 0; } return true; } //and then in collection-list.php: <?php if ($canCreate && $collection->canAddNew()): $addTemplate = $wire->templates->get($collection->template); $addUrl = $adminUrl . 'page/add/?template_id=' . $addTemplate->id; ?> Anyway, thanks for the great module!
    1 point
  7. I hope no-one minds, but I have removed dai() and bdai() in favour of adding a "copy as plain text for AI agent" button for the regular d() and bd() calls. which will put the following in your clipboard. Call: d($page); Location: site/assets/cache/TracyDebugger/consoleCode_1778105690621_f3xspie7xg.php:2 ProcessWire\Page #246 instanceID: 10 id: 3 name: 'page' path: '/admin/page/' status: 'locked, system' template: 'admin' parent: '/admin/' numChildren: 10 sort: 0 sortfield: 'sort' created: '2025-12-06 18:34:42 (5 months ago)' modified: '2025-12-06 18:34:42 (5 months ago)' published: '2025-12-07 12:34:42 (5 months ago)' createdUser: 'ajones' modifiedUser: 'ajones' isLoaded: 1 outputFormatting: 1 hooks: array (17) | '->render' => array (2) | | 0 => 'TracyDebugger->logRequests() in TracyDebugger.module.php' | | 1 => 'anonymous function() in TracyDebugger.module.php (100.1)' | 'Page::getRequestData' => 'TracyDebugger->getRequestData() in TracyDebugger.module.php' | 'Page::logRequests' => 'TracyDebugger->logRequests() in TracyDebugger.module.php' | 'Page::editable' => 'PagePermissions->editable() in PagePermissions.module' | 'Page::publishable' => 'PagePermissions->publishable() in PagePermissions.module' | 'Page::viewable' => 'PagePermissions->viewable() in PagePermissions.module' | 'Page::listable' => 'PagePermissions->listable() in PagePermissions.module' | 'Page::deleteable' => 'PagePermissions->deleteable() in PagePermissions.module' | 'Page::deletable' => 'PagePermissions->deleteable() in PagePermissions.module' | 'Page::trashable' => 'PagePermissions->trashable() in PagePermissions.module' | 'Page::restorable' => 'PagePermissions->restorable() in PagePermissions.module' | 'Page::addable' => 'PagePermissions->addable() in PagePermissions.module' | 'Page::moveable' => 'PagePermissions->moveable() in PagePermissions.module' | 'Page::sortable' => 'PagePermissions->sortable() in PagePermissions.module' | 'Page::cloneable' => 'PagePermissions->cloneable() in PagePermissions.module' | 'after Page::render' => 'anonymous function() in FrontendMatrixEdit.module.php' | 'before Wire::trackException' => 'anonymous function() in TracyDebugger.module.php' data: array (2) | 'title' => 'Pages' | 'process' => 'ProcessPageList' I feel like this is the best of both worlds.
    1 point
  8. I do not strive for balance. I think that's just not a reality to achieve that. Maybe if you join some monks, then you can find it, but you'll need to give up everything else then. I focus on goals, and when I achieve one, well, that is satisfying. That might sound simple, but it's not. Of course, it's hard to stay focused, and it is also hard to keep the priorities. But I try not to miss the most important: family, health/sport, work, friends (in that order, and that's the order of importance, and not the order I spend time with/on, which is a different story..., but generally, I am just trying to be flexible with time as much as I can.) And when I am feeling blue, I just need to remind myself: https://youtu.be/uAzwji5Cfmk?list=RDuAzwji5Cfmk&t=24
    1 point
  9. This week I've been doing a major overhaul of the /wire/core/ directory structure aimed at improving and adding documentation. Now all core classes that will receive their own API.md documentation also have their own directory. The /wire/core/ directory kind of resembles the /wire/modules/ structure now. In addition, new API.md files have been created for the Pages, Page, PageArray, Modules and Module, all of which also improve the online API reference documentation too, which is what those links are linking to. We'll continue adding more API.md documents every week. Every time a new API.md file is completed, it gets sent over to the WireTests module to verify that everything documented in the API.md works exactly as stated. So new tests have been committed to that module as well, and more will be getting added every week. In addition, ProcessWire now has a CLI (command line interface) installer. Installing ProcessWire is as simple as typing this from the command line: php install.php When you do that, it'll present you with the installation options (see below). For human users, the "Standard usage" option is likely to be best, while AI agents will likely prefer the "Alternate usage" option: Standard usage: php install.php --generate Generate ./install-config.php for you to edit php install.php --config install-config.php Install from settings in ./install-config.php Alternate usage: echo '{"dbName":"mydb",...}' | php install.php Install from settings in JSON string php install.php --json '{"dbName":"mydb",...}' Install using an inline JSON string Other: php install.php --help Display all options That last option "--help" displays a giant screen of options, so I won't repeat it here, but take a look if you are interested. New versions of FieldtypeTable, FieldtypeCustom, FieldtypeCombo and FieldtypeRepeaterMatrix next week. Lots more in progress here too so stay tuned! Thanks for reading and have a great weekend!
    1 point
  10. This resonates. 20 years in development, still figuring it out honestly. Current reality: Day job 6 days/week, building PW modules in spare time. Not balanced, but intentional - grinding now to create options later. What actually helps: - Seasons, not balance - some months are 80% work, others need to be 80% recovery - Combine categories - coding for fun = leisure + professional growth - One rule: protect sleep and one full day off. Everything else is negotiable - Physical maintenance - injuries taught me this the hard way The AI/tech pressure to "stay relevant" is real, but burnout is worse. Better to have 3 solid productive hours than 8 exhausted ones. What's working for you so far?
    1 point
  11. Thanks for all the feedback, this is great. I just wanted to say ProcessWire has always been "back", never left. It's always been a long term project and never a fad project, so periods of rapid development and periods of slow development are normal, and I'm sure that cycle will always be the case. I've always been careful about making sure the project doesn't get bloated with short term things. So to make sure the quality is high over the long term, it's good to know when to go into rapid development, and when to let things simmer slowly. There's room for both. The other factor is that sometimes I have client work deadlines that I've got to give priority to because that's what keeps me in business, and able to keep investing in ProcessWire. I mention all this just because I don't want folks to be disappointed when there are weeks without any commits, etc., because that's unavoidable. For me this has always been a lifetime project, so ProcessWire isn't leaving or coming back, it's here to stay, as has always been the case.
    1 point
  12. I created a successor for my module PromptChatGPT (https://processwire.com/talk/topic/28311-processchatgpt/) with the even more creative name PromptAI. It is more or less a complete rewrite based on the Neuron AI framework. Short description: PromptAI is a Processwire CMS module that utilizes AI to process text fields upon saving. The processed text can be saved back to the original field or a different one on the same page. For image fields, the AI can write image descriptions or populate custom image subfields. The main additions are: Multiple prompt support Provider select support System instructions Support for Image fields All infos can be found here: https://github.com/robertweiss/PromptAI Use cases could include text summaries, proofreading, or generating alt texts for images. Happy prompting 😊
    1 point
  13. There may be a time where you need to create a page reference field using the Select inputfield and it's selecting repeater pages. Let's say I have a repeater field called "order_line_items" and I want to create a page reference field called "order_line_item" that allows me to select a repeater item (which is a page) of the "order_line_items" repeater field. Repeater pages are a bit different from regular pages in that their "parent" is a container admin page associated with the page in which it exists (dig into /admin/repeaters/order_line_items/ in your page tree to see what I mean). So when you are configuring your page reference field, you can't really choose a Parent. However when configuring your field, your instinct would be to choose the Template of "repeater_order_line_items". Then because you need extra precision in what pages are actually available for selection (rather than all of them across all pages), your instinct will be to implement custom PHP code: $wire->addHookAfter('InputfieldPage::getSelectablePages', function($event) { if($event->object->hasField == 'order_line_item') { $event->return = $event->pages->find('your selector here'); } }); The problem with that approach is that even though you have defined the custom PHP code and the select field correctly shows the selectable repeater pages in the select field, behind-the-scenes, ProcessWire has still loaded EVERY SINGLE REPEATER that has the "repeater_order_line_items" template (you can see this is TracyDebugger's pages loaded list)! Your site will definitely be slower as a result, dramatically so if you have thousands or tens of thousands of repeater pages of that template. I hit this issue years ago (2018) and I thought it was a bug. I discussed it with Ryan and it's technically not a bug, but kind of the way ProcessWire works, which is beyond this tutorial. While you can circumvent this using the PageAutocomplete field, I don't like the ergonomics of that field in certain situations. I want the good-old select field. The solution to this is to NOT select anything for the "Template" when configuring your field. So in my example, I chose "repeater_order_line_items", but instead, it should be left blank. Now the field will just rely on the code portion and all the unnecessary page loads will be eliminated.
    1 point
  14. PromptAI v2.3 — Inline Mode, Streaming, Placeholders, and more Hi everyone, It's been a while since the last update for PromptAI, and quite a lot has changed. Here's a summary of what's new since the last public release. Inline Mode The biggest addition is a new Inline Mode that adds magic wand buttons directly next to your fields. Instead of the "Save + Send to AI" workflow, you can now trigger AI processing on individual fields without saving the page first. The response streams in live and replaces the field content — but nothing is saved until you hit Save. Both modes (Page Mode and Inline Mode) can be mixed freely in the same configuration. Each prompt is configured as either "page" or "inline". Inline mode works with all supported field types: text fields, TinyMCE/CKEditor fields, image descriptions, file descriptions, and custom subfields — including inside repeaters. Streaming Responses AI responses now stream in real-time via Server-Sent Events (SSE). You can watch the text appear token by token instead of waiting for the full response. This obviously only works in inline mode. Placeholder Support Prompts can now reference other field values from the page using `{page.fieldname}` syntax. Inside repeaters, use `{item.fieldname}` to access the current repeater item's fields. Examples: - Summarize the following text to 400 characters: {page.body} - Create an SEO meta description for a page titled '{page.title}' - Write a caption for this gallery item titled '{item.title}' from the {page.gallery_name} collection This makes prompts context-aware without having to send field content manually. Multi-Field Selection Instead of configuring a single source field per prompt, you can now select multiple fields. The same prompt will be applied to each selected field. This replaces the old source/target field concept — the "target" is now only used for subfield options in file/image fields. AI Tools (experimental) The module now ships with three experimental tools that allow the AI to query your ProcessWire installation: - getPages — find pages by selector - getPage — get detailed info about a single page - getFields — list available templates and their fields These are disabled by default and must be enabled in module configuration. They're meant as starting points — their usefulness depends heavily on your use case and I recommend to create your own for each projects specific demand. Other Changes - PHP 8.3 is now required to use this module Important: Backup Before Updating The internal configuration structure has changed significantly. The old `sourceField`/`targetField` concept has been replaced with a multi-field `fields` array and a separate `targetSubfield` option. There is no automatic migration for this change. I'm sorry for the inconvenience — the old structure simply didn't support the new features. I attached two short screen videos showing the prompt config screen with example prompts and one page edit screen where I showcase some of the predefined prompts. As always, feedback and bug reports are welcome — either here or on GitHub. promptai-showcase.mp4 promptai-config.mp4
    1 point
  15. PromptAI Module Update V1.1: New Config UI & Individual Buttons! 🎉 Hey everyonre, I just pushed an update to the PromptAI module that replaces the old textarea configuration with a proper form interface at Setup > Prompt AI. No more typing template::source::target::prompt manually – now you get actual fields and buttons like a civilized person! 😄 I also added an "Individual Prompt Buttons" option that lets you create separate "Save + [Custom Label]" buttons for each prompt configuration instead of one generic button. So you can have "Save + Create Summary", "Save + Generate Alt Text", etc. and run just the specific prompt you want. Existing configs migrate automatically, so updates should run smoothly. Feedback welcome as always. The module has now been added to the ProcessWire module list: https://processwire.com/modules/prompt-ai/
    1 point
  16. Hello Everyone, For our KIT325 Cybersecurity Project, we recently checked the security of ProcessWire CMS, a system used for managing website content. We wanted to see if its default settings are secure enough based on the OWASP Top 10 standards, which are common web security guidelines. Here’s a quick look at what we found and what could be improved: Blocking Brute Force Login Attempts: What We Found: ProcessWire does slow down login attempts if someone keeps trying the wrong password. But it only blocks based on username, not by tracking where the login attempts come from (like IP addresses). Suggestion: It would be safer if ProcessWire blocked login attempts based on IP as well. Also, the system could use a response code like “429 Too Many Requests” to alert attackers that they’re being blocked. Session Cookie Security: What We Tried: Session cookies (used to keep users logged in) seem secure, but we couldn’t fully test if they were safe from all advanced attacks. Future Testing: We’d need more tools and knowledge to explore if these session cookies could ever be forged to trick the system. File Access Control: What We Saw: Files from unpublished pages could still be accessed if someone knew the file path, which could leak private information. Fix: ProcessWire should make a certain setting ($config->pagefileSecure) enabled by default to restrict file access based on page permissions. This way, only authorized users can see those files. HTTPS (Secure Connection) Enforcement: Current Setup: ProcessWire requires HTTPS (secure connection) settings to be turned on manually in the .htaccess file, which may not be done by every user. Recommendation: It would be better if HTTPS were enabled by default, so all sites are secure right from the start. Improving Activity Logs: Missing Logs: Some important activities like content changes and role updates aren’t logged by default. Suggestion: ProcessWire should add logs for these actions. This way, any unusual activity can be tracked and traced back to the user who made the changes. Password Rules: Issue: Passwords set through the API (another way to interact with the system) might not meet the same security rules as those set in the admin panel. Improvement: ProcessWire should require all passwords to meet the same standard, ideally making them at least 12 characters long and easier for users to remember. Overall, ProcessWire has a strong security foundation, but these adjustments could make it even safer. This experience showed us the value of secure default settings, especially for users who might not make these changes on their own.
    1 point
×
×
  • Create New...