<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: EmmaDSCodes</title>
    <description>The latest articles on DEV Community by EmmaDSCodes (@emmadscodes).</description>
    <link>https://dev.to/emmadscodes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F851714%2F54b23aee-cff4-4679-96d7-0dfcab491ecf.jpeg</url>
      <title>DEV Community: EmmaDSCodes</title>
      <link>https://dev.to/emmadscodes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emmadscodes"/>
    <language>en</language>
    <item>
      <title>Building Abridged Shelf - Free shorter classic stories</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Sun, 26 Jul 2026 20:24:55 +0000</pubDate>
      <link>https://dev.to/emmadscodes/building-abridged-shelf-free-shorter-classic-stories-35hb</link>
      <guid>https://dev.to/emmadscodes/building-abridged-shelf-free-shorter-classic-stories-35hb</guid>
      <description>&lt;h2&gt;
  
  
  Making classics more accessible
&lt;/h2&gt;

&lt;p&gt;I have a soft spot for mythology and classic stories. I have read most of the books on &lt;a href="https://abridgedshelf.com/?ref=devto" rel="noopener noreferrer"&gt;Abridged Shelf&lt;/a&gt; at least once, several of them more than that. But a lot of them are &lt;em&gt;long&lt;/em&gt;. Epic poetry is not something you casually get through on a Tuesday evening, and the older translations can be genuinely hard going. The language demands focus, and focus is a resource I do not always have.&lt;/p&gt;

&lt;p&gt;So I made shorter versions.&lt;/p&gt;

&lt;p&gt;Abridged Shelf is a free library of public domain classics that I have abridged and modernized. Abridged, not summarized. The distinction matters a lot to me. I am not writing study notes or plot recaps. I take the actual text and condense it: the B-plots that do not carry the story, the scenes that spend forty lines describing a shield, those get compressed down into the beats that matter. What is left is still the story, told in its own voice, just tighter.&lt;/p&gt;

&lt;p&gt;The other half is the language. A lot of these translations are over a century old, and the English shows it. So I modernize spelling and phrasing into contemporary English. Again, not simplified. This is not a children's edition and I am not dumbing anything down. It is the same book, in language that does not fight you.&lt;/p&gt;

&lt;p&gt;I also made some editorial calls. For the Greek epics I use the Greek names rather than the Roman ones that a lot of older translations default to, because if we are reading Homer then it should be Athena and not Minerva. Small thing. Matters to me.&lt;/p&gt;

&lt;p&gt;And as a nod to a certain static site generator I maintain, the first book I abridged was the original &lt;em&gt;Strange Case of Dr Jekyll and Mr Hyde&lt;/em&gt;. It is already short. Now it is very short. I did a few more by Stevenson after that, mostly because they were quick and I needed to get the workflow right before pointing it at an epic poem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The abridgment process
&lt;/h2&gt;

&lt;p&gt;I knew from the start that I needed to use AI for this. I also do not entirely trust AI, which is a useful combination of beliefs to hold at the same time. It means you build guardrails.&lt;/p&gt;

&lt;p&gt;Without giving away every single secret, the process looks roughly like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find a translation that is actually good (and complete!) and actually public domain.&lt;/li&gt;
&lt;li&gt;Split it into chapters, which often needs to be done differently for each book.&lt;/li&gt;
&lt;li&gt;Abridge one chapter at a time against a very strictly defined spec.&lt;/li&gt;
&lt;li&gt;Run automated QA before I ever read it.&lt;/li&gt;
&lt;li&gt;Read it myself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The per-chapter thing is the important part. Keeping the original chapter structure keeps the work scoped and stops the model from drifting, wandering off, or quietly rewriting the shape of the book. Small window, tight spec, one chapter.&lt;/p&gt;

&lt;p&gt;Then comes QA. Before I look at anything, it goes through automated checks run by two different models, deliberately from different families so they do not share the same blind spots. The checks are looking for three failure modes: did we lose something important, did we invent something that was never there, and did the model pull in details it knows about the book from training rather than from the source text in front of it. That last one is the sneaky one. A model that has read the &lt;a href="https://abridgedshelf.com/books/the-iliad?ref=devto" rel="noopener noreferrer"&gt;&lt;em&gt;Iliad&lt;/em&gt;&lt;/a&gt; a thousand times will happily supply a detail that is famous but is not actually present in the original texts.&lt;/p&gt;

&lt;p&gt;After the machines are done, I read it. Every chapter. This is why I get a little defensive when people hear "AI" and think slop. I am extremely involved in this process. I built several custom pipelines specifically so I could stay involved without it taking the rest of my life. I may absolutely still miss things though, please let me know if you find a problem. There is a feedback link in the footer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The audiobooks
&lt;/h2&gt;

&lt;p&gt;It matters to me that the reading side of this is always free. These books are free. My versions should be free too. And they will be. Unlimited. Forever. Free. You don't even need to sign in or sell your soul to ad trackers.&lt;/p&gt;

&lt;p&gt;But the process above costs real money to run, and so does the audio. So there is a &lt;a href="https://abridgedshelf.com/patronage?ref=devto" rel="noopener noreferrer"&gt;patron option&lt;/a&gt;: pay whatever you think it has been worth, (minimum three dollars to cover transaction fees), and you get the audiobooks. Everyone gets the same perks regardless of amount. You can pay multiple times if you want, but you get nothing extra for it except my sincere gratitude. That is the whole model.&lt;/p&gt;

&lt;p&gt;Also! If you're early, you get in for free. The first 25 people to make an account get the Early Adopter tier: same perks as Patrons, forever, no payment required. Free audiobooks for life, just for showing up early. After that it goes back to the patron model above. Sign up at &lt;a href="https://abridgedshelf.com/register?ref=devto" rel="noopener noreferrer"&gt;abridgedshelf.com/register&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The audiobooks are the part I am most quietly proud of. I am running a very good open source TTS model locally, and the quality is the only thing I have heard that comes close to ElevenLabs, which is fantastic and would also be financially ruinous at this volume. So instead I have three computers in my apartment generating audio. The &lt;em&gt;Odyssey&lt;/em&gt; took roughly 25 hours of inference on a beefy workstation. That is why the audiobooks lag behind the text. But the goal is that every book will have an audio version.&lt;/p&gt;

&lt;p&gt;As with any project, you learn things. Some of those lessons are unexpectidly disturbing. Apparently this model panics if you give it too much input at once, and before I figured that out, I generated the most cursed audio I have ever heard in my entire life. So I wrote a quick algorithm to split the text down. Simplified: every sentence gets its own WAV file (but I do some smartish stuff for long sentences). For each one I keep the input text, the audio, and a JSON manifest with durations and offsets.&lt;/p&gt;

&lt;p&gt;That manifest turned out to be the best accidental decision in the project, because it means I know exactly which sentence is being spoken at any moment. So the site highlights the sentence on the reader view as you listen. So, you can read and listen at the same time, which I love, because sometimes there is a noise in the room or I get distracted and I miss a line and now I don't have to scrub backwards to find it. I just glance at the screen.&lt;/p&gt;

&lt;p&gt;It also means verification is possible. Since I know what every WAV file is supposed to say, I can check whether it says it. So there is a verification pass where I transcribe every single generated clip back to text with speech-to-text and compare it against the input. The comparison is deliberately lossy, because you do not want to fail a line over punctuation. For genuine edge cases, mostly homophones where static analysis cannot decide, I hand it to a local text model and ask whether these two things mean the same thing. That was much nicer than maintaining a giant homophone mapping table.&lt;/p&gt;

&lt;p&gt;On top of that there is a smoke test during generation that looks at the waveform itself. Is this plausibly speech, or is it noise, or is it just silence? If it fails a few times in a row the job cancels itself, because that usually means something dumb has happened, like running out of disk space. Local AI takes a LOT of disk space. So do WAV files...&lt;/p&gt;

&lt;p&gt;I do a lot of spot checks by ear too. And now that the chunking is better, I am going to regenerate some of the earlier books which have artifacts where the sentence splitting wasn't as smart. But again, priorities. I'm using prosumer hardware, not H100s.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the site is actually built
&lt;/h2&gt;

&lt;p&gt;This is the part I find most fun to talk about.&lt;/p&gt;

&lt;p&gt;It started as a plain &lt;a href="https://hydephp.com/?ref=emma.desilva.se" rel="noopener noreferrer"&gt;HydePHP&lt;/a&gt; site. Markdown files in, static site out, done. Then I started wanting things: a reading list, remembering where you left off, and eventually audiobooks behind a payment wall. All of which need a backend.&lt;/p&gt;

&lt;p&gt;So I wanted Laravel. But I also still wanted Hyde, because Hyde gives me things I did not want to give up. No data models for content. No database for content. Everything in version control. I can build locally and push without touching a remote database. RSS feeds and sitemaps generated for free. Content on disk is just nice to work with.&lt;/p&gt;

&lt;p&gt;My first instinct was what I have done before, which is pull the Hyde framework into the Laravel app. But the current stable Hyde is a few versions behind the latest Laravel (v3 is on the way though!), and I wanted the latest Laravel. So I went with option two, which honestly turned out better anyway: inside the Laravel project there is a &lt;code&gt;hyde/&lt;/code&gt; subfolder containing an entire HydePHP project, and that is where all the static content lives.&lt;/p&gt;

&lt;p&gt;The site runs on Laravel Cloud, and the Hyde build runs as part of deployment. Laravel then serves the resulting static files, essentially acting as a very small web server written in Laravel, with some wrapper objects around it. Hit the front page and it resolves the right file and returns its contents. There is a tiny bit of overhead in finding the file and booting the framework, but Laravel boots fast, Laravel Cloud is obsessively tuned, and static pages get cached on the edge anyway. It feels indistinguishable from GitHub Pages to me.&lt;/p&gt;

&lt;p&gt;Then the obvious problem: I went to all this trouble for dynamic content, and now my pages are static files.&lt;/p&gt;

&lt;p&gt;The solution is a token system. Hyde does not know anything about the dynamic parts. It just emits placeholder tokens, and the Laravel controller string replaces them on the way out. So the navbar changes if you are logged in, and the patron link disappears if you already are one, without any Blade recompilation and without any views living on the Laravel side.&lt;/p&gt;

&lt;p&gt;That last bit was a deliberate boundary. I did not want views in two places, partly for my own sanity and partly because AI agents kept getting confused about which layer owned what. Making the rule absolute, no views in Laravel, dynamic content only through replacement tokens, fixed it completely.&lt;/p&gt;

&lt;p&gt;Caching works nicely with this. Anonymous responses go out with cache headers, so most requests never reach the origin at all. Logged in users skip that header and get a narrower cache that still serves the correct dynamic bits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with agents
&lt;/h2&gt;

&lt;p&gt;On agents: as the great Aaron Francis said at &lt;a href="https://emma.desilva.se/posts/speaking-at-laravel-live-uk-2026" rel="noopener noreferrer"&gt;Laravel Live UK&lt;/a&gt;, you have to contain them. Give them a frame to work inside.&lt;/p&gt;

&lt;p&gt;So I built the frame by hand. The Hyde and Laravel integration, the gateway, the structural rules, all of that I designed and largely wrote myself. Some parts I wrote as pseudocode and handed over for implementation, but the shape was mine.&lt;/p&gt;

&lt;p&gt;After that, I mostly stopped reading the generated code. It goes through a review agent running a different model, I glance at whether the right files were touched, and then I validate the actual feature by using it. Anything security related I still read properly, every time. And I do all the QA myself.&lt;/p&gt;

&lt;p&gt;The design came later. My original layouts were stock HydePHP, which gives me all the UI elements I need, but it of course does not look very unique. So I did a few design passes with Claude Fable once the structure was solid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Laravel Cloud
&lt;/h2&gt;

&lt;p&gt;First time using it, no affiliation, and I have to give them a shout out. Laravel is magic for PHP, Laravel Cloud is that same magic applied to hosting. It truly is the Laravel of hosting providers.&lt;/p&gt;

&lt;p&gt;Concrete example. My repo was ballooning with WAV files and deploys were crawling, so I compressed everything to MP3 and purged the masters from git. But I still wanted the masters stored somewhere. One button, S3 compatible bucket, done. I could have thrown them on Google Drive, but wanted to be able to send the files through code given I'm running generations on different computers and bringing in a Drive API integration brings a rewally different stack. So wanted Laravel to easily push the masters, semi automatically now and fully automatically later.&lt;/p&gt;

&lt;p&gt;That is a pattern I believe in generally: manual first, then semi automatic, then automatic. Each round teaches you which parts are actually annoying and what the next iteration needs. You cannot design that from the armchair.&lt;/p&gt;

&lt;p&gt;Stripe setup was also painless, which is not a sentence I expected to write about anything related to payments. But they have really thought through DX.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I have a long list of books I am excited to add.&lt;/p&gt;

&lt;p&gt;The site is free to read and will always be free to read. If you want the audiobooks, three dollars minimum, pay what you think it is worth, and you get access to what will eventually be tens of hours of audio that is genuinely pleasant to listen to and syncs to the text as it plays. I think that is a good deal, but I am biased.&lt;/p&gt;

&lt;p&gt;Further out, I would love to build a NativePHP mobile app with offline reading and listening. That sounds like a lot of fun.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://abridgedshelf.com/?ref=devto" rel="noopener noreferrer"&gt;Go read something.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>hydephp</category>
      <category>books</category>
      <category>ai</category>
    </item>
    <item>
      <title>My favourite zsh/bash shortcuts (functions and aliases)</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Wed, 08 Jul 2026 21:43:31 +0000</pubDate>
      <link>https://dev.to/emmadscodes/my-favourite-zshbash-shortcuts-functions-and-aliases-35n8</link>
      <guid>https://dev.to/emmadscodes/my-favourite-zshbash-shortcuts-functions-and-aliases-35n8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;My zsh profile is over 1000 lines at this point. A lot of that is functions I asked AI to generate for me, since it's fast, portable, and saves me a ton of typing.&lt;/p&gt;

&lt;p&gt;Here's the thing though: the shortcuts that save me the most time aren't the clever ones. They're the dumb ones. Things like &lt;code&gt;clone&lt;/code&gt; instead of &lt;code&gt;git clone &amp;amp;&amp;amp; cd&lt;/code&gt;, or &lt;code&gt;dir&lt;/code&gt; instead of &lt;code&gt;mkdir -p &amp;amp;&amp;amp; cd&lt;/code&gt;. Each one only saves a second or two, but I run them so often that it adds up fast.&lt;/p&gt;

&lt;p&gt;These are in no particular order, just the ones I reach for constantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git aliases for common commands
&lt;/h2&gt;

&lt;p&gt;A few one-liners I have set up as plain aliases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;gcp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git cherry-pick"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;git-append&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git commit --amend --no-edit -a"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;gcp&lt;/code&gt; is self-explanatory. &lt;code&gt;git-append&lt;/code&gt; amends the last commit with your currently staged (and unstaged, thanks to &lt;code&gt;-a&lt;/code&gt;) changes without touching the commit message. Great for fixing up a commit you just made before you push.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a branch or switch to it if it already exists
&lt;/h2&gt;

&lt;p&gt;One of my most-used functions. Normally you have to remember whether a branch exists before deciding between &lt;code&gt;git checkout &amp;lt;branch&amp;gt;&lt;/code&gt; and &lt;code&gt;git checkout -b &amp;lt;branch&amp;gt;&lt;/code&gt;. This just does the right thing either way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gb&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--verify&lt;/span&gt; &lt;span class="nt"&gt;--quiet&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;git checkout &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;else
    &lt;/span&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Nuke all local changes to reset the working tree
&lt;/h2&gt;

&lt;p&gt;When an experiment goes sideways or I just want to throw everything away and start clean, I run &lt;code&gt;nah&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nah&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  git reset &lt;span class="nt"&gt;--hard&lt;/span&gt;
  git clean &lt;span class="nt"&gt;-df&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;".git/rebase-apply"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;".git/rebase-merge"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;git rebase &lt;span class="nt"&gt;--abort&lt;/span&gt;
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This resets tracked changes, removes untracked files and directories. No confirmation prompt, so use it carefully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Print recent commits as ready-to-paste cherry-pick commands
&lt;/h2&gt;

&lt;p&gt;Useful when you need to cherry-pick a batch of commits from one branch onto another in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;logs&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ &lt;span class="o"&gt;[&lt;/span&gt;^0-9] &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: logs &amp;lt;number_of_commits&amp;gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi
  &lt;/span&gt;git log &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--reverse&lt;/span&gt; &lt;span class="nt"&gt;--pretty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;format:&lt;span class="s2"&gt;"gcp %h"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;logs 5&lt;/code&gt; and you get the last 5 commits printed oldest to newest, each one already formatted as &lt;code&gt;gcp &amp;lt;hash&amp;gt;&lt;/code&gt; (using the alias from above). Copy, paste, done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a directory and cd into it in one step
&lt;/h2&gt;

&lt;p&gt;This is the one I mentioned that barely saves any time per use, but I run it constantlyn and the time save compounds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Make mkdir always create parent directories
&lt;/h2&gt;

&lt;p&gt;I got tired of hitting "No such file or directory" errors from &lt;code&gt;mkdir&lt;/code&gt; when the parent folder didn't exist yet, so I just overrode the default behavior globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;command mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;mkdir&lt;/code&gt; always behaves like &lt;code&gt;mkdir -p&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open nano and auto-create missing parent directories
&lt;/h2&gt;

&lt;p&gt;Same idea as the &lt;code&gt;mkdir&lt;/code&gt; override, but for opening a file in &lt;code&gt;nano&lt;/code&gt; when the folder it lives in doesn't exist yet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;command &lt;/span&gt;nano
  &lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi
    &lt;/span&gt;&lt;span class="nb"&gt;command &lt;/span&gt;nano &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Safely replace a file's contents by moving the original to trash first
&lt;/h2&gt;

&lt;p&gt;Instead of overwriting a file and losing the original, &lt;code&gt;replace&lt;/code&gt; moves it to &lt;code&gt;~/.Trash&lt;/code&gt; first and then opens a fresh file with the same name in &lt;code&gt;nano&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;replace&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-ne&lt;/span&gt; 1 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: replace &amp;lt;file&amp;gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
    &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Error: '&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;' not found or not a file"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
    &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi
  &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.Trash
  &lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; ~/.Trash/
  nano &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But mainly this saves me from runing "rm  &amp;amp;&amp;amp; nano " which I often do when replacing a file from an AI chat or similar. If you need the original back, it's sitting in &lt;code&gt;~/.Trash&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convert HEIC images to JPG or PNG
&lt;/h2&gt;

&lt;p&gt;iPhone photos default to HEIC, which isn't great for sharing or uploading. These two functions batch-convert them using ImageMagick:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;heic2jpg&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: heic2jpg file1.heic [file2.heic ...]"&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi
  for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Not found: &lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi
    &lt;/span&gt;magick &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.jpg"&lt;/span&gt;
  &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

heic2png&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: heic2png file1.heic [file2.heic ...]"&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi
  for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Not found: &lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi
    &lt;/span&gt;magick &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;f&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.png"&lt;/span&gt;
  &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both take any number of files, so &lt;code&gt;heic2jpg *.heic&lt;/code&gt; works fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch convert images to WebP
&lt;/h2&gt;

&lt;p&gt;For getting images web-ready, this wraps &lt;code&gt;img2webp&lt;/code&gt; with sensible defaults and skips anything that isn't actually a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;img2webp&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$# &lt;/span&gt;&lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: img2webp &amp;lt;file.png&amp;gt; [file2.png ...] or img2webp *.png"&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;1
  &lt;span class="k"&gt;fi

  for &lt;/span&gt;input &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
      &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Skipping: '&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;' is not a file"&lt;/span&gt;
      &lt;span class="k"&gt;continue
    fi
    &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.webp"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Converting: &lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt; → &lt;/span&gt;&lt;span class="nv"&gt;$output&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;command &lt;/span&gt;img2webp &lt;span class="nt"&gt;-lossy&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; 80 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$output&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runs at quality 80, lossy, which is a good default for most web use cases. Saves a TON of storage space and bandwidth&lt;/p&gt;

&lt;h2&gt;
  
  
  A few misc aliases
&lt;/h2&gt;

&lt;p&gt;Small ones I use daily without thinking about them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;pest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"./vendor/bin/pest"&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"python3"&lt;/span&gt; &lt;span class="c"&gt;# For AI commands expecting it&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;py&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"python3"&lt;/span&gt; &lt;span class="c"&gt;# For me when I'm lazy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;pest&lt;/code&gt; alias saves typing out the full vendor binary path every time I want to run tests. The &lt;code&gt;python&lt;/code&gt;/&lt;code&gt;py&lt;/code&gt; aliases exist because plenty of AI-generated commands assume &lt;code&gt;python&lt;/code&gt; points to Python 3, and half the time I'm too lazy to type the &lt;code&gt;3&lt;/code&gt; myself anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;None of these are groundbreaking on their own. But that's kind of the point: the small, boring shortcuts you run 50 times a day save you more time overall than the clever ones you run once a week. If you're not already keeping a running file of these for yourself, start one. Every time you catch yourself typing the same thing twice, that's a candidate.&lt;/p&gt;

</description>
      <category>zsh</category>
      <category>bash</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I asked Claude Fable 5 to build a HydePHP site. It invented an airline.</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Sun, 05 Jul 2026 18:24:23 +0000</pubDate>
      <link>https://dev.to/emmadscodes/i-asked-claude-fable-5-to-build-a-hydephp-site-it-invented-an-airline-43ne</link>
      <guid>https://dev.to/emmadscodes/i-asked-claude-fable-5-to-build-a-hydephp-site-it-invented-an-airline-43ne</guid>
      <description>&lt;h2&gt;
  
  
  Editor's note
&lt;/h2&gt;

&lt;p&gt;Everything after this section was written by an AI. Don't stop reading. I know most of us are bored of AI written content, but I assure you, this one is different. I want you to give it a chance. And I'm about to tell you why.&lt;/p&gt;

&lt;p&gt;If you have any interest in AI, you've heard about Claude Fable, a safer version of the Mythos model, which is genuenly blowing users across domains away. I wanted to try Fable out to create a new HydePHP demo website to show off some more advanced features.&lt;/p&gt;

&lt;p&gt;It delivered. Not only did it create a stunning website with a unique design that does not have the classic AI generated website feel, but it also created the following blog post, and a high quality promo video uploaded on &lt;a href="https://www.youtube.com/watch?v=ij-r085aEU8" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; you can even hear sound effects that Fable synthesised.&lt;/p&gt;

&lt;p&gt;Try out the demo site at &lt;a href="https://nordlys.hydephp.site/?ref=blog" rel="noopener noreferrer"&gt;nordlys.hydephp.site&lt;/a&gt; and let us know your thoughts on &lt;a href="https://twitter.com/intent/tweet?text=%40HydeFramework%20https%3A%2F%2Fhydephp.com%2Fposts%2Fusing-claude-fable-with-hydephp" rel="noopener noreferrer"&gt;Twitter/X&lt;/a&gt;. With that said, everything below this text is straight from Fable. Please enjoy!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emma De Silva, Creator of HydePHP&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Letting Claude Drive
&lt;/h2&gt;

&lt;p&gt;HydePHP has had a few demo sites over the years&lt;sup id="fnref1"&gt;1&lt;/sup&gt; — a recipe blog, a photography&lt;br&gt;
portfolio, a scout troop site. They're fine.&lt;sup id="fnref2"&gt;2&lt;/sup&gt; They show the basics. But none of them&lt;br&gt;
really flexes the parts of Hyde we're proudest of: DataCollections feeding Blade&lt;br&gt;
pages, custom components, the docs module living side by side with a blog, all of it&lt;br&gt;
compiling down to plain static HTML.&lt;/p&gt;

&lt;p&gt;So we ran an experiment: give Claude Fable 5 the brief and see what comes back. The&lt;br&gt;
brief was short — &lt;em&gt;build a demo that shows off Hyde's advanced features, and don't&lt;br&gt;
give it that generic AI-generated look.&lt;/em&gt; What came back is &lt;a href="https://nordlys.hydephp.site/?ref=blog" rel="noopener noreferrer"&gt;Nordlys Air&lt;/a&gt;,&lt;br&gt;
a fictional bush airline flying six routes above the Arctic Circle, complete with a&lt;br&gt;
live split-flap departures board, engineering-drawing aircraft profiles, and a crew&lt;br&gt;
operations manual.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why a fictional airline?
&lt;/h2&gt;

&lt;p&gt;The clever part of the concept isn't the theme — it's how neatly the theme maps onto&lt;br&gt;
Hyde's page types. An airline has &lt;em&gt;data&lt;/em&gt; (routes, aircraft), &lt;em&gt;stories&lt;/em&gt; (a flight&lt;br&gt;
journal), and &lt;em&gt;procedures&lt;/em&gt; (an operations manual). That's DataCollections, the posts&lt;br&gt;
module, and the documentation module, each doing the job it was designed for instead&lt;br&gt;
of being demoed in isolation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every row on the departures board is a YAML file in &lt;code&gt;resources/collections/routes/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Every fleet spec sheet is a YAML file in &lt;code&gt;resources/collections/fleet/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The Flight Journal is three Markdown posts with authors, categories, and RSS.&lt;/li&gt;
&lt;li&gt;The Operations Manual is the docs module with its automatic sidebar and search —
written in-character, down to the Ny-Ålesund radio silence procedures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add a fourth aircraft by adding a fourth YAML file. The register page, the homepage&lt;br&gt;
cards, and the navigation update themselves on the next build. That's the pitch for&lt;br&gt;
static site generators in one sentence, and now it's the pitch for the demo too.&lt;/p&gt;
&lt;h2&gt;
  
  
  The detail we didn't expect: a build-time split-flap board
&lt;/h2&gt;

&lt;p&gt;The centrepiece of the homepage is an animated split-flap departures board, and the&lt;br&gt;
implementation is the most Hyde-flavoured thing on the site. Claude didn't render&lt;br&gt;
the board with JavaScript. It wrote a Blade component, &lt;code&gt;x-flap-text&lt;/code&gt;, that splits&lt;br&gt;
each cell's text into character &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;s &lt;strong&gt;at build time&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@foreach(DataCollection::yaml('routes')
    -&amp;gt;sortBy(fn ($route) =&amp;gt; $route-&amp;gt;get('departs')) as $route)
  &amp;lt;x-flap-row :route="$route" /&amp;gt;
@endforeach
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full timetable ships in the static HTML — readable with JavaScript disabled,&lt;br&gt;
crawlable, accessible. The site's &lt;em&gt;only&lt;/em&gt; script is a two-kilobyte vanilla file that&lt;br&gt;
animates the spans already on the page and runs the hub clock, with&lt;br&gt;
&lt;code&gt;prefers-reduced-motion&lt;/code&gt; respected. No framework, no hydration, no build pipeline&lt;br&gt;
beyond &lt;code&gt;php hyde build&lt;/code&gt;. It's the static-first philosophy applied to a component&lt;br&gt;
that usually gets thrown at a JavaScript library by reflex.&lt;/p&gt;

&lt;h2&gt;
  
  
  On not looking AI-generated
&lt;/h2&gt;

&lt;p&gt;We were explicit that the design shouldn't have the interchangeable AI-website look —&lt;br&gt;
the purple gradients, the glassmorphism cards, the Inter-font-and-emoji sameness.&lt;br&gt;
Claude's answer was to pick a specific, researchable design tradition and commit to&lt;br&gt;
it: mid-century printed airline timetables. Cool ice-paper background, petrol ink,&lt;br&gt;
one international-orange accent, ruled lines like a printed schedule, boarding-pass&lt;br&gt;
cards with perforated stubs, and type set in Bricolage Grotesque and IBM Plex Mono.&lt;/p&gt;

&lt;p&gt;The aircraft on the site aren't stock photos or generated images — they're original&lt;br&gt;
schematic SVG line drawings, Twin Otter and Dash 8 side profiles with orange&lt;br&gt;
dimension lines, drawn path by path. The route network is a hand-projected polar&lt;br&gt;
azimuthal chart. Both live as reusable Blade components, so the fleet YAML just&lt;br&gt;
says &lt;code&gt;drawing: twin-otter&lt;/code&gt; and the page pulls in the right SVG with&lt;br&gt;
&lt;code&gt;&amp;lt;x-dynamic-component&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What working with Fable 5 was actually like
&lt;/h2&gt;

&lt;p&gt;A few observations from the process, for anyone curious about the workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It verified the framework against the source.&lt;/strong&gt; Before writing a line of Blade,&lt;br&gt;
it cloned the &lt;code&gt;hyde/hyde&lt;/code&gt; skeleton and the documentation repo and checked the real&lt;br&gt;
v2 APIs — &lt;code&gt;DataCollection::yaml()&lt;/code&gt;, the navigation menu via &lt;code&gt;app('navigation.main')&lt;/code&gt;,&lt;br&gt;
the &lt;code&gt;Author::create()&lt;/code&gt; config syntax. The demo isn't written from a fuzzy memory of&lt;br&gt;
Hyde; it's written against Hyde as it ships today. (It also caught that &lt;code&gt;mb_str_pad&lt;/code&gt;&lt;br&gt;
is PHP 8.3+ while our &lt;code&gt;composer.json&lt;/code&gt; allows 8.2, and wrote the multibyte padding&lt;br&gt;
by hand instead. We noticed.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It wrote the content, not just the code.&lt;/strong&gt; The journal posts are actual essays —&lt;br&gt;
a captain's field notes from the midnight sun run to Ny-Ålesund, a love letter to&lt;br&gt;
the 04:10 de-icing crew. The operations manual reads like an operations manual. A&lt;br&gt;
demo site lives or dies on whether the content feels real, and lorem ipsum was never&lt;br&gt;
on the table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It kept the site honest.&lt;/strong&gt; The footer of every page says it: &lt;em&gt;Nordlys Air is&lt;br&gt;
fictional. The northern lights are real.&lt;/em&gt; And the homepage ends with an "under the&lt;br&gt;
floorboards" section that shows the project's file tree and the actual Blade loop&lt;br&gt;
powering the board — because a demo site's real job is to make you think "oh, I&lt;br&gt;
could build that."&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The full project is available as a standard Hyde &lt;a href="https://github.com/hydephp/nordlys-demo?ref=blog" rel="noopener noreferrer"&gt;repository&lt;/a&gt; — clone it, run&lt;br&gt;
&lt;code&gt;composer install &amp;amp;&amp;amp; php hyde build&lt;/code&gt;, and poke around. Change a route's status in&lt;br&gt;
its YAML file and rebuild to watch the board update. Add an aircraft. Break the&lt;br&gt;
timetable. That's what it's for.&lt;/p&gt;

&lt;p&gt;And if you build something with Hyde — with or without an AI copilot — we'd love&lt;br&gt;
to see it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Footnotes
&lt;/h2&gt;

&lt;p&gt;These are the footnotes added by the human editor to point out issues in the AI text.&lt;/p&gt;

&lt;p&gt;Also, the source code is at &lt;a href="https://github.com/hydephp/nordlys-demo?ref=blog" rel="noopener noreferrer"&gt;github.com/hydephp/nordlys-demo&lt;/a&gt; and the live preview is at &lt;a href="https://nordlys.hydephp.site/?ref=blog" rel="noopener noreferrer"&gt;nordlys.hydephp.site&lt;/a&gt;.&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Technically we just launched the recipe and scout sites a few days before.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;Hey! I kinda like them. I mean check out &lt;a href="https://lemonade-days.hydephp.site/?ref=nordlys" rel="noopener noreferrer"&gt;Lemonade Days&lt;/a&gt; - it's so summery!&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>hydephp</category>
      <category>webdev</category>
    </item>
    <item>
      <title>HydePHP Version v2.0 Released</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Mon, 06 Oct 2025 15:30:56 +0000</pubDate>
      <link>https://dev.to/emmadscodes/hydephp-version-v20-released-426b</link>
      <guid>https://dev.to/emmadscodes/hydephp-version-v20-released-426b</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HydePHP v2.0 is now available for download!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After two years of development and refinement, the HydePHP team is thrilled to announce the release of version 2.0. This is our most significant update yet, representing a major evolution of the framework with modernized frontend tooling, a completely redesigned navigation system, and countless improvements to the developer experience.&lt;/p&gt;

&lt;p&gt;The new version was unveiled and released live on stage by HydePHP creator Emma De Silva at the Laravel Meetup Stockholm, on October 1st 2025.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's New in v2.0
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Modern Frontend Tooling with Vite
&lt;/h3&gt;

&lt;p&gt;We've replaced Laravel Mix with Vite, bringing you a faster and more modern development experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instant Hot Module Replacement for real-time updates during development&lt;/li&gt;
&lt;li&gt;Seamless Blade template integration with the new Vite facade&lt;/li&gt;
&lt;li&gt;Tailwind V4 support with easy upgrade tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simply run &lt;code&gt;npm run build&lt;/code&gt; (replacing the old &lt;code&gt;npm run prod&lt;/code&gt; command) to compile your assets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redesigned Navigation API
&lt;/h3&gt;

&lt;p&gt;The navigation system has been completely rewritten from the ground up for maximum flexibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;YAML configuration support for defining navigation items&lt;/li&gt;
&lt;li&gt;Extra attributes for custom styling and behavior&lt;/li&gt;
&lt;li&gt;Improved Routes facade with Laravel-consistent naming conventions&lt;/li&gt;
&lt;li&gt;Natural priority ordering using numeric prefixes in filenames&lt;/li&gt;
&lt;li&gt;Enhanced sidebar management with better organization options&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Enhanced Asset Management
&lt;/h3&gt;

&lt;p&gt;The new consolidated Asset API provides a more intuitive interface for handling media files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MediaFile instances with fluent methods like &lt;code&gt;getLink()&lt;/code&gt;, &lt;code&gt;getLength()&lt;/code&gt;, and &lt;code&gt;getMimeType()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Intelligent caching with CRC32 hashing for improved performance&lt;/li&gt;
&lt;li&gt;Automatic validation to prevent missing assets from going unnoticed&lt;/li&gt;
&lt;li&gt;Lazy-loaded metadata for optimal resource usage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Better Documentation Features
&lt;/h3&gt;

&lt;p&gt;Documentation pages now benefit from several powerful enhancements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alpine.js-powered search with customizable implementation&lt;/li&gt;
&lt;li&gt;Blade-based table of contents that's 40x faster than before&lt;/li&gt;
&lt;li&gt;Custom heading renderer with improved permalink handling&lt;/li&gt;
&lt;li&gt;Colored blockquotes now using Tailwind CSS classes&lt;/li&gt;
&lt;li&gt;Dynamic source file links in Markdown documents&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Improved Blog Posts
&lt;/h3&gt;

&lt;p&gt;The blog system receives significant upgrades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplified image front matter with new "caption" field&lt;/li&gt;
&lt;li&gt;Date prefixes in filenames for automatic publishing dates&lt;/li&gt;
&lt;li&gt;Enhanced author system with biographies, avatars, and social media links&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Improvements
&lt;/h2&gt;

&lt;p&gt;HydePHP v2.0 brings several important technical upgrades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PHP 8.4 support&lt;/strong&gt; and Laravel 11 compatibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite integration&lt;/strong&gt; with HMR support in realtime compiler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS v4&lt;/strong&gt; with automated upgrade tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ESM module support&lt;/strong&gt; for modern JavaScript development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;40x faster table of contents generation&lt;/strong&gt; using Blade components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy-loaded media metadata&lt;/strong&gt; with in-memory caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced data collections&lt;/strong&gt; with syntax validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Upgrading to v2.0
&lt;/h2&gt;

&lt;p&gt;We recommend that all users upgrade to take advantage of these improvements. Before upgrading, ensure your application is running HydePHP v1.6 or later (ideally v1.8) to ease the migration process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Migration Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade Tailwind CSS&lt;/strong&gt;: Run &lt;code&gt;npx @tailwindcss/upgrade&lt;/code&gt; to migrate to v4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update JavaScript&lt;/strong&gt;: Migrate custom JavaScript to ESM modules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update Configuration&lt;/strong&gt;: Update features to use enum values and navigation to array format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update Build Command&lt;/strong&gt;: Replace &lt;code&gt;npm run prod&lt;/code&gt; with &lt;code&gt;npm run build&lt;/code&gt; in your workflow&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The upgrade process involves some breaking changes, particularly around the asset system, navigation configuration, and frontend tooling. We've prepared comprehensive documentation to guide you through each step.&lt;/p&gt;

&lt;p&gt;For detailed upgrade instructions and a complete migration checklist, please refer to the &lt;a href="https://hydephp.com/docs/2.x/upgrade-guide" rel="noopener noreferrer"&gt;upgrade guide&lt;/a&gt; in our documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking Changes
&lt;/h2&gt;

&lt;p&gt;As a major version release, v2.0 includes several breaking changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tailwind CSS upgraded from v3 to v4&lt;/li&gt;
&lt;li&gt;Frontend tooling migrated to ESM modules&lt;/li&gt;
&lt;li&gt;Navigation configuration format updated to array-based structure&lt;/li&gt;
&lt;li&gt;Asset API methods now return MediaFile instances&lt;/li&gt;
&lt;li&gt;Routes facade methods renamed to follow Laravel conventions&lt;/li&gt;
&lt;li&gt;Blog author system significantly improved with new configuration format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While these changes require some migration work, they set a solid foundation for future development and provide a much better developer experience overall.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;With v2.0 released, we're excited about the future of HydePHP. We'll continue to focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving documentation and learning resources&lt;/li&gt;
&lt;li&gt;Enhancing the developer experience&lt;/li&gt;
&lt;li&gt;Building new features based on community feedback&lt;/li&gt;
&lt;li&gt;Maintaining compatibility with the latest Laravel and PHP versions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started Today
&lt;/h2&gt;

&lt;p&gt;Ready to upgrade or start a new project with HydePHP v2.0? Install it via Composer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require hyde/framework:^2.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For new projects, we recommend using the HydePHP installer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer create-project hyde/hyde
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://hydephp.com/docs/2.x" rel="noopener noreferrer"&gt;hydephp.com/docs/2.x&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade Guide&lt;/strong&gt;: &lt;a href="https://hydephp.com/docs/2.x/upgrade-guide" rel="noopener noreferrer"&gt;hydephp.com/docs/2.x/upgrade-guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Changelog&lt;/strong&gt;: &lt;a href="https://github.com/hydephp/develop/releases/tag/v2.0.0" rel="noopener noreferrer"&gt;github.com/hydephp/develop/releases/tag/v2.0.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/hydephp/hyde" rel="noopener noreferrer"&gt;github.com/hydephp/hyde&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord Community&lt;/strong&gt;: &lt;a href="https://discord.hydephp.com" rel="noopener noreferrer"&gt;discord.hydephp.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Thank You
&lt;/h2&gt;

&lt;p&gt;A huge thank you to everyone who contributed to this release through code, bug reports, feedback, and community support. HydePHP wouldn't be possible without this amazing community.&lt;/p&gt;

&lt;p&gt;We encourage all users to upgrade to this latest version and explore the new features. As always, we welcome your feedback and contributions to make HydePHP even better. Please report any issues you find on &lt;a href="https://github.com/hydephp/hyde" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and share your thoughts on Twitter/X using the hashtag &lt;a href="https://twitter.com/search?q=%23HydePHP" rel="noopener noreferrer"&gt;#HydePHP&lt;/a&gt; or by tagging us at &lt;a href="https://twitter.com/HydeFramework" rel="noopener noreferrer"&gt;@HydeFramework&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy building with HydePHP v2.0!&lt;/p&gt;

</description>
      <category>hydephp</category>
      <category>laravel</category>
      <category>php</category>
      <category>news</category>
    </item>
    <item>
      <title>Hackathon: HydePHP is Joining ODHack #14</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Wed, 28 May 2025 19:30:04 +0000</pubDate>
      <link>https://dev.to/emmadscodes/hackathon-hydephp-is-joining-odhack-14-19g</link>
      <guid>https://dev.to/emmadscodes/hackathon-hydephp-is-joining-odhack-14-19g</guid>
      <description>&lt;h2&gt;
  
  
  Are you ready to build something amazing?
&lt;/h2&gt;

&lt;p&gt;We're excited to announce that HydePHP is officially participating in &lt;strong&gt;&lt;a href="https://contribute.onlydust.com/od-hacks/od-hack-14?ref=hydephp.com" rel="noopener noreferrer"&gt;ODHack #14&lt;/a&gt;&lt;/strong&gt;, running from May 28 to June 4, 2025! This is a fantastic opportunity for developers of all skill levels to contribute to our open-source static site generator and help shape the future of modern web development.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is ODHack #14?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://contribute.onlydust.com/od-hacks/od-hack-14?ref=hydephp.com" rel="noopener noreferrer"&gt;ODHack&lt;/a&gt; is &lt;a href="https://onlydust.com/?ref=hydephp.com" rel="noopener noreferrer"&gt;OnlyDust&lt;/a&gt;'s monthly hackathon that connects developers with meaningful open-source projects. It's more than just a coding competition – it's a chance to contribute to real-world projects, build your developer portfolio, and connect with a thriving community of passionate developers from around the globe.&lt;/p&gt;

&lt;p&gt;With over 1,571 issues across 547 repositories, ODHack #14 offers something for everyone, whether you're a seasoned developer or just starting your open-source journey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Contribute to HydePHP?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/hydephp/hyde" rel="noopener noreferrer"&gt;HydePHP&lt;/a&gt; is a powerful, elegant static site generator built with PHP that makes creating beautiful, fast websites a breeze. By contributing to HydePHP during &lt;a href="https://contribute.onlydust.com/od-hacks/od-hack-14?ref=hydephp.com" rel="noopener noreferrer"&gt;ODHack #14&lt;/a&gt;, you'll be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Working on cutting-edge technology&lt;/strong&gt;: Help improve a modern static site generator that's used by developers worldwide&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Making a real impact&lt;/strong&gt;: Your contributions will directly benefit the HydePHP community and ecosystem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building valuable skills&lt;/strong&gt;: Gain experience with PHP, Laravel ecosystem tools, and modern web development practices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Joining a welcoming community&lt;/strong&gt;: Our maintainers are committed to helping contributors succeed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's in Store for Contributors
&lt;/h2&gt;

&lt;p&gt;We've prepared an exciting mix of contribution opportunities specifically for ODHack #14:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good First Issues&lt;/strong&gt;&lt;br&gt;
Perfect for newcomers or those new to HydePHP! We have several beginner-friendly issues including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supporting "excerpt" as an alias for "description" in blog post schema&lt;/li&gt;
&lt;li&gt;Adding namespaced functions for helper methods&lt;/li&gt;
&lt;li&gt;Fixing UI glitches and improving user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Beta Testing HydePHP v2.0&lt;/strong&gt;&lt;br&gt;
Here's something special – &lt;strong&gt;HydePHP v2.0 is launching next month&lt;/strong&gt;, and we need your help testing it! Contributors will get exclusive early access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test new features and provide feedback&lt;/li&gt;
&lt;li&gt;Report bugs and help us polish the release&lt;/li&gt;
&lt;li&gt;Be among the first to experience the next generation of HydePHP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Creative Showcase Projects&lt;/strong&gt;&lt;br&gt;
Let your creativity shine! We're looking for contributors to build impressive demo websites using HydePHP v2.0. The best demos will be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Featured on the official HydePHP website&lt;/li&gt;
&lt;li&gt;Used to showcase the framework's capabilities&lt;/li&gt;
&lt;li&gt;A source of valuable feedback for our v2.0 release&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Featured Issues to Get You Started&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We've tagged several issues specifically for ODHack #14 participants. You can find them in the &lt;a href="https://github.com/hydephp/hyde/issues?q=is%3Aissue+is%3Aopen+label%3AODHack14" rel="noopener noreferrer"&gt;HydePHP repository&lt;/a&gt; with the &lt;code&gt;ODHack14&lt;/code&gt; label.&lt;/p&gt;

&lt;p&gt;Each issue includes detailed descriptions, acceptance criteria, and guidance to help you get started quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Get Involved
&lt;/h2&gt;

&lt;p&gt;Ready to join the fun? Here's how to participate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Register for ODHack #14&lt;/strong&gt; at &lt;a href="https://contribute.onlydust.com/od-hacks/od-hack-14?ref=hydephp.com" rel="noopener noreferrer"&gt;contribute.onlydust.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse HydePHP issues&lt;/strong&gt; tagged with &lt;code&gt;ODHack14&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply to work on issues&lt;/strong&gt; that match your interests and skill level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join our community&lt;/strong&gt; - Connect with other contributors and maintainers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start contributing&lt;/strong&gt; - Submit your pull requests and make your mark!&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Join Our Community
&lt;/h2&gt;

&lt;p&gt;Contributing to open source is more rewarding when you're part of a supportive community. Join us on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/hydephp/hyde" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt;: Follow our repository and engage with issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/hydephp/hyde/discussions" rel="noopener noreferrer"&gt;Discussions&lt;/a&gt;&lt;/strong&gt;: Share ideas and get help from maintainers and fellow contributors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://discord.hydephp.com" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;&lt;/strong&gt;: Real-time chat with the HydePHP community&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ready to Build Something Amazing?
&lt;/h2&gt;

&lt;p&gt;Whether you're looking to fix your first bug, test cutting-edge features, or create stunning demo sites, HydePHP's participation in ODHack #14 offers the perfect opportunity to dive into open source development.&lt;/p&gt;

&lt;p&gt;The hackathon runs until &lt;strong&gt;June 4th&lt;/strong&gt;, giving you a full week to make meaningful contributions, learn new skills, and connect with developers worldwide. Every contribution matters, no matter how big or small!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://contribute.onlydust.com/od-hacks/od-hack-14?ref=hydephp.com" rel="noopener noreferrer"&gt;Join ODHack #14 now&lt;/a&gt;&lt;/strong&gt; and let's build the future of static site generation together. We can't wait to see what you'll create with HydePHP!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Happy coding, and welcome to the HydePHP community! 🚀&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hydephp</category>
      <category>hackathon</category>
      <category>opensource</category>
      <category>php</category>
    </item>
    <item>
      <title>Demystifying the TailwindCSS `bg-current` utility class</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Fri, 15 Nov 2024 18:54:00 +0000</pubDate>
      <link>https://dev.to/emmadscodes/demystifying-the-tailwindcss-bg-current-utility-class-4h7l</link>
      <guid>https://dev.to/emmadscodes/demystifying-the-tailwindcss-bg-current-utility-class-4h7l</guid>
      <description>&lt;p&gt;The &lt;code&gt;bg-current&lt;/code&gt; utility class in TailwindCSS sets the background color of an element to the current text color. This means that the background will inherit the color defined by the &lt;code&gt;text-color&lt;/code&gt; property of the element or its parent.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inheritance&lt;/strong&gt;: If you have a parent element with a specific text color (e.g., &lt;code&gt;text-gray-700&lt;/code&gt;), using &lt;code&gt;bg-current&lt;/code&gt; on a child element will make the background of that child element the same color as the text color of the parent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic&lt;/strong&gt;: This is particularly useful for creating components that need to adapt to different themes or color schemes without hardcoding specific colors. For example, if you switch from light mode to dark mode, the background will automatically change to match the new text color.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-blue-500"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-current"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;This background is blue!&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the background of the &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; will be blue because it inherits the text color from the parent &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt;: Ensures that the background color is always consistent with the text color, which can be particularly useful for icons or buttons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ease of Use&lt;/strong&gt;: Reduces the need to define multiple color classes for different states or themes, simplifying the styling process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using &lt;code&gt;bg-current&lt;/code&gt; is a great way to maintain visual harmony in your design while leveraging Tailwind's utility-first approach.&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>beginners</category>
      <category>learning</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Laravel Nightwatch: The Future of Laravel Application Monitoring Revealed at Laracon AU</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Thu, 07 Nov 2024 10:24:41 +0000</pubDate>
      <link>https://dev.to/emmadscodes/laravel-nightwatch-the-future-of-laravel-application-monitoring-revealed-at-laracon-au-3aei</link>
      <guid>https://dev.to/emmadscodes/laravel-nightwatch-the-future-of-laravel-application-monitoring-revealed-at-laracon-au-3aei</guid>
      <description>&lt;p&gt;Laravel's ecosystem continues to expand with the announcement of &lt;strong&gt;Laravel Nightwatch&lt;/strong&gt; at Laracon AU - a sophisticated monitoring platform specifically engineered for Laravel applications. Set for early access in Q1 2025, Nightwatch promises to revolutionize how developers monitor and maintain their Laravel applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  A New Era of Laravel Monitoring
&lt;/h2&gt;

&lt;p&gt;Laravel Nightwatch represents a significant advancement in application monitoring, developed by the same team behind Laravel Cloud, Forge, Vapor, and Nova. This platform stands out by offering context-aware monitoring that understands Laravel's internal workings, providing insights that generic monitoring solutions simply cannot match.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Configuration Monitoring&lt;/strong&gt;: Nightwatch automatically detects and tracks application activities without complex setup procedures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent Log Management&lt;/strong&gt;: Advanced log ingestion and analysis specifically optimized for Laravel applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Performance Tracking&lt;/strong&gt;: Immediate insights into application performance metrics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Alert System&lt;/strong&gt;: Smart notifications for critical issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform Compatibility&lt;/strong&gt;: Works seamlessly with all hosting platforms including Laravel Cloud, Forge, Vapor, and custom infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Nightwatch Matters
&lt;/h2&gt;

&lt;p&gt;Traditional monitoring solutions often require developers to piece together multiple tools and wade through endless logs to understand their application's health. Nightwatch aims to eliminate this complexity by providing a unified, Laravel-focused monitoring solution that delivers meaningful insights out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Availability and Pricing
&lt;/h2&gt;

&lt;p&gt;While early access is scheduled for Q1 2025, Laravel has confirmed they're developing a pricing structure that will accommodate teams of all sizes - from individual developers to enterprise organizations. This commitment to accessibility ensures that comprehensive application monitoring won't be limited to just large-scale operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;p&gt;The introduction of Nightwatch marks another milestone in Laravel's journey to provide developers with best-in-class tools for building and maintaining web applications. As Taylor Otwell, Laravel's creator, puts it: "We're not here to add another dashboard to your toolkit — we're here to redefine how you understand your Laravel application."&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Interested developers can join the waitlist at &lt;a href="https://nightwatch.laravel.com" rel="noopener noreferrer"&gt;nightwatch.laravel.com&lt;/a&gt; to be among the first to experience Laravel Nightwatch when it launches in early 2025.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Stay tuned for more updates as we approach the early access release of Laravel Nightwatch in 2025.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>news</category>
      <category>laravel</category>
      <category>php</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>New `@bool` Blade directive in Laravel!</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Sun, 20 Oct 2024 16:38:32 +0000</pubDate>
      <link>https://dev.to/emmadscodes/new-bool-blade-directive-in-laravel-3cob</link>
      <guid>https://dev.to/emmadscodes/new-bool-blade-directive-in-laravel-3cob</guid>
      <description>&lt;h2&gt;
  
  
  The new &lt;code&gt;@bool&lt;/code&gt; Blade directive
&lt;/h2&gt;

&lt;p&gt;Laravel's Blade templating engine is getting a handy new feature: the &lt;a class="mentioned-user" href="https://dev.to/bool"&gt;@bool&lt;/a&gt; directive. This allows you to directly print boolean values into strings or use them in object construction, making your JavaScript integrations cleaner and more efficient.&lt;/p&gt;

&lt;p&gt;Here's how you can use it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$isActive&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;hasAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$hasAccess&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When compiled, this Blade code will output clean JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;hasAccess&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;p&gt;The &lt;a class="mentioned-user" href="https://dev.to/bool"&gt;@bool&lt;/a&gt; directive is particularly useful in several scenarios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;JavaScript configuration objects&lt;/li&gt;
&lt;li&gt;Alpine.js data binding&lt;/li&gt;
&lt;li&gt;HTML attributes requiring boolean values&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For instance, with Bootstrap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;aria-haspopup=&lt;/span&gt;&lt;span class="s"&gt;"@bool($hasPopup)"&lt;/span&gt; &lt;span class="na"&gt;aria-expanded=&lt;/span&gt;&lt;span class="s"&gt;"@bool($isExpanded)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Dropdown button
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Availability &amp;amp; PR
&lt;/h2&gt;

&lt;p&gt;While this feature isn't released yet, it's expected to be available soon. Keep an eye on Laravel's official channels for the announcement. In the meantime, check out the merged PR on GitHub! &lt;a href="https://github.com/laravel/framework/pull/53179" rel="noopener noreferrer"&gt;https://github.com/laravel/framework/pull/53179&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;@bool&lt;/code&gt; directive is a small but powerful addition to Blade that will make working with boolean values in your templates much more convenient.&lt;/p&gt;

&lt;p&gt;If any part of this post was helpful, please let me know and give me a follow on Twitter/X where I'm &lt;a href="https://twitter.com/CodeWithCaen" rel="noopener noreferrer"&gt;@CodeWithCaen&lt;/a&gt;&lt;/p&gt;

</description>
      <category>news</category>
      <category>laravel</category>
      <category>php</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Quick Tip: Git Undo Commands</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Thu, 17 Oct 2024 19:38:49 +0000</pubDate>
      <link>https://dev.to/emmadscodes/quick-tip-git-undo-commands-1kj9</link>
      <guid>https://dev.to/emmadscodes/quick-tip-git-undo-commands-1kj9</guid>
      <description>&lt;p&gt;To undo changes in Git, you can use the following commands, depending on what you want to undo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Method 1:&lt;/strong&gt; Undo uncommitted changes in the working directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Method 2:&lt;/strong&gt; Unstage a staged file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &amp;lt;file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Method 3:&lt;/strong&gt; Undo the last commit but keep changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--soft&lt;/span&gt; HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Method 4:&lt;/strong&gt; Undo the last commit and discard changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; Reset to the remote tracking branch&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; origin/&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--abbrev-ref&lt;/span&gt; HEAD&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose the command based on your requirement. Always be cautious with &lt;code&gt;--hard&lt;/code&gt; as it irreversibly deletes changes.&lt;/p&gt;

</description>
      <category>git</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>cli</category>
    </item>
    <item>
      <title>Support HydePHP and Double Your Impact!</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Thu, 17 Oct 2024 19:36:36 +0000</pubDate>
      <link>https://dev.to/emmadscodes/support-hydephp-and-double-your-impact-4b8e</link>
      <guid>https://dev.to/emmadscodes/support-hydephp-and-double-your-impact-4b8e</guid>
      <description>&lt;h2&gt;
  
  
  Double Your Donation to HydePHP!
&lt;/h2&gt;

&lt;p&gt;We're excited to share an opportunity to support HydePHP and make your contribution go even further!&lt;/p&gt;

&lt;p&gt;Simon Hamp (&lt;a href="https://x.com/simonhamp" rel="noopener noreferrer"&gt;@simonhamp&lt;/a&gt;) has launched a &lt;a href="https://x.com/simonhamp/status/1845840688438526159" rel="noopener noreferrer"&gt;generous matching donation campaign&lt;/a&gt; for open-source projects. Here's how you can participate and help HydePHP:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Donate any amount to &lt;a href="https://opencollective.com/hydephp" rel="noopener noreferrer"&gt;HydePHP's OpenCollective&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Send your donation receipt to Simon Hamp.&lt;/li&gt;
&lt;li&gt;Simon will match your donation up to $10!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a fantastic chance to double your impact and support the ongoing development of HydePHP, the Laravel-based static site generator.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Support HydePHP?
&lt;/h3&gt;

&lt;p&gt;Your contributions help cover hosting costs, development tools, and enable us to create more resources for the community. Every donation, no matter the size, makes a difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ready to Support HydePHP and Open Source?
&lt;/h3&gt;

&lt;p&gt;Simon's campaign aims to raise $2,000 for 100 open-source projects. Let's make sure HydePHP is one of them! Donate today and help us continue improving the HydePHP experience for everyone.&lt;/p&gt;

&lt;p&gt;Thank you for your support and for being part of the HydePHP community!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>news</category>
      <category>community</category>
      <category>php</category>
    </item>
    <item>
      <title>Escape the Drama: Why HydePHP is Your WordPress Alternative</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Sun, 13 Oct 2024 22:49:55 +0000</pubDate>
      <link>https://dev.to/emmadscodes/escape-the-drama-why-hydephp-is-your-wordpress-alternative-11nd</link>
      <guid>https://dev.to/emmadscodes/escape-the-drama-why-hydephp-is-your-wordpress-alternative-11nd</guid>
      <description>&lt;h2&gt;
  
  
  The WordPress Drama
&lt;/h2&gt;

&lt;p&gt;As the WordPress ecosystem faces unprecedented turmoil, many developers and site owners are reconsidering their platform choices. The recent conflict between WordPress co-founder Matt Mullenweg and WP Engine has highlighted issues of control, contribution, and commercialization within the WordPress community. This drama serves as a wake-up call: it's time to explore alternatives that prioritize simplicity, independence, and developer empowerment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter HydePHP: A Breath of Fresh Air
&lt;/h2&gt;

&lt;p&gt;HydePHP emerges as a compelling alternative for those seeking to break free from the complexities and controversies of WordPress. Let's explore why HydePHP might be the perfect solution for your next project.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Content-First Philosophy
&lt;/h3&gt;

&lt;p&gt;HydePHP embraces a content-first approach, allowing you to focus on what matters most: your writing. With Markdown support, you can create blog posts, documentation pages, and static HTML pages without getting bogged down in complex markup or plugin configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Simplicity Without Sacrifice
&lt;/h3&gt;

&lt;p&gt;Unlike WordPress's steep learning curve and plugin dependencies, HydePHP offers a streamlined development experience. It combines a framework, static site builder, and starter template into one cohesive package. This means you can get started quickly without sacrificing the ability to customize your site as your needs evolve.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Lightning-Fast Performance
&lt;/h3&gt;

&lt;p&gt;As a static site generator, HydePHP produces websites that are inherently fast and scalable. By eliminating the need for databases and server-side rendering, your site can be served from global CDNs, resulting in blazing-fast load times and improved user experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Enhanced Security and Stability
&lt;/h3&gt;

&lt;p&gt;With no database to maintain or complex backend to secure, HydePHP sites are significantly less vulnerable to common web attacks. This not only improves your site's security but also reduces the ongoing maintenance burden.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Cost-Effective Hosting
&lt;/h3&gt;

&lt;p&gt;Static sites are incredibly cheap to host, with many providers offering free options. This can lead to substantial cost savings compared to traditional WordPress hosting, especially as your site scales.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Developer-Friendly Environment
&lt;/h3&gt;

&lt;p&gt;Built on Laravel and using familiar tools like Blade and TailwindCSS, HydePHP provides a modern, enjoyable development experience. It strikes a balance between ease of use for beginners and flexibility for advanced users.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. No Vendor Lock-In
&lt;/h3&gt;

&lt;p&gt;Unlike the WordPress ecosystem, where your content can become entangled with themes and plugins, HydePHP keeps your content separate and portable. This gives you the freedom to evolve your site or even migrate to a different platform in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the Switch
&lt;/h2&gt;

&lt;p&gt;Transitioning from WordPress to HydePHP is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install HydePHP using Composer: &lt;code&gt;composer create-project hyde/hyde&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Migrate your content to Markdown files&lt;/li&gt;
&lt;li&gt;Customize your templates and styles as needed&lt;/li&gt;
&lt;li&gt;Build and deploy your static site&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As the WordPress drama unfolds, it's clear that developers and content creators need alternatives that offer simplicity, speed, and independence. HydePHP provides all these benefits while maintaining the flexibility to grow with your needs.&lt;/p&gt;

&lt;p&gt;By choosing HydePHP, you're not just selecting a tool; you're embracing a philosophy of content-first development, free from the complexities and controversies that can plague larger ecosystems. Give HydePHP a try for your next project, and experience the joy of building websites without the drama.&lt;/p&gt;

&lt;p&gt;Ready to get started? Check out the &lt;a href="https://hydephp.com/docs" rel="noopener noreferrer"&gt;HydePHP documentation&lt;/a&gt; and join a community focused on empowering developers and content creators alike.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>hydephp</category>
      <category>webdev</category>
      <category>php</category>
    </item>
    <item>
      <title>Quick Tip: How To Use Blue Links in Tailwind Typography (Prose)</title>
      <dc:creator>EmmaDSCodes</dc:creator>
      <pubDate>Fri, 27 Sep 2024 11:48:48 +0000</pubDate>
      <link>https://dev.to/emmadscodes/quick-tip-how-to-use-blue-links-in-tailwind-typography-prose-3i9j</link>
      <guid>https://dev.to/emmadscodes/quick-tip-how-to-use-blue-links-in-tailwind-typography-prose-3i9j</guid>
      <description>&lt;p&gt;The Tailwind Typography plugin (that adds the &lt;code&gt;.prose&lt;/code&gt; class) comes with a very opinionated link style. If you want the more classic one, it's easy to fix in the config. You can also go bold and use any other color of course. I'm going with Indigo for a sweet blue link.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;fontFamily&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;sans&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Inter var&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;defaultTheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fontFamily&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sans&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;typography&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;DEFAULT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;css&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;colors.indigo.600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="na"&gt;textDecoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;amp;:hover&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;colors.indigo.500&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>tailwindcss</category>
    </item>
  </channel>
</rss>
