Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 02/06/2026 in Posts

  1. I have never been loyal to tools for the sake of it. If something stops earning its keep, I move on. The reason I have stayed with ProcessWire for close to ten years is simple: it continues to make sense for how I work. I still look after sites I built many years ago, and most of them just run. No rewrites, no upgrade stress, no feeling that past work is a liability. The API has stayed stable, and when it has changed, it has been deliberate and predictable. That matters when you are responsible for client sites long-term. What really locked me in early on was the front-end freedom. PW never told me how a site should look or behave. It gave me solid building blocks and allowed me to choose. I can build very different sites without switching platforms or fighting opinionated defaults, and that freedom is something I value. The forum is another reason I am still here. You, the people in this community, take the time to understand a problem before jumping to solutions. That is very rare. The discussions are thoughtful, practical, and grounded in real experience, and I have learned a lot simply by reading how others approach things. And finally, trust. I trust ProcessWire not to chase trends simply for attention, and not to trade clarity or performance for fashion. Ten years on, it still feels like a system built by people who actually build websites. For me, that combination has been hard to beat.
    26 points
  2. Everything you need to know about custom page classes, from beginner to advanced. You'll find time saving tips and tricks, pitfalls, best practices, and plenty of examples too— https://processwire.com/blog/posts/custom-page-classes/
    24 points
  3. Hey, I've started to create a Media Hub for Processwire. [Edit...newest updates to UI are in later posts] Screenshots attached. Obviously a few UI improvements are needed 🙂 One of my clients requested a centralised media manager. I thought it'd be fun to give it a go and learn some stuff. I know that with a self-built Module, it'll always be maintained, and I have an active interest in evolving it. Shout out to @markus-th who just announced he is doing similar with WireMedia.
    10 points
  4. Generates a .phpstorm.meta.php file for ProcessWire autocompletion in PhpStorm. Features Autocomplete wire container keys for wire('...') and Wire::wire('...') Autocomplete module names for Modules::get() and Modules::install() Autocomplete field names for Fields::get() Autocomplete template names for Templates::get() Autocomplete unique page names for Pages::get() Autocomplete hookable methods for Wire::addHook*() Autocomplete page status constants/strings for Page::status(), addStatus(), removeStatus(), hasStatus() Autocomplete field flags for Field::addFlag(), removeFlag(), hasFlag() Autocomplete template cache-expire constants for Template::cacheExpire() Autocomplete Inputfield collapsed constants for Inputfield::collapsed() Autocomplete sort flags for WireArray::sort()/sortFlags()/unique() and PageArray::sort()/sortFlags()/unique() Optional: Field type autocompletion per Page class (when enabled in module config) Usage Default path: site/assets/.phpstorm.meta.php (configurable in module settings). The file regenerates automatically when fields, templates, or modules change (debounced). You can manually regenerate from the module settings screen. Optional: enable "Generate page-class field metadata" in module settings for field type hints per Page class. This is intentionally basic. For richer field stubs, use AutoTemplateStubs. Examples Modules $tracy = $modules->get('TracyDebugger'); // Autocomplete + correct class type for navigation and code insight Wire Container $page = wire('page'); $pages = $this->wire('pages'); $cache = wire('cache'); // Autocomplete for keys like page/pages/cache/etc. Fields $body = $fields->get('body'); // Autocomplete field names, fewer typos Templates $tpl = $templates->get('basic-page'); // Autocomplete template names Pages $home = $pages->get('/'); // Maps to the page class when page classes are enabled Page Status $page->status(Page::statusHidden); $page->addStatus('draft'); $page->removeStatus(Page::statusUnpublished); $page->hasStatus('locked'); Field Flags $field->addFlag(Field::flagAutojoin); $field->removeFlag(Field::flagAccess); $field->hasFlag(Field::flagGlobal); Template Cache Expire $template->cacheExpire(Template::cacheExpireParents); Inputfield Collapsed $inputfield->collapsed(Inputfield::collapsedYesAjax); Sort Flags $items->sort('title', SORT_NATURAL | SORT_FLAG_CASE); $items->sortFlags(SORT_NATURAL); $items->unique(SORT_STRING); Page-Class Field Metadata (Optional) $home = $pages->get('/'); // $home is HomePage (page class) // Field types are inferred from the template fieldgroup // e.g. $home->hero_image -> Pageimage or Pageimages depending on field settings Hooks $wire->addHookAfter('Pages::save', function($event) { // Autocomplete hookable methods while typing the hook string }); Notes Hook scanning reads ProcessWire core, modules, and admin templates to build the hook list. If page classes are enabled, page names map to their page class; otherwise they map to Page. Improvement suggestions and PRs are welcome. https://github.com/phlppschrr/ProcessWirePhpStormMeta
    9 points
  5. Hi everyone, I’m currently working on a module called WireMedia Library and wanted to share the current state of development to get some feedback on the concept. The main goal is to provide a central interface for managing media across the entire ProcessWire instance while staying 100% compatible with the native storage system. The Concept: The module acts as a central hub. You can upload files to the library and then select them from any page. When a file is selected, it is copied into the local page’s file/image field. This ensures that the files remain "native" to the page they are used on, keeping your API calls and templates exactly as they are. Key Features of the current prototype: Central Media Overview: A unified view of all media assets in the system. Usage Tracking: The module indexes where files are used. Even if a file is used within a Repeater, it identifies the "leading" parent page so you know exactly where your assets live. Database Indexing: A custom database table keeps track of file locations for fast performance. Rebuild Index: A tool to rescan the system and ensure the database stays in sync with the file system. Native Workflow: Since files are copied to local fields, you can still use all native PW features (like cropping or focus points) directly on the target page. Planned: Permission System: Granular access control for different user roles/folders. I am still undecided about the final licensing or if/how I will release the module, but I wanted to show the UI and the logic behind it to see if this approach resonates with the community. I’d love to hear your thoughts on the "copy-to-field" approach and the general UI!
    9 points
  6. Hi everyone! I've built AiWire — a module that connects ProcessWire to AI providers (Anthropic, OpenAI, Google, xAI, OpenRouter). GitHub: https://github.com/mxmsmnv/AiWire What it does $ai = $modules->get('AiWire'); // Simple call echo $ai->chat('What is ProcessWire?'); // Generate multiple fields at once $ai->generate($page, [ ['field' => 'ai_overview', 'prompt' => "Write overview..."], ['field' => 'ai_seo_meta', 'prompt' => "Generate meta..."], ], ['cache' => 'W']); // Auto-fallback if provider fails $result = $ai->askWithFallback('Translate this...', [ 'provider' => 'anthropic', 'fallbackProviders' => ['openai', 'google'], ]); Main features Multiple API keys per provider with auto-failover Connection testing from admin Interactive Test Chat with parameter controls File cache with TTL (day/week/month/year) Save AI responses to page fields Multi-turn conversations Full docs with 25 real-world examples Requirements PHP 8.1+, ProcessWire 3.0.210+, cURL, and at least one API key. If you try it out, I'd love to hear your feedback — whether the API makes sense, if the docs are clear, or if you run into any issues. Thanks! 🙏
    8 points
  7. Awesome article that sums it all up neatly. Thanks for this comprehensive guide, Ryan! I converted the content of this article into a reusable AI agent skill. Available here: https://github.com/gebeer/processwire-ai-docs/tree/main/skills/pw-page-classes
    8 points
  8. Agree that the site is too developer-centric at the moment. And while people might correctly say this is the target audience, none of my clients using ProcessWire are technical. They are marketing managers, business owners, copywriters, CEOs, eLearning folks etc. They don't care about the API, what a CMF means, what hooks are, or what Modules are. They want a nice, stable UI and editing experience, and to know that if they need custom stuff, it can be done. So my point is, the current Processwire homepage does an OK job of mentioning some of the features these personas might like (the tree, the simple editing etc). However, the site is largely developer-centric, and I believe the appeal can be broadened with: 1: A comprehensive ProcessWire for... section This would be a top-level nav item with dedicated pages for Marketing executives and assistants Content writers/copywriters SEO specialists social media/comms etc etc and thats just the tip of the iceberg, but we should approach it with three key non-developer personas in mind: Publishers (write/edit content) Maintainers (keep info accurate) Promoters (campaigns, SEO, sales, social) And I realise there will be a lot of overlap between the sections, but that's fine. 2: Video walkthrough The website badly needs a UI walkthrough. ProcessWire in 60 seconds... type thing. Made for non-technical people...a quick look around the UI and I honestly think that's 90% of the work done. I realise video work can be a time sponge so I'd focus on item 1 first. I'm happy to help out on item 1 if @ryan needs help there.
    6 points
  9. I second this wholeheartedly. The community is among the very best out there, and the lack of opinion, the clear structure and the ease of extending make PW a wonderful tool. It's a sad fact that my days of working with ProcessWire are mostly over. My job responsibilities have changed over time, and the demand for wholly integrated cloud systems led my employer to migrate our intranet site with tens of thousands of pages and a lot of advanced functionality to another platform (let's not talk about the manpower needed to do that and the gaps left). There are of course advantages, but I can say that we had a tailored-to-fit solution on a level you don't find often, from ordering breakfast or lunch from local suppliers, over advanced forms connected to HR systems and Active Directory data, providing specialized integrated databases and automated workflows to our departments, to driving technical sales with dynamically generated interlinked views on bills of material, stocks and data sheets pulled directly from SAP. A piece of software more than 60% of 1300 worldwide employees used daily and that ran with 100.0% availability on a single IIS server with only a bit of memcache magic to keep things speedy. Over more than ten years, periodic updates went through with nary a hitch. My heart bleeds a bit. Not working with PW every week also means that I'm not actively using the modules I built anymore. I'll have to go over my little babies one by one, retire those that have been surpassed by better approaches by now and find new pet owners for the others.
    5 points
  10. It's a bit over a year since I started this post and it's crazy how far AI and cursor got! Huge shoutout to @gebeer who is my main source of wisdom when it comes to AI related stuff 🙂 I wanted to share a video that I watched recently. It is quite lengthy, but I was looking for exactly that to make sure I don't miss any basics. For me it was eye opening, so I wanted to share it: My personal takeaways/learnings: I have thought for a long time that AI is great to read/understand/explain or help me find something in my codebase but for actual coding it's not very helpful most of the time (other than cursor tab, which is awesome!) You can run multiple agents in cursor at once, and you can run multiple models at once, which is crazy The better you setup your environment, the better the results (obviously...) AI can write all your RockPageBuilder blocks with RockMigrations code easily You can actually TALK to cursor in the chat, which is a lot quicker than typing. You can even TALK to it in german and it will translate it to english on the fly, which is crazy. This is just the beginning So the question for me was is it really worth the effort of setting up your environment so that AI does the work for you and then in the end you spend more time debugging than if you just went ahead and coded it from scratch? I'm not sure yet, and I asked that question today @gebeer. He said clearly yes, and my gut said I can imagine he is right, but I did not really experience it myself. Today that changed. I took some time to try a new workflow for a client request. Usually I would have added code by hand, as that's a lot quicker. Why? Because you either start prompting and get bad results or you have to invest a lot of time upfront. But I know how it feels to invest some time upfront and then have superpowers forever 🙂 So I gave it a try and after a quick emergency rescue session with @gebeer I got very good results in actually very little time. And once I started to adopt that workflow it started to make sense more and more and I started to answer the question to myself: Is the effort worth it? Clear answer: YES So I want to encourage everyone to watch the video, try it out, ask for help if you hit any roadblocks. So why do I think it's worth it? Simple example: I asked AI to implement a new RockPageBuilder block. It did the backend for me quickly and easily. Then it did the frontend for me. The frontend needed more time and debugging, but I then added the uikit docs to my project and told cursor to add the docs to my cursor rules/skills/whatever (still confused, but cursor knows what to do). Then results seemed to get even better and it even fixed an issue in a way that I would have never thought of (because I didn't know this option was there). So I even learned something new. Finally I saw an issue in my .latte file, which is quite a common mistake: AI forgot to add |noescape to the {$page->headline} output, which made the headline "Foo & Bar" show up as "Foo & Bar". I guess every latte user knows that problem 🙂 The solution: Tell AI to fix the issue and to also add that info to the frontend-dev skill/rules. That means it will likely never make this mistake again! This is a really powerful approach. I'm quite impressed. And I think I'll need a more expensive subscription soon ^^ Which is one of the downsides. You have been warned! 😄😉 PS: The initial setup is also quite easy. All I did is to talk to cursor: A bit messy instructions and lots of mistakes, but it doesn't matter as long as cursor understands you. I'm quite sure the results are not perfect, but from what I read in the instructions for the AI it's a quite good overview of the project! And it's something to build upon and grow 🙂
    5 points
  11. @bernhard I want to express my gratitude for all you have contributed to the PW community over the years. And I commend you on your decision to open source your modules. Many of your modules have become part of my workflows for most projects over the years. I was happily paying for the bundle. It was definitely worth it. I hope that the community will pick up on your move and contribute through PRs for further refinement and new features where needed. Thank you again, Bernhard. You and your work are both much appreciated :-)
    5 points
  12. In line with this topic, I recently expanded AutoTemplateStubs to include ProFields Stubs. There should be stubs for FieldtypeTable, FieldtypeTextareas, FieldtypeCustom and RepeaterMatrix (including stubs for all types). I haven't created a PR yet because I wanted to test it myself first, but since it fits so well with the blog post, if anyone would like to help with testing: https://github.com/phlppschrr/AutoTemplateStubs
    5 points
  13. Some more work. Not sure why the images are so fuzzy Image detail page You can edit the usual stuff...Title, Alt, Description, and add Tags etc Some utilities in there too such as Download, Copy URl, Duplicate, Delete If an image has Crop versions they are displayed under the main image Crop versions has thumbs and table view A crop version has a detailed view too Image Crop page There are presets, but you can create your own named crops Save as a crop version or save as a new image. The hardest part is in progress which is A custom Inputfield which allows you to add images from the MediaHub. All while maintaining a connection back to the hub source file. IE it's important that there's no duplication and that the images in the Media Hub are a true source / canonical version Displaying images in the page edit field in a nice consistent way with the existing UI. As much as possible, I want the user to feel like this the core and not some bolt-on with its own CSS. Although I am changing some things… Hope you like! P
    4 points
  14. Hey everyone, I have some updates to MediaHub to share. Media Hub view Screenshot of the Grid view... This is the grid view showing a thumbnail of all your images. Each card has helpful meta data (PNG, file size etc) Some images have crop applied denoted by the small pink badge. IE Lisbon tiles has 4 crop versions. Usual filters at the top and a search bar. Screenshot of the Table view. Handy if you have hundreds of images Displays tags too Screenshot of the Upload / Drag and drop mode There's some nice aniamtion / UI when the system is uploading several images Tomorrow I'll share more...
    4 points
  15. Hi everyone, As promised, the Beta version of WireBooking is now available on GitHub! You can find the repository here: https://github.com/markusthomas/WireBooking I would love to get your feedback on the installation process and general usability. If you find any bugs or have suggestions for improvements, please open an issue on GitHub. Happy testing!
    4 points
  16. These are very good questions. My honest take: PW is still very much a niche product. People who've been working with it for years learned to appreciate it. But it's very hard to convince anyone to jump in and dive deep until you discover the many advantages PW offers. And yeah, most devs have their specific workflows and it is just inconvenient to adapt new ones that might actually work better. Time/energy constraints may contribute to that. I can only say for me personally, I'd always buy and support proprietary modules developed by experienced PW devs although I am a FOSS enthusiast.
    4 points
  17. Don’t forget Cursor cloud agents. Give a cloud agent a plan and the agent works in the background while you’re away from the laptop. I give them a task on the iPad when I’m at the gym and by the time I’m home there’s a new branch waiting for me. I can’t verify this but somehow I’ve often found the quality of the cloud agents to be better than the desktop ones even on the same model. Can’t be true? But feels that way.
    3 points
  18. https://github.com/phlppschrr/processwire-knowledge-base
    3 points
  19. @gebeer I have started developing a ‘processwire-knowledge-base’ skill. To do this, I converted all blog articles and tutorials from the website as well as the API docs into Markdown. However, I haven't tested the skill yet. I think it still needs some fine-tuning. It's still a private repo at the moment, but if you're interested in taking a look, I'm happy to make it public.
    3 points
  20. @bernhard thanks for sharing the video. And exciting journey you had there :-) Eventually this is where things are going, I guess. Would be great to know who in this community is working on similar stuff. I'm currently creating a collection of skills that can be plugged-in to PW projects here: https://github.com/gebeer/processwire-ai-docs Would love to collaborate with others on that and exchange ideas.
    3 points
  21. 3 points
  22. @Ivan Gretsky I'm always a little reluctant to make a blanket statement like "avoid markup in page classes", but I'm referring to what I think works best with the projects I work on. The files in /site/templates/ are the view layer, as nearly all code in there is aimed at generating markup/output. Even if something isn't directly generating markup, it's still finding and preparing things for output. Most markup comes from "partials", which are files that I put in /site/templates/parts/, or if exclusive to a particular template, then /site/templates/[template]/. And then I either include() them, or files()->render() them from the site's template files. I primarily use Markup Regions. The _main.php establishes the base markup: <?php namespace ProcessWire; /** @var Page $page **/ ?><!DOCTYPE html> <html> <head id="html-head"> <?php include('./parts/html-head.php');?> </head> <body id="html-body"> <header id="header"> <?php include('./parts/header.php');?> </header> <h1 id="headline"><?=$page->title?></h1> <main id="content"> <?=$page->body?> </main> <aside id="sidebar" pw-optional> </aside> <footer id="footer"> <?php include('./parts/footer.php');?> </footer> </body> </html> Below is a template file for the /products/ page which lists product pages, supports pagination, and uses URL segments for sorting: <?php namespace ProcessWire; // products.php /** @var ProductsPage|CategoryPage $page */ $products = findProducts($page); $body = input()->pageNum === 1 ? $page->body : ''; $headline = $page->get('headline|title'); ?> <h1 id="headline"><?=$headline?></h1> <main id="content"> <?=$body?> <?php include('./parts/sorts.php'); // no expects ?> <?php include('./parts/products-list.php'); // expects $products ?> </main> <aside id="sidebar"> <?php include('./parts/categories-list.php'); // no expects ?> </aside> The category template file works exactly the same way, except that it lists products for the category rather than listing all products. The same code works either way, so "category.php" just includes "products.php": <?php namespace ProcessWire; // category.php include('./products.php'); There's that findProducts() function above in the products.php template file -- I usually have helper functions in a /site/templates/_func.php, /site/templates/_products.php, or /site/templates/products/func.php (assuming exclusive for "products"). Another place would be for the ProductsPage and CategoryPage to have findProducts() methods, but usually I don't want the page classes getting involved with detecting stuff about the current request (sort, pageNum, etc.) so like these in a simple function library file: <?php namespace ProcessWire; // file site/templates/_func.php included by _init.php function getSorts(): array { return [ 'name' => 'A-Z', '-name' => 'Z-A', 'price' => 'Price (low-high)', '-price' => 'Price (high-low)', 'created' => 'Date added (oldest)', '-created' => 'Date added (newest)' ]; } function getSort(): string { $sorts = getSorts(); $sort = input()->urlSegment('sort-(*)'); if(empty($sort)) $sort = 'name'; if(!isset($sorts[$sort])) wire404('Invalid sort'); return $sort; } function findProducts($page, $limit = 20): PageArray { $sort = getSort(); $find = "template=product, sort=$sort, limit=$limit"; if($page instanceof CategoryPage) $find .= ", categories=$page"; return pages()->find($find); } Here's an example of a ./parts/products-list.php file: <?php namespace ProcessWire; // file: parts/products-list.php /** @var PageArray|ProductPage[] $products */ $subhead = $products->getPaginationStr('Products'); $pagination = files()->render('parts/pagination.php', [ 'items' => $products ]); ?> <h3><?=$subhead?></h3> <?=$pagination?> <ul class="products-list"> <?php foreach($products as $product): ? <?php include('./parts/products-item.php'); // expects $product ?> <?php endforeach; ?> </ul> And the parts/products-item.php, though in reality there would likely be more to it: <?php namespace ProcessWire; // file: parts/products-item.php /** @var ProductPage $product */ ?> <li class="products-item"> <h3><?=$product->title?></h3> <p><?=$product->summary?></p> <p><a href="<?=$product->url?>">View Details</a></p> </li> To complete it, here's the parts/sorts.php file: <?php namespace ProcessWire; // file: parts/sorts.php $currentSort = getSort(); $url = page()->url; $sorts = []; foreach(getSorts() as $sort => $label) { if($sort != $currentSort) $label = "<a href='{$url}sort-$sort/'>$label</a>"; $sorts[] = $label; } echo "<p class='sorts'>Sort by: " . implode(' / ', $sorts) . "</p>"; If I start needing to output products in more places in the site, then I'll usually do fewer include()'s and move the rendering to dedicated functions. That way these things render in their own variable namespace and don't bleed variables or overwrite variables in the main rendering. So this would also go in that _func.php (or _products.php or ./products/func.php) mentioned above, and the include() calls in template fiels would be replaced with render...() calls: function renderProducts(PageArray $products): string { return files()->render('parts/products-list.php', [ 'products' => $products ]); } function renderCategories(): string { return files()->render('parts/categories-list.php'); } function renderPagination(PageArray $items) { return files()->render('parts/pagination.php', [ 'items' => $items ]); } So if using render() functions then the <main> with the include('./parts/products-list.php'); would get replaced with this: <main id="content"> <?=$body?> <?=renderProducts($products)?> </main> Ah yes, I hadn't thought about that in a long time. I can't remember if that was implemented yet or not. I'll find out. If not yet implemented I'll have to implement it, it should be fairly simple.
    3 points
  23. Published Version 2.4 with support for custom user role permissions: promptai allows to use the prompts in page edit promptai-config allows to add/edit new prompts
    2 points
  24. Another learning: while it might seem to take long to wait for results of an agent... you can spin up multiple agents and let them work on two different tasks (like two new unrelated features)
    2 points
  25. Haha, yeah, those $50 in Opus credits pushed me quite a bit further too while writing this update … It’s really fascinating how fast you can move with a single prompt sometimes – only to suddenly going in circles for 30 minutes for a simple bug. Wild times 😅
    2 points
  26. Yeah, yours feels more like an admin-focused tool for one-shot operations, while mine went in a slightly different direction. Same tree trunk, just one has deeper roots and the other has wilder branches 😄 Honestly, it all started because they gave me $50 in credits for Claude Opus 4.6 and I wanted to test what it could actually build. My very first prompt to it was roughly: “Create a plugin that connects AI to a ProcessWire website, something like the TeleWire you made for Telegram. Use the standard approach, add support for Anthropic, xAI, OpenAI, OpenRouter — so you can add multiple API keys and it clearly shows whether each one is working or not.” …and then, well — «And then Ostap was off» 😂 (That famous line from Ilf & Petrov’s The Twelve Chairs when Ostap Bender gets carried away and can’t stop spinning taller and taller tales.) From that one simple request it just snowballed into the full AiWire module you see now.
    2 points
  27. I just published https://github.com/gebeer/conversation-search-mcp Its a very minimal and fast MCP server that can search over jsonl session transcripts. It can be pointed to a folder with those sessions and then do BM25 searches for relevant context. Claude Code sessions all get stored in ~/.claude/projects/* folders. One folder per project. I have pointed mine to a folder in there that contains all my ProcessWire projects. So it has all past conversations that I had with claude code in these projects. There's a lot of valuable data in there. Like how the assistant applied fixes, what context I gave it, what it did wrong, what corrections I had to make etc. When the MCP server is active, the assistant can use it to search for relevant context. Currently I'm working on a hook system that auto-injects relevant context from a search based on the current prompt. It's an experiment currently. But might be a good way to enhance the assistants understanding with relevant context.
    2 points
  28. 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
    2 points
  29. Hey @gebeer @interrobang @Peter Knight love your input but I think we are getting a little off-topic? I have created a new AI+PW thread here: Hope that makes sense!
    2 points
  30. Done. https://context7.com/phlppschrr/processwire-api-docs
    2 points
  31. This is great!. I see you have a much more sophisticated setup for API/docs extraction setup than me. I was having a go at producing markdown docs for processwire a while ago and took a different approach (Scrape API docs instead of parsing source). Partial results are here: https://gebeer.github.io/mkdocs-processwire/ I really wish @ryan would adapt the md format for the official API docs so that AI assistants can easily parse them and als cotent7 can index them. And the collection of blog posts you have is impressive. As for the Skill itself, it doesn't currently follow the recommended format. There should be no README, docs dir could be renamed to references etc. Other than that it looks amazing. Love the scripts section. Def will give this a go and let you know how it goes.
    2 points
  32. Today I updated the information about Processwire on the wiki. If you have anything to add, you know where to find the page. https://en.wikipedia.org/wiki/ProcessWire
    2 points
  33. That looks great. I've started one too as of last night. Mainly for my own learning and amusement, but I think a solid, maintained Module like this is badly needed.
    2 points
  34. I made this into a skill, following agent skill conventions. Available here: https://github.com/gebeer/processwire-ai-docs/tree/main/skills/pw-ddev-cli There's also a custom page classes skill in that repo, based on Ryans great blog article that just came out. Let your agents stay informed :-)
    2 points
  35. Awesome! Want more of those! ‐-- Custom page classes really aren't a "view" layer in any form, and I suggest keeping all markup generation code within /site/templates/ and subdirectories within it. Would love to know more about how you implement the view layer. Components with several views.. Controllers for url segments and stuff like that...
    2 points
  36. For the record, this can happen when you have a high number of fields on a page. If the hosting company has this set low to begin with you can run into this. Just mentioning it here in case someone stumbles on this thread for a different cause. @Ana If this is in your local environment you should be able to set the value of max_input_vars higher. There's really no downside to setting it to something really high. I think I have it set to 2000 on one of my servers to accommodate field-heavy pages If this is in production, check the settings available with the web host. If you have access to a server management UI like CPanel or equivalent, you can adjust that variable there.
    2 points
  37. That's because there is none. Or there are three - depending on the point of view. Some classes come from jQuery UI, some come from UIkit, and to make it even more flexible the new default admin theme comes with its own classes, conventions and technology (CSS variables instead of additionally to LESS). There is a readme for AdminThemeUikit here. If you are using the new default theme by konkat many of these instructions are obsolete. In that case I guess your best bet is to look for information they provided spread across the forum and the blog. But to be honest from what I read this is all just fancy marketing blabla with screenshots how nice the new theme looks, but nothing answers the questions you just raised. I basically asked the same questions here and got no answer. Maybe you have more luck! Oh, and if you expect that you can use regular UIkit markup in AdminThemeUikit you might be interested in this thread as well.
    2 points
  38. Also added a check for ProCache so if maintenance mode is enabled and it detects ProCache is installed and enabled then the warning also tells the user to turn off ProCache - warning only visible in the admin. Also made strings translatable for the warning messages. I've not checked through this topic sorry for other suggestions but can do if I get time and there are still important things to look at just I needed a few quick fixes for myself for now (selfish I know). I will check out the other suggested module I saw too. @ryan perhaps we need a way to mark modules in the database as abandoned or as having issues? Because this one of mine hadn't been touched in a decade and wasn't working and made me feel bad as a result because people were trying to use it and the way my brain works (or rather doesn't) I must have seen issue reports coming in via Github but then got distracted so didn't realise there were that many when I checked. Perhaps we could have a system where folks with a certain reputation can mark a module on the site here as having issues so they get looked at/removed just not sure if anyone would volunteer for that.
    2 points
  39. Good day, @bernhard! First of all, I have to thank you for being who you are. A lone talented enthusiast trying to build a sustainable living on top of our beloved CMS. But not just making sites like the rest of us. But creating your little module-selling empire))) Taking on every hard problem ever put in front of a PW developer and solving it in no time. You have leaded the way for us for some many years. Everyone here has been following you in one way or another. And thus I feel sad about you taking this decision. Yet in the same time I can imagine the freedom you should feel after it. I really wish you good luck in any place your future journey will take you! I sounds like I am saying goodbye to someone leaving, but I am not. I am just saying that every end is the new beginning. What else I would love to invite you into doing is to analyze why this path of yours (creating a bunch of super cool module) didn't lead you to the place expected. Recently @kongondo, the only other prominent paid module creator I can remember, has done the same exit as you. Why is this? This question is of interest to me because I have many times thought about how I myself could build my income upon what I love and know - ProcessWire. Could it be, that PW is so much a DIY kind of thing, that most of us want to build something of our own and are not ready to subdue to modules authors' way of doing things (other than @ryan himself)? Or does everyone here enjoys opensource so much that proprietary is something to avoid? Or is it just simply not enough of target audience?
    2 points
  40. I don't want to be too blunt and I can't speak for anyone else, but I've never referred a client to a software or service website as part of the education process. It doesn't do anything for them. You are the expert. The person making the pitch should be able to fully explain the technology stack to the extent that the conversation requires it in language they can understand because we are the interpreters. Clients trust me because I am the expert and the top 3 things they care about are these, in this order: How much is this going to cost me? Why don't we use xxx? (or, our current site is xxx I'm not sure we want to switch) When is it going to be done? Sending a client to any site for tools or software is like saying "here, do your own research". The ProcessWire site, like any other development tools/software sites, isn't there to woo clients. Most clients don't care enough to take time and truly understand it because that's not their job. If a curious client is in a position to go to websites like ProcessWire, several steps have been skipped in the client discovery/planning process IMHO. I'd even go so far as to say that if a site has "Docs" or "Documentation" in the primary nav, it's not for clients and they shouldn't be there. I hope this isn't a too hot a take... I would say that improvements could be made iteratively with more use of color for contrast, emphasis, and indicating priority. I think it's a flexible design that can evolve in whatever capacity that may be needed. This has the ability to highlight some impressive facts and figures. No notes on the content, some elements could be integrated into the current design. Even then, facts and figures are for devs. I used the word "scalability" with a manager once and they stopped the conversation to ask "wait, what does that mean?" and still didn't care when I explained. A a CMS or framework site is never going to lead to clients translating what's on the page to time or money. In all likelihood, the conversation you are having with a client at 10:00 just followed a call with their product distributor at 8:00am, their accountant at 9:00, and at 11:00 they're meeting with other members in management. Personally, I would no sooner send someone to processwire.com than I would laravel.com. You are the time and money. I agree with this. I will go out on a limb and say the number of end customers who went to the Drupal site and left thinking they need a Drupal site isn't zero, but it's probably close. If someone is hiring a Drupal developer then they're in a role where it's part of their job to understand the tech stack even if they aren't a dev. Visiting wordpress.com, it doesn't target the end user but name recognition still draws business which overcomes the website entirely. This is fair. It doesn't take a monitor that computer professionals use to get this experience. All you need is a consumer iMac. I think iteration can address concerns. I don't want to belabor the point, but to be fair, did you ever send a client to the QuarkXpress website... Just a little joke ☺️ Cheers from a fellow old school developer who built their first website in 1997 and tinkered with QuarkXpress 🍻
    2 points
  41. Hey everyone, I've noticed that AI-related discussions are popping up more and more across the forum, but they're scattered across different threads and often go off-topic (guilty as charged). So I thought it's time we create a dedicated place to collect our experiences, tools, and workflows around using AI with ProcessWire. Why this thread? There are several existing discussions that touch on the topic: My recent post about Cursor turned into a broader AI conversation that drifted off-topic (link) There's a thread about MCP (Model Context Protocol) and ProcessWire (link) @gebeer started a thread about creating better Markdown documentation for ProcessWire - IMHO it was more of a request rather than a howto (link) All of these are related, but none of them serve as a central hub for the bigger question: How do we best leverage AI in our day-to-day ProcessWire development? What I'd love to collect here: What's your current setup? Which AI tools are you using (Cursor, GitHub Copilot, Claude, ChatGPT, something else)? How did you integrate them into your workflow? What works well? Where does AI genuinely save you time with ProcessWire? Module development, migrations, frontend templating, debugging, writing selectors, documentation...? What doesn't work (yet)? Where do the current AI tools fall short when it comes to PW specifically? Is it the lack of training data, the API structure, something else? Context & documentation: How do you feed ProcessWire knowledge to your AI? Custom rules, project documentation, Markdown exports of the PW docs, MCP servers? Tips & tricks: Any prompts, configurations, or workflows that made a real difference for you? Looking forward to your input!
    1 point
  42. tried several of them, including kilo code from NVIDIA (I think) which uses a clean spec-driven workflow. Currently working on my own version of that with prompt templates, verification through hooks and all that good stuff. Spec driven is a good approach, especially for larger features. For small things I'm still using good old chat in claude code.
    1 point
  43. Visiting https://www.kimi.com/membership/pricing a modal pops up for me and its top part looks like this: To tell the truth, I will probably use it for browser-based prompting, and it shows how many such tasks are still available for that day. For example:
    1 point
  44. Used Cursor for a few months! Now using Claude inside Cursor lol Why? To be honest sometimes it's difficult to actually grasp and put into words, but I'd just say I go with "feel" and right now Opus just feel really nice. Also in general in any AI tool what's invaluable now is using MCPs: Figma, Notion, Gitlab, Chrome. Testing using ddev-claude-code as of today to just let it run wild in docker. Question for ddev users, anyone found a projects that lets you manage multiple worktrees of the same project? But at the same time, copies anything related to the php project? For example in case of processwire, the site/files. And override the ddev name, do to; site-dev1.ddev.site, site-dev2.ddev.site. Every undocumented AI agent doesn't catch FieldtypeOptions field evaluates "truthy" you gotta check $field->id 🤣. Maybe I should definitely find a way to include something like context7 but I do fear prompt injection (aha, but let claude run wild on its own? haha). To be honest, it now always feels what "doesn't work" are always my own boundaries of time and multitask lol I am making a ProcessWire MCP inspired by the threads around and I think it could be very valuable but for now having AI executing script through the CLI in ddev is also amazing and just gets me there, of course using the one and only RockMigrations. An maybe an effort that is not about my docs, but my customer docs, is a skill that makes a documentation site for the specific processwire installs in Notion pages. What an insane amount of module development is being done now right?!
    1 point
  45. Done. https://context7.com/phlppschrr/processwire-api-docs This is a quote from the other thread but I think it fits better here. @interrobang this looks impressive. Would you mind sharing more info about how that was built, how it can be used and how we can make sure we don't get prompt-injected something in chinese ^^
    1 point
  46. @ai_slop Look here: The many pinned threads make the forum a bit confusing. Perhaps a moderator or @kongondo could “optimize” this a little. 😁
    1 point
  47. And about Repeater Matrix page classes. There were discussions to have custom classes for RM types... Is this possible?
    1 point
  48. Largely agree with this, but in my experience, it has depended on the (potential) client and their role and what CMS they are moving from. I think I should have made this qualifier because I agree with this. It does depend on the size of client and role the website plays in their business operations. @Peter Knight I think reliability is also a very strong key feature. Those coming from WordPress will be all too familiar with surprise downtime, plugin vs. core upgrade challenges, high update frequency, and overall complexity in maintenance. If as a website owner/maintainer you need to call a developer to fix a website regularly, or to even just update the site because you can't figure it out, then you're not taking into account the hidden costs. Add plugin subscriptions on top of that. As I've said elsewhere in the PW forums, I like WordPress- I make a lot of money off of it. I'm not shy about openly discussing pain points with clients because I have none to offer and they're well familiar with those they've had to live with. I think I mentioned this in another post/thread recently. A demo can do a lot of the talking. I think PW had one at some point(?) but it would benefit both developers and clients immensely now. You can skip the main ProcessWire site, and a lot of Q&A, by just saying "take a look". Yes. No. I don't think that there is a standalone repo for the new theme either. I think it would be really helpful to make that a standalone repo that can accept PRs. Having the theme wrapped into the core means that all fixes and updates have to go through the same channel as core. The issues repo has been much more busy after the new theme launched. While there are a lot of big suggestions and input, there are plenty of fixes and smaller suggestions that could be implemented via PRs and result in easier per-contribution review, faster iterations, and quality improvements.
    1 point
  49. Hi everyone, First of all I had no idea, which category would fit best ... I'd like to share a little tool I've been working on to make the initial setup of ProcessWire even faster, especially when working on remote servers without SSH access. What is it? kickstart.php is a modern, single-file installer/loader for ProcessWire. Instead of uploading thousands of files via FTP, you just upload this one file and it handles the rest. Key Features: Version Selection: Choose between the master (stable) or dev branch directly from GitHub. Smart Multi-Language: Built-in support for English, German, Spanish, and French (with automatic browser language detection). Modern UI: Built with Tailwind CSS, AlpineJS, and smooth animations using Anime.js. Pre-flight Checks: Automatically checks for PHP version requirements and prevents overwriting existing installations. Automatic Cleanup: Removes the downloaded ZIP archive and temporary folders after extraction. How to use it: Upload kickstart.php to your webroot. Open it in your browser. Choose your version and click install. Once finished, click the button to start the official ProcessWire installer. I hope some of you find this useful for your workflow! Feedback and suggestions are always welcome. Cheers, Markus kickstart.php Improved Version now available on GitHub: https://github.com/markusthomas/ProcessWireKickstart
    1 point
  50. I built "my" first website in `96 with Adobe PageMill, fighting with tables to craft the basic layout it had. It was for a bank, a handful of static pages. I had no prior experience with HTML... :P
    1 point
×
×
  • Create New...