Jump to content

All Activity

This stream auto-updates

  1. Past hour
  2. I love that rather than just consuming AI, you're trying to learn how it actually works. Speaking of the translation of code - I wonder if AI would make it easy to provide a PostgreSQL database layer for ProcessWire? Also speaking of C, I wonder about translating the entire ProcessWire codebase into Rust. (It would probably be expensive in terms of token use) ProcessWire is fast as PHP apps go, but Rust is blindingly fast, but harder to learn than PHP. It's also memory safe whereas C isn't. It might not work, as PHP is interpreted so it makes it easy to deploy individual files, whereas Rust compiles to a single binary executable, so it's probably like comparing apples with pumpkins, but all kinds of things ight be possible of you don't have to painstakingly write all the code by hand.
  3. Today
  4. Update (v 0.58.0): tag-vocabulary management & a "Used in" column Hi, everyone! We´ve been enjoying developing the module a bit further this week. Since the last update the module has grown from 0.55 to 0.58. Two bigger additions: 🏷️ Tag-vocabulary management You can now curate a field's predefined tag vocabulary right inside the tag picker, with no trip to the field settings: Rename or delete a predefined tag library-wide, inline (no modal-on-modal). Table rows live-refresh immediately after a library-wide rename/delete. Newly entered tags can be promoted into the field's predefined list. This is only available when the image fields file tags setting is set to "User selects from list of predefined tags + can input their own". Alphabetical ordering, and a mobile-friendly single-column tag chooser with touch controls. 🔎 "Used in" – a content-based where-used column A new column answers the question you actually have at a glance: which pages embed this image? It scans rich-text content (not just the field relations), so it also catches images placed via "Insert from library": Cross-page "Insert from library" embeds are resolved to their true source image, and embeds inside (Matrix)Repeaters are attributed to the owning page. The count is a plain link that opens a dialog listing every page and the fields the image is embedded in. The "Used in" and "Variations" columns are now sortable, and integer columns are centre-aligned. Next up (in development): nested collections – group collections into subgroups with a drag-and-drop manager, cascading fly-out menus in the bar, and touch-friendly curation. Have a nice weekend! Cheers, Mike
  5. Yesterday
  6. Have FUN this weekend Ryan! Isn't that feeling of discovery a wonderous thing.
  7. All I can say is... 🤯
  8. This week we've got a big batch of issue fixes on the core dev branch (about 18 fixes), most related to GitHub issue reports. I've also been catching up on some client work this week, so not as many updates as in the last few weeks. As I use more AI in my work, I've been building up a real desire to understand how it works. To me it seems like magic. So recently I started building a language model in PHP. Admittedly PHP isn't the ideal language for building such a thing, but this is really about learning, and so I thought I should use the language I know best. Using something like PyTorch in Python would certainly make things much easier, but would also abstract away a lot of the understanding I want to get out of the project. The new model (and future ProcessWire module) is called Rambler. Currently it rambles on, often incoherently, hence the name Rambler. Though it'll get more coherent as time goes on, no doubt (hopefully!). Rambler uses zero machine learning libraries, no black boxes, and in fact has no dependencies at all. It's just pure PHP implementing the same mathematical foundations that power modern AI systems like GPT, at least that's the goal. I'm writing all the code myself, but I do have Claude as my teacher, describing each step, teaching me the concepts and terminology, and telling me what I need to code. After I code each part, he looks at it and tells me what I did right and wrong. It's a slow process but I learn by doing, and so it's also a lot of fun. It certainly helps to have an infinitely patient teacher. Currently the project runs two models side by side (for comparison): A Markov n-gram model, which is a classical statistical approach that predicts the next word based on how often word sequences appeared in training data. A neural network model that learns distributed word representations called embeddings. The neural model passes those embeddings through a hidden layer with ReLU activation, then predicts the next word using a softmax output. As far as I understand it, these are the same core building blocks used in early neural language models. The most time consuming part of doing this in PHP is the training. Python has libraries and functions that handle a lot of the hardcore math in ways that can take advantage of the hardware, like GPUs. But this is not the case with PHP, so training uses the CPU, and a lot of it! As far as the training system goes, it uses mini-batch gradient descent with backpropagation. The model makes predictions, measures how wrong it was (which is the "loss"), and then works backwards through the network, computing gradients to adjust every weight in the right direction. Rambler also includes two tokenizers: A word-level tokenizer, and a BPE (byte pair encoding) tokenizer. BPE is the subword strategy that is used by GPT, Claude and other modern LLMs. But for the small scale that I'm working at, the word-level tokenizer works faster, so far. The next milestone is adding an attention mechanism in a RamblerTransformer subclass. This attention mechanism (a transformer) is the core innovation behind a lot of modern LLMs. I'm hoping to get started on that part this weekend. Beyond being a learning exercise, the longer-term goal is to train it on all of the ProcessWire documentation (which is what they call a "corpus" in this context) and release it on GitHub as a learning resource, and a PW module. Perhaps someday it'll be a tool in ProcessWire, or at least a really smart search engine for ProcessWire, we'll see. As far as I could tell, there aren't any other PHP-based language models that use the same technologies used by modern LLMs, so I figured, why not. I want to understand how they work under the hood without wading through Python frameworks, and I'm sure others do too. Once I get a little farther along with it, I look forward to getting it up on GitHub as a standalone project, but also as a ProcessWire module. The slowness of the training process (the model, not me... well okay, probably me too) is the hard part. I'm currently running a 30 hour training on all the text from a book. When the project is finished, I'm likely going to have Claude or Codex do a translation of the training code into C, that takes advantage of the much faster math capabilities available there. From what I understand, a 30 hour training in PHP will take about 30 minutes in C. I don't know if that's accurate or not, but it sounds good enough that I'm going to find out. 🙂 Thanks for reading and have a great weekend!
  9. 😆 I blame the docs. But seriously glad it’s working now.
  10. That's the reason why it didn't work on first try on my instances. 🙈
  11. SeoNeo 1.1.4 is live. Pushed to: PeterKnightDigital/SeoNeo (GitHub) Release: https://github.com/PeterKnightDigital/SeoNeo SeoNeo 1.1.4 — what's new Resilience. If anything goes wrong while building the SEO meta block, the page now still renders cleanly — visitors see normal content and styles, only the SEO tags are absent on that one page. Previously, certain failures could blank out the entire <head> and break the page layout. New seoneo log. When something does fail, SeoNeo writes a one-liner to site/assets/logs/seoneo.txt (also visible at Setup → Logs → seoneo in the admin) telling you which page tripped and what the error was. The log file is created on demand, so clean installs that never hit a problem won't see it appear. Better setup feedback. The auto-inject checkbox in module config now warns you if no template has seoneo_tab yet — the most common reason new users see no SEO output on the front-end. Docs. The README's Installation section now spells out that you only need to add seoneo_tab to a template (the rest of the SEO fields are auto-inserted on save — a 1.1.0 feature that was easy to miss), and the JSON-LD section has a worked example for adding custom Schema.org types like Recipe or Event via a hook. Backwards-compatible — drop in over 1.1.3, hit Modules → Refresh, you're done.
  12. No hurries... it works and as I use Twig, I need to manually add it anyway. Gave it a try... and it actually does work. Either this is a new behaviour or I never tried to do it this way. That's working fine for me. Even easier than importing from another template as I did. As it turned out to be really easy I wouldn't really need the option to check a template and import the fields - I guess. The PW workflow fits me perfectly fine as I need to migrate each template after the other, in my existing project. In new projects this might be a bit different, but I can't really tell for now. Let's keep it as it is, as it's working and proven PW way of doing things. I saw that! But your provided example $wire->addHookAfter('SeoNeo::getJsonLd', function(Hoo[...] would totally fit my needs! Your docs seem to be more complete or detailed. For now everything should be doable in my project. Some hooks, some manual editing on my side and my site... could be perfect. I hope I get this done this weekend to report back. This helped a lot! I will let you know when there a road-blockers or show-stoppers.
  13. Hi @wbmnfktr Thanks so much for the feedback, and I'm glad you like it 🙂 I can only take credit for the planning and direction, but I put a lot of thought into it, and I'm glad to hear it's working (kinda') ok. On the specifics... That's interesting because I had a lot of issues getting it to work on the first pass. It turned out to be a non-related PHP error in my <HEAD> include was blocking the auto-inject. Once I cleared that, it worked. But I will now triple-check. Maybe hold off until I can come back to you tomorrow? I might have mistakenly assumed the issue was closed by "fixing" an unrelated event. I'm not sure I'm understanding correctly here, so apologies for starting from scratch. Yes, the module adds several fields between the SEO open and close tabs. I was thinking that manually adding these to every template would be a chore for people; the fields should be auto-added once you manually add the SEO open and close tab, and then save. LMK if I misunderstood there. Would you find it useful to pick the templates from the SeoNeo module config page (bulk add in one save), or do you prefer the standard PW workflow of opening each template individually? I'm quoting the following from the docs and AI (spot the em-dashes) 🙂 What ships today (built-in): Organization, WebSite, WebPage, Article, Person, BreadcrumbList — auto-generated as a linked @graph How to add custom types (Recipe, Event, Product, RealEstate, etc.) right now: Hook ___getJsonLd() in your site's ready.php or a custom module: $wire->addHookAfter('SeoNeo::getJsonLd', function(HookEvent $e) { $page = $e->arguments(0); if($page->template->name !== 'recipe') return; $data = $e->return; $data['@graph'][] = [ '@type' => 'Recipe', 'name' => $page->title, 'description' => $page->summary, 'prepTime' => 'PT' . $page->prep_time . 'M', 'cookTime' => 'PT' . $page->cook_time . 'M', 'image' => $page->image ? $page->image->httpUrl : '', ]; $e->return = $data; }); What's planned (future, not committed to a version): A higher-level API — $page->seoneo->schema('Recipe', [...]) — with per-type hookable helpers. It's in the roadmap (section J in the backlog) but deferred because the API shape isn't stable enough to ship without risking breaking changes. The hook approach above is the recommended production path for now. Also I believe my own docs are fuller in detail: https://www.peterknight.digital/docs/seoneo/1.x/structured-data-json-ld/ Anywho LMK if any of those are useful answers and feel free to DM me too. Cheers P
  14. No Num-Pad you say? Then you aren't ready for this... Vortex Core, Cherry MX Brown switches...
  15. Pretty good prompt engineering! Why have I never thought of this? :D
  16. Took the time and installed SEO Neo to one my larger and most complete side-projects, and so far I am really impressed what can be done with this out of the box. The depth and customisation feels great on the first look. Might need to dig deeper into all the settings and options, but WOW! BUT... I noticed that auto-inject didn't work. Tried that in another instance that's almost clean without any other modules or whatever. I probably missed something at some point. Got it working in both instances nonetheless. I might try it in a clean environment again, but as it is not a show-stopper for me I won't lose another thought about it. Using the $page->seoneo->render() worked everywhere, even in Twig (TemplateEngineFactory) with {{ page.seoneo.render() }}. NICE! One other thing I'm not sure about is adding SEO Neo fields to templates. The module creates quite a few fields, but there is no option to single-click/single-action add them to a template of choice. Sure, in total only a minute or two to add them manually to ONE template but on larger sites with a lot of templates... well. I helped myself, added all fields to a new template and imported that new template into existing templates. More a hack, than a workflow, but at the end fields were in their right spot. In terms of Schema/JSON+LD: what other schemas are planned or how would I add custom ones? Looked into the docs but couldn't spot a reference to custom types like recipe, book, event, real estate / or related schemas. Overall... migrating from a custom solution to SEO Neo is probably doable in a few hours with this very special project. Luckily we have way better AI support now so it might be that all the Claudias out there can assist. First impression was great. Will probably move that project over to SEO Neo this weekend.
  17. horst

    A brand new day

    😄 If I could, I would turn it off for ever, but haven`t found a way. So I use a very low gliw and 80% is white light. I found this in a local media store for under 50% of the regular price, maybe between 5 - 7 years ago.
  18. @AndZyk Your Mac desktop and your real desktop are very clean 🥇 Re. the view, it's just a park at the back of the home office. Not quite the countryside, but nice to have some greenery.
  19. Thank you. Its my office office. Would like to have a view with nature like you, but it is in city centre. At least I have a quiet workplace. My home office has a better view on nature. 😊
  20. Nice. Home office or office office ?
  21. All looking well used. I've been tempted to try the Razer stuff. It looks very nice, but my Razer machine, which I use for gaming, already has enough glowing lights.
  22. My workplace at the moment 😊
  23. The old forum format has long since outlived its usefulness, as generations have changed and a new format is needed, even one different from Reddit. Therefore, to maintain engagement, we need to come up with new ways to keep our audience on the page. By the way, the archive contains mockups of the future service from March 2026. Vox-FB.zip
  24. horst

    A brand new day

    Since back in 1996 I'm a big fan and user of the smallest Cherry Keyboards, with and without NumPads. But mainly the types without NumPads, CHERRY G84-4100: But on my primary Desktop working place I use a Razer Huntsman Elite RZ03-0187 :
  25. Thanks for this module. I am using it on my own site but have some issues with date fields. When I add the dateFormat option, I can only successfully display columns such as modified or created. All other date fields, such as published, still show only the timestamp. My due field type is datetime, and the date/time output is set to none. Did I miss something or why is this happening? Many thanks! $panels->add([ 'panel' => 'collection', 'size' => 'full', 'title' => 'Items', 'data' => [ 'collection' => 'template=repeater_document_items_repeater, due>=today, due<="+30 days", limit=4', 'sortable' => true, "dateFormat" => "d.m.Y", 'columns' => [ 'title' => 'Test', 'modified' => 'Modified', // This is the only one that is formated as 12.06.2026 'published' => 'Published at', // Displayed as timestamp 'due' => 'Due date', // Displayed as timestamp ], ], ]); Using latest v 1.6.0 on PW 3.0.257
  26. "Claude please convert for me the processwire.com/talk IP.Board into a native ProcessWire CMS/CMF application. Make no mistakes." 😊
  27. There's only 29.2k Total Topics 247.1k Total Posts 9,598 Total Members Who wants to volunteer their AI tokens? 🙂
  28. @maximus I was just thinking this week that ProcessWire forums should be built in ProcessWire. Both as a showcase of how flexible PW is and to demonstrate its ability as more than a regular CMS. Amazing stuff.
  1. Load more activity
×
×
  • Create New...