All Activity
- Today
-
Context Module - AI-Optimized Site Documentation with TOON Format
maximus replied to maximus's topic in Modules/Plugins
Context Module v1.1.9 Released! 🎉 Quick update with two improvements based on your feedback: Fixed Cline Skill Name Compatibility (reported by @szabesz) Changed SKILL.md name: from ProcessWire Context - example.com to context Cline requires exact folder name match to activate skills Now works out-of-the-box when exported to .agents/skills/context/ Improved Better Project Summary Template (improved by @psy) Rules now embedded directly in the file (AI sees them every update) "Update in place" mode instead of overwrite (preserves history) Boundary protection: #### DO NOT UPDATE ABOVE THIS LINE #### Auto-removes duplication More concise and actionable format What this means: More reliable session continuity with AI agents AI won't accidentally modify template structure Cleaner, focused checkpoint summaries Download: GitHub Thanks @szabesz for the testing and @psy for the improved template! -
szabesz started following Image Classes — a CSS class picker for images in richtext editors
-
module Image Classes — a CSS class picker for images in richtext editors
szabesz replied to Mikel's topic in Modules/Plugins
Nice solution! @Mikel Thanks for sharing! I will surely try it out. I used the style's menu for solving this, but your module is sure a lot more user-friendly. -
Context Module - AI-Optimized Site Documentation with TOON Format
szabesz replied to maximus's topic in Modules/Plugins
@maximus Thanx a lot! A little request: for Cline to pick up a SKILL (unfortunately) the name must exactly match the folder's name `name: context`. So `name: ProcessWire Context - example.com` does not work. In Cline, one can turn SKILLs on/off to save on token usage. Obviously, skills turned off will be excluded. Currently, mine looks like this: Well, the UI is clearly not designed for a lot of skills and mass management of them, but it's still in beta, so I hope it will be improved in the future. I did experiment with how Cline handles the context skill. Here is what I found: Test 1: Finding Child Pages Task: What pages are under the 'About Us' page? Without the context skill: It queries the database and is actually able to give the same information, plus a bit more (page IDs, for example). This uses about 19-24k of the 200k context window. With the context skill: I specifically asked: "What pages are under the 'About Us' page? Do not query the database. Use the SKILL named context to figure it out." Using the skill only is (of course) a lot faster. Both ways used about 19-24k context, but with the skill only, Cline just read 2 files (agents/skills/context/tree.json and agents/skills/context/structure.txt) and outputted: Under the "About Us" page (template: basic-page), there are 3 child pages: Terms & Conditions (template: basic-page) Disclaimer (template: basic-page) Privacy Policy (template: basic-page) Test 2: Explaining Repeater Matrix Fields Task: Explain what Repeater Matrix fields are used by the system, and for what. I tried asking both: "Explain what Repeater Matrix fields are used by the system, and for what. Do not query the database." and just: "Explain what Repeater Matrix fields are used by the system, and for what." Both resulted in similar outcomes, and the database was not queried. Cline read 12 files (the first two were agents/skills/context/matrix-templates.json and agents/skills/context/structure.txt) and also analyzed the template files. For a 99k context usage cost, I got a general overview, not just the structure, but how they are actually used. Restricted to context skill only: Next, I tested this: "Explain what Repeater Matrix fields are used by the system, and for what. Only query the skill named context and nothing else." For a 21k context window usage, I got the structure and info on what they are used for. Naturally, because it was no allowed to analyze the templates, it could not completally figure out how they are actually used in practice. I think Cline is great. It is – of course – an improvement over a simple chat window when the developer needs to manually provide files and context for each session. I am yet to test its Memory Bank and other advanced features, but even my basic Skills setup is very powerful already. And thanks to z.ai's GLM-5.1, using it is pretty cheap. -
@Soma a massive welcome back. I followed you on Twitter and absolutely loved your art journey but then it just seemed to disappear. As I hate social media I am not really on anything else, and certainly don't use X anymore. I always wondered what happened to a forum legend. As somebody mentioned earlier, you probably don't realise how much your posts have and still do help people.
-
If anyone is interested in being able to set script-src-attr to "none" on the frontend of their sites, the namespaced branch of Tracy now uses eventListeners everywhere - no more inline handlers.
-
Hi, everyone! While working on a client project we were looking for a way to let editors apply CSS classes to individual images in rich text fields — quickly, visually, and also in the frontend editor. ProcessWire already has several ways to get CSS classes onto images, so it's worth being precise about what this module does differently: TextformatterFluidImages adds one class to all images automatically — great for img-fluid across the board, but there's no per-image choice. TextformatterImageInterceptor is more powerful: editors tag images in the image field, and the Textformatter applies the corresponding classes at render time. The logic is developer-defined and centralized, which is exactly right when you want consistent, rule-based image treatment. But the class is invisible in the editor, applied only in the frontend output, and editors have to set the tag in a completely separate place from where they're actually working. TinyMCE's built-in styleFormatsCSS is the closest thing to what we wanted. You write CSS, ProcessWire turns it into a Styles dropdown. It works, but the dropdown is generic — it shows all defined styles regardless of what's selected — and there's a known accumulation issue where nothing prevents float-left float-right ending up on the same image. And it doesn't work in the frontend editor. What we needed was simpler: editor clicks an image, picks a style, sees immediately which styles are active, can combine them or remove them individually. No dialogs, no separate fields, no render-time magic — the class goes directly into the <img> tag in the saved HTML, visible and editable right there in the editor. That's what this module does: It registers a context toolbar in TinyMCE that appears as a floating "Image Style" button when an image is selected. For CKEditor the same options show up in the right-click context menu. The class list is defined once in the module settings and works across both editors — no separate configuration per editor type. Each entry shows a checkmark when active, clicking it again removes it, multiple classes can be combined freely. Works in the admin and in the frontend editor. Complete Readme on GitHub: https://github.com/frameless-at/ProcessImageClasses and the module directory. Any thoughts on further improvements welcome! Cheers, Mike
- 1 reply
-
- 4
-
-
This start to look like "The Expendables". The superheroes are back 😎
- Yesterday
-
Hey, welcome back @Soma! Great to see you here (again). So, I'm my self are away from PW since around 2022-08. I only followed a bit by reading some of Ryan's blog posts and @teppo's ProcessWire Weekly. Well, maybe this summer I'll be able to work more with PW again and participate here in the forum. 💬
-
Context Module - AI-Optimized Site Documentation with TOON Format
maximus replied to maximus's topic in Modules/Plugins
Context Module v1.1.8 Released! Thanks everyone for the great feedback! Here's what's new: New Features SKILL.md Auto-Generation (requested by @szabesz) Automatically generates SKILL.md for AI coding agents (Cline, Junie, etc.) Lists all exported files with descriptions and usage examples Follows Cline/MCP skill format specification Enable/disable in module settings (enabled by default) Project Summary Template (suggested by @psy) Auto-creates prompts/project-summary.md template Helps AI agents maintain context between coding sessions Structured format: project state, decisions, issues, next steps Ask AI to update at end of each session for seamless continuity Setup for AI Agents: Cline (PHPStorm/VSCode): Set export path to .agents/skills/context/ Junie (PHPStorm): Set export path to .junie/skills/docs/ Re-export and SKILL.md + project-summary.md are auto-created Bug Fixes FieldtypeQRCode Compatibility (reported by @psy) Fixed error when exporting field definitions for FieldtypeQRCode Added method_exists() check before calling getModuleInfo() Now works with all fieldtypes using .info.php pattern Documentation Added Best Practices section to README covering: AI coding agents setup (Cline, Junie) Session continuity workflow File upload strategies for optimal token usage Download: GitHub Thanks @szabesz and @psy for the excellent suggestions! -
Found it out myself. As a test case, I set up a vanilla multi-language site and created a custom TextLanguage field "custom1" for the images on "home". I wanted to change and save a single language value directly, e.g. $mlFieldValues->setLanguageValue("de", "new Value") ; $p->of(false); $p->save(); But this deletes all other language values. Instead, I have to 1. read in all current values, 2. change whatever language value has to be changed and 3. save the entire object. $newValues = ["de"=>"DE overwritten by script", "fi"=>"FI overwritten by script"]; $p = $pages->get(1); $img = $p->images->first(); $mlFieldValues = $img->custom1; print "\n\nBEFORE:\n";print_r($mlFieldValues); print "\n\nNEW VALUES:\n"; print_r($newValues); $p->of(false); foreach($newValues as $lang => $newValue){ $mlFieldValues->setLanguageValue($lang, $newValue) ; } $img->custom1 = $mlFieldValues; $p->save(); print "\n\nAFTER:\n";print_r($mlFieldValues); Output: BEFORE: ProcessWire\LanguagesPageFieldValue Object ( [default] => previous english value [de] => previous german value [fi] => previous finnish value ) NEW VALUES: Array ( [de] => DE overwritten by script [fi] => FI overwritten by script ) AFTER: ProcessWire\LanguagesPageFieldValue Object ( [default] => previous english value [de] => DE overwritten by script [fi] => FI overwritten by script )
-
Thanks @szabesz My comparison would be based strictly on licensing and 3rd party dependencies, so it wouldn't be fair. I didn't want to inject any processwire modules/jquery, etc. into the frontend. I leave processwire to do what it does best. I found sundeditor while working on a forum project a few years back. The source css/js files are fairly easy to update/customize, and the plain javascript, MIT license, and source were big selling points. So I can't really offer a comparison as I haven't tried modifying tinymce/ckeditor.
-
Context Module - AI-Optimized Site Documentation with TOON Format
szabesz replied to maximus's topic in Modules/Plugins
Turns out, I started using Cline in PHPStorm instead of Junie. I used up all credits – that came with Junie's trial period – in no time. However, that was not enough time to decide if Junie is worth the money or not. My main issue was that I want to use agent Skills, but Junie is still in "beta" state in that regard and it has no useful documentation on its Skills feature either. Being new to coding with AI agents, I do not want to spend money on something I do not have enough time to play with in advance. So I looked for alternatives, and found the Cline plugin (extension), and sort of fell in love with it at first sight :D I have a z.ai subscription (GLM Coding Lite-Yearly Plan) which was cheap thanks to last year's Black Friday deal (thanks to @wbmnfktr for mentioning z.ai to me) and the GLM-5.x models are pretty good (https://docs.z.ai/guides/llm/glm-5#coding-performance-on-par-with-claude-opus-4-5) so the Cline + GLM-5.x combo works well, cheap and is relatively easy to get started with. My subscription has a "5 Hours Usage Quota" and the maximum I used it so far was only 6% percent in a 5-hour coding session, giving me plenty of room for a lot more usage. So this setup is cheap and powerful, I "just" need to develop my own Skills library, on which I already started to work on. (BTW, JetBrains IDEs do support 3rd party LLM providers, but z.ai has a non-standard BASE URL, and the IDE does not support that which is a shame. It fails just because of that.) Anyway, thanks to the output path being configurable in the settings of Contex, I pointed it to .agents/skills (that's where Cline saves its files, contrary to Cline's official doc page which is erroneously states it is [~/].cline/skills), so now the module generates files into .agents/skills/context. So far so good, but a Skill to be used properly by the agent needs a proper SKILL.md file too. At least that is my understanding. So I vibe coded a BASH script to generate SKILL.md for me, I just need to run it after each Context generation process, and I get the following in .agents/skills/context/SKILL.md : I am not sure this is the best SKILL.md content but the LLM suggested this and it aligns with Cline's recommendation (after I asked the model to make it align...), so I started using/testing it. @maximus I wonder if you could add support for optionally generating SKILL.md, too. The issue with SKILL.md files is that agents seem to have certain preferences regarding their content (ie. the format of the information is presented in them), so maybe a template-based approach could be adopted. I am just brainstorming here as I have no specific idea about how such a template option could be implemented. Thanks in advance for considering. -
Context Module - AI-Optimized Site Documentation with TOON Format
psy replied to maximus's topic in Modules/Plugins
This module is great for establishing the rules for AI. Something I needed was a way to continue the narrative between sessions. Here's what my AI suggested as a prompt: That way I can close an IDE session and use both Context prompts and project-summary.md to bring the AI up to date. - Last week
-
ryan started following Weekly update – 27 March 2026 and I'm back
-
@Soma Great to see you back! A couple weeks ago I was just thinking about you and how I wished you were still around here. I've been seeing your amazing paintings on Facebook and figured you had moved on to other things, but thought of sending you a message there, so what a nice surprise to see you here.
-
This week I worked with Claude Code on refactoring the core WireHooks class to improve it in various ways. I do this work because I like to code, so am of course handling that part. But Claude has been very helpful in finding issues as well as reviewing all my code before it gets committed. In this case, Claude found several bugs that are now fixed, and also saved me from introducing more when I added new features. Working with Claude Code reminds me of 1989 when I was in high school learning Turbo Pascal and building a BBS, and getting help from a neighbor and good friend that was doing the same. I learned so much then and now it feels like that time again. But man have things come a long way since then. I asked Claude about helping with the ProcessWire issues and requests GitHub repos, and now it's solving issue reports, replying to them and committing fixes. For simple fixes that involve a line or two, I'm going to let it handle the the whole thing. It's posting under my GitHub account, but it identifies itself as Claude in replies and and in commits. That way it's easy to tell what it does under my account. I had it just cover a couple of issue reports today as a test (see 2195 and 2192), but will be having it do a lot more going forward. Back to the WireHooks class, I asked Claude about writing a commit message for the WireHooks updates, and wow, check this out: Bug fixes in WireHooks: - conditionalArgMatch(): Fix Selector mutation bug where the shared Selector object stored in hook options was permanently mutated after the first call, causing argMatch hooks (e.g. addHook('WireLog::save(=errors)')) to stop matching after their first invocation. - getHooks(): Remove key variable from foreach to prevent shadowing $method param. - getHooks(): Replace array_merge() in loops with direct array append. - addHook(): Prevent 'noAddHooks' option from leaking into stored hook options. - isHookedOrParents(): Use $className string consistently in cache key writes, rather than $class which may be a Wire object. - runHooks(): Scope $useHookReturnValue inside foreach so it resets per hook. - runHooks(): Use strict null comparison ($toObject === null). Bug fixes in HookEvent: - arguments(): Allow setting an argument value to null (use func_num_args() > 1 instead of $value !== null check). - arguments(): Use array_key_exists() instead of isset() for null-correct lookup. - getArgumentNames(): Guard ReflectionMethod instantiation with method_exists() to avoid uncaught ReflectionException for dynamically-added hook methods. - __toString(): Fix argument list building (was appending to string instead of array), add null/bool display, avoid PHP fatal for objects without __toString(). New features in WireHooks: - cancelHooks: Now accepts string values 'before' or 'after' (in addition to boolean true) to cancel only hooks of a given type. For example, a before hook can set $event->cancelHooks = 'after' to cancel remaining after hooks without affecting the hooked method call. - Custom event data carry-forward: Custom data set on a HookEvent (via $event->customKey = $value) is now carried forward to subsequent HookEvent instances within the same runHooks() call. This allows before hooks to pass data to after hooks without using external variables. - getHooks('*'): Supports wildcard method to return all hooks for all objects. Available in debug mode only (uses allStaticHooks/allLocalHooks aggregates). - allStaticHooks: Now tracked alongside allLocalHooks when debug mode is on. - addHooks() comment fix: "If there is a parenthesis" corrected to "no parenthesis". - addHook() exception messages improved with additional context. - runHooks() docblock updated to include 'either' type. - hookTimer() PHPDoc: @param String corrected to lowercase string. New features in HookEvent: - $defaults static property: Defines the canonical set of standard HookEvent fields, used to distinguish custom data from built-in event properties. - $eid property: Each HookEvent instance gets a unique sequential event ID. - set() override: Tracks non-default keys set on the event in $customKeys. - getCustomData(): Returns only the custom (non-default) data set on the event, used internally by runHooks() for the carry-forward feature. - cancelHooks property updated to support bool|string type. Anyway, I know a lot of you here are deep into the AI stuff, and I'm just getting started, so none of this is surprising. But it sure is a pleasure collaborating with Claude Code on this stuff and it brings back that coding wonder and excitement from 1989. Some Claude and Claude Code podcasts I've enjoyed listening to or watching this week include one from AI for Humans Claude is Cooking, Wednesday's AI Daily Brief on How to use Claude's new upgrades, and the Get Educated AI video of how to setup Claude to use your computer and web browser, etc. (though I've not tried this just yet!). Lastly, last week I put together a ProcessWire powered JSON feed of bike tours, and the client prompted that they wanted a map and look what Claude Code did, I'm impressed!
-
- 11
-
-
Peter Knight started following How to deal with video in 2025
-
Is Vimeo or a dedicated video host not an option?
-
So glad to have you back. Back when I joined the PW community in 2012, you were a constant help in the forum and with your modules.
-
@szabesz Sorry to hear that. I've been billed from Singapore for Kimi Code... Not sure if it would be useful to add mandarin in the email subject to create urgency? Though I think english is widely spoken there too.
-
szabesz started following I'm back and cre8aplace social networking platform
-
Woah! Congrats! I'm loving this :) http://suneditor.com/sample/index.html This one? Could you please compare it to ProcessWire's WYSIWYG editors?
-
Nice to see you again! What? Has it really been 7? Feels like yesterday...
-
@ai_slop No worries. I have news regarding my issue. Finally, today Kimi's support replied! (They are definitely having trouble replying to support requests in a timely manner.) Their reply was a step-by-step guide on how to get to their subscription page, the one we are talking about. They also asked for a screenshot of it, even though I provided it in both of my support request emails. Even though I supposedly deleted my account, I could just log in again as usual. So, I made a full browser window screenshot of the same page you and I have already shared our screenshot of, in which there is no "Cancel Plan" button. Support asked: "If there are any other questions, please contact us." I replied: "Now what?" Just a week or two, and they will probably reply again... Cheers,
-
Hi @Roope, thanks for this great module. I found a markup issue in Email Obfuscation 1.3.1 (ProcessWire 3.x, PHP 8.1+) when an email link contains an aria-label attribute. Reproduction Input HTML: <a href="mailto:mail@domain.de" class="uk-button uk-button-text" aria-label="Send email">mail@domain.de</a> Output with EMO enabled: <a href="mailto:<noscript data-emo="...">Enable JavaScript to view protected content.</noscript>" class="uk-button uk-button-text" aria-label="Send email"><noscript data-emo="...">Enable JavaScript to view protected content.</noscript></a> Expected behavior: the whole <a ...>...</a> should be obfuscated/replaced as one unit, not inject <noscript> into the href attribute. Suspected cause In EmailObfuscation.module (obfuscate()), the skip pattern for label also matches aria-label, which seems to split the anchor tag before the mailto regex can process it as a full link. As a temporary workaround, removing aria-label from mail links avoids the broken markup.
-
It is really a pleasure and an excitement to see you back, @Soma! I am sure something great is going to happen soon!
-
Welcome back.Soma. So nice to have you around again. Gideon