<?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>Forem: Taki Elias</title>
    <description>The latest articles on Forem by Taki Elias (@takielias).</description>
    <link>https://forem.com/takielias</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F924235%2F6341ffec-a571-4ef5-8190-56272f195ba5.jpeg</url>
      <title>Forem: Taki Elias</title>
      <link>https://forem.com/takielias</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/takielias"/>
    <language>en</language>
    <item>
      <title>Stop Fighting SSL in Coolify Behind Cloudflare</title>
      <dc:creator>Taki Elias</dc:creator>
      <pubDate>Wed, 18 Mar 2026 11:19:31 +0000</pubDate>
      <link>https://forem.com/takielias/stop-fighting-ssl-in-coolify-behind-cloudflare-2pip</link>
      <guid>https://forem.com/takielias/stop-fighting-ssl-in-coolify-behind-cloudflare-2pip</guid>
      <description>&lt;p&gt;If you're using Coolify with Cloudflare, SSL can feel confusing.&lt;/p&gt;

&lt;p&gt;You deploy your app, connect the domain, and expect HTTPS to just work.&lt;/p&gt;

&lt;p&gt;But instead, you end up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;changing SSL modes in Cloudflare&lt;/li&gt;
&lt;li&gt;trying different configs in your server&lt;/li&gt;
&lt;li&gt;not really sure what’s broken&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything looks fine, but something is off.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s going on
&lt;/h2&gt;

&lt;p&gt;When Cloudflare proxy is enabled, there are two connections:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User → Cloudflare&lt;/li&gt;
&lt;li&gt;Cloudflare → Your server&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The second one is the important part.&lt;/p&gt;

&lt;p&gt;If your server doesn’t have a proper certificate, Cloudflare can’t securely connect to it — especially in &lt;strong&gt;Full (Strict)&lt;/strong&gt; mode.&lt;/p&gt;

&lt;p&gt;That’s where most setups fail.&lt;/p&gt;




&lt;h2&gt;
  
  
  The right way to handle it
&lt;/h2&gt;

&lt;p&gt;Cloudflare provides &lt;strong&gt;Origin CA certificates&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These are meant for your server (not browsers), and they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;work with Cloudflare proxy enabled&lt;/li&gt;
&lt;li&gt;last up to 15 years&lt;/li&gt;
&lt;li&gt;don’t require validation like Let’s Encrypt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of fighting SSL, you just need to set this up correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Setting this up manually takes time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generate key and certificate&lt;/li&gt;
&lt;li&gt;upload to server&lt;/li&gt;
&lt;li&gt;configure Traefik or Caddy&lt;/li&gt;
&lt;li&gt;update DNS&lt;/li&gt;
&lt;li&gt;switch SSL mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s easy to make a mistake in one of these steps.&lt;/p&gt;




&lt;h2&gt;
  
  
  A simpler way
&lt;/h2&gt;

&lt;p&gt;I built a small CLI tool called CertGun to handle this.&lt;/p&gt;

&lt;p&gt;It automates the full setup for Coolify servers using Cloudflare.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;First, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;certgun init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;certgun add 103.21.44.10 example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it handles for you
&lt;/h2&gt;

&lt;p&gt;CertGun takes care of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generating the certificate&lt;/li&gt;
&lt;li&gt;installing it on your server&lt;/li&gt;
&lt;li&gt;configuring Traefik or Caddy&lt;/li&gt;
&lt;li&gt;updating DNS in Cloudflare&lt;/li&gt;
&lt;li&gt;setting SSL mode to Full (Strict)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need to do these manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wildcard support
&lt;/h2&gt;

&lt;p&gt;You can also use wildcard domains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;certgun add 103.21.44.10 &lt;span class="k"&gt;*&lt;/span&gt;.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  When this helps
&lt;/h2&gt;

&lt;p&gt;This is useful if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use Coolify&lt;/li&gt;
&lt;li&gt;keep Cloudflare proxy enabled&lt;/li&gt;
&lt;li&gt;want Full (Strict) SSL without extra steps&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why use this instead of Let’s Encrypt?
&lt;/h2&gt;

&lt;p&gt;Let’s Encrypt works well, but with Cloudflare it often adds extra steps.&lt;/p&gt;

&lt;p&gt;Origin certificates are simpler in this case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no validation issues&lt;/li&gt;
&lt;li&gt;no renewal every 90 days&lt;/li&gt;
&lt;li&gt;no need to disable proxy&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;GitHub: &lt;a href="https://github.com/takielias/certgun" rel="noopener noreferrer"&gt;https://github.com/takielias/certgun&lt;/a&gt;&lt;br&gt;
Docs: &lt;a href="https://docs.ebuz.xyz/certgun" rel="noopener noreferrer"&gt;https://docs.ebuz.xyz/certgun&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you’ve been adjusting settings just to make SSL work, this removes that hassle.&lt;/p&gt;

</description>
      <category>ssl</category>
      <category>cloudflarechallenge</category>
      <category>coolify</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Got Tired of AI Files Messing Up My Repos — So I Built This CLI</title>
      <dc:creator>Taki Elias</dc:creator>
      <pubDate>Tue, 17 Mar 2026 11:02:40 +0000</pubDate>
      <link>https://forem.com/takielias/i-got-tired-of-ai-files-messing-up-my-repos-so-i-built-this-cli-1cj4</link>
      <guid>https://forem.com/takielias/i-got-tired-of-ai-files-messing-up-my-repos-so-i-built-this-cli-1cj4</guid>
      <description>&lt;p&gt;If you're using AI while coding, you’ve probably seen this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;notes.md  
final-notes.md  
prompt-final-final.md  
temp.md  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every project slowly turns into a mess.&lt;/p&gt;

&lt;p&gt;Some of these files are useful.&lt;br&gt;
But you don’t really want them in your repo.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I kept running into the same situation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I need these files&lt;/li&gt;
&lt;li&gt;But I don’t want to commit them&lt;/li&gt;
&lt;li&gt;Ignoring them makes things hard to manage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I ended up with either messy repos…&lt;br&gt;
or losing useful notes.&lt;/p&gt;

&lt;p&gt;Neither felt right.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I ended up building a small CLI to fix this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ccv (Claude Code Vault)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/takielias/claude-code-vault" rel="noopener noreferrer"&gt;https://github.com/takielias/claude-code-vault&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It keeps all your private files in one place&lt;br&gt;
and links them into your project when needed.&lt;/p&gt;


&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;All your files live in a single vault:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;~/.ccv/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside your project, they appear like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.project-docs/notes.md → ~/.ccv/projects/my-project/notes.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can open and use them normally&lt;/li&gt;
&lt;li&gt;Claude (or any AI tool) can read them&lt;/li&gt;
&lt;li&gt;They are not inside your repo&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quick Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ccv init
ccv add notes.md
ccv push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s basically it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Use It For
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prompt collections&lt;/li&gt;
&lt;li&gt;AI-generated notes&lt;/li&gt;
&lt;li&gt;Debugging experiments&lt;/li&gt;
&lt;li&gt;Architecture drafts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anything I don’t want to commit but don’t want to lose either.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It Helped Me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keeps repos clean&lt;/li&gt;
&lt;li&gt;Works across multiple projects&lt;/li&gt;
&lt;li&gt;Everything stays local&lt;/li&gt;
&lt;li&gt;Still version controlled (Git)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It removed a small but constant annoyance from my workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Made This
&lt;/h2&gt;

&lt;p&gt;I was hitting the same problem again and again across projects.&lt;/p&gt;

&lt;p&gt;AI is useful, but it leaves a lot of noise behind.&lt;/p&gt;

&lt;p&gt;I just wanted a clean separation between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;actual code&lt;/li&gt;
&lt;li&gt;everything else&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;If you’re dealing with the same issue, you can check it out here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/takielias/claude-code-vault" rel="noopener noreferrer"&gt;https://github.com/takielias/claude-code-vault&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  If It Helps You
&lt;/h2&gt;

&lt;p&gt;It’s completely free.&lt;/p&gt;

&lt;p&gt;If it ends up saving you time or making your workflow easier,&lt;br&gt;
you can support me here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://buymeacoffee.com/takielias" rel="noopener noreferrer"&gt;https://buymeacoffee.com/takielias&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;Nothing fancy. Just something that made my daily workflow cleaner.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>PHP Requests Don’t Look Like Browsers — So I Built One</title>
      <dc:creator>Taki Elias</dc:creator>
      <pubDate>Thu, 12 Mar 2026 15:29:50 +0000</pubDate>
      <link>https://forem.com/takielias/php-requests-dont-look-like-browsers-so-i-built-one-18f4</link>
      <guid>https://forem.com/takielias/php-requests-dont-look-like-browsers-so-i-built-one-18f4</guid>
      <description>&lt;p&gt;Modern websites detect bots using TLS fingerprints, not just HTTP headers.&lt;/p&gt;

&lt;p&gt;Most PHP HTTP clients rely on curl, which means their TLS fingerprint always looks the same.&lt;/p&gt;

&lt;p&gt;So I built a PHP extension that makes requests look like real browsers.&lt;/p&gt;

&lt;p&gt;I tried scraping a website using PHP.&lt;/p&gt;

&lt;p&gt;The first request worked.&lt;/p&gt;

&lt;p&gt;The second request failed.&lt;/p&gt;

&lt;p&gt;The third request got blocked.&lt;/p&gt;

&lt;p&gt;At first I assumed the usual things were wrong. Maybe the &lt;strong&gt;User-Agent&lt;/strong&gt; header. So I changed it to Chrome.&lt;/p&gt;

&lt;p&gt;Still blocked.&lt;/p&gt;

&lt;p&gt;Then I copied every header Chrome sends.&lt;/p&gt;

&lt;p&gt;Still blocked.&lt;/p&gt;

&lt;p&gt;That’s when I realized something interesting.&lt;/p&gt;

&lt;p&gt;The server wasn’t detecting my script using HTTP headers.&lt;/p&gt;

&lt;p&gt;It was detecting it &lt;strong&gt;before the HTTP request even arrived&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Layer Most Developers Don’t See
&lt;/h2&gt;

&lt;p&gt;Most developers think HTTP requests look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Headers
Cookies
User-Agent
Body
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But modern bot protection systems look deeper.&lt;/p&gt;

&lt;p&gt;Before your HTTP request reaches the server, your client performs a &lt;strong&gt;TLS handshake&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That handshake contains details like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cipher suites&lt;/li&gt;
&lt;li&gt;TLS extensions&lt;/li&gt;
&lt;li&gt;ALPN negotiation&lt;/li&gt;
&lt;li&gt;HTTP/2 settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together these create a &lt;strong&gt;TLS fingerprint&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Different clients produce different fingerprints.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Chrome → Chrome TLS fingerprint
Firefox → Firefox TLS fingerprint
curl → curl TLS fingerprint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if you perfectly copy Chrome headers, the TLS fingerprint still reveals the truth.&lt;/p&gt;




&lt;h2&gt;
  
  
  The PHP Problem
&lt;/h2&gt;

&lt;p&gt;Most PHP HTTP clients rely on &lt;strong&gt;libcurl&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;curl extension&lt;/li&gt;
&lt;li&gt;Guzzle&lt;/li&gt;
&lt;li&gt;Symfony HTTP client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which means most PHP requests share the same fingerprint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To modern bot protection systems, that’s easy to detect.&lt;/p&gt;

&lt;p&gt;Changing headers doesn’t help because the TLS handshake still exposes the client.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;I wanted PHP requests to behave like &lt;strong&gt;real browsers&lt;/strong&gt;, not curl.&lt;/p&gt;

&lt;p&gt;But implementing a custom TLS stack in PHP is not realistic. That kind of work requires a systems language.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;Rust&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;I discovered a Rust networking library called &lt;strong&gt;wreq&lt;/strong&gt;, and on top of it a project called &lt;strong&gt;rnet&lt;/strong&gt; that can impersonate real browsers at the TLS and HTTP/2 level.&lt;/p&gt;

&lt;p&gt;It supports profiles like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;li&gt;Safari&lt;/li&gt;
&lt;li&gt;Edge&lt;/li&gt;
&lt;li&gt;OkHttp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meaning the request genuinely behaves like those browsers.&lt;/p&gt;

&lt;p&gt;The problem was that Rust libraries can’t be used directly from PHP.&lt;/p&gt;

&lt;p&gt;Unless you build a &lt;strong&gt;PHP extension&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bridging Rust and PHP
&lt;/h2&gt;

&lt;p&gt;I used a project called &lt;strong&gt;ext-php-rs&lt;/strong&gt;, which allows writing PHP extensions in Rust.&lt;/p&gt;

&lt;p&gt;The idea became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rust networking stack
+
PHP extension
=
Browser-like HTTP requests from PHP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a lot of experimentation (and fighting with build tools, BoringSSL, and PHP ABI differences), it finally worked.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Traditional PHP Request&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;PHP Script
     ↓
libcurl
     ↓
TLS fingerprint: curl
     ↓
Server detects bot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Using php-rnet&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;PHP Script
     ↓
php-rnet
     ↓
TLS fingerprint: Chrome
     ↓
Server sees a browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Introducing php-rnet
&lt;/h2&gt;

&lt;p&gt;The result is &lt;strong&gt;php-rnet&lt;/strong&gt; — a PHP extension that allows PHP to send HTTP requests that look like real browsers.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;RNet\get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://httpbin.org/get"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$resp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or using a reusable client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RNet\ClientBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://httpbin.org/get"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the interesting part is browser impersonation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RNet\ClientBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;impersonate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RNet\Emulation&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;CHROME_136&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nv"&gt;$resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"https://tls.browserleaks.com/json"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To the server, this request looks like it came from &lt;strong&gt;Chrome 136&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Even though it came from a PHP script.&lt;/p&gt;




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

&lt;p&gt;Modern bot protection systems analyze more than just HTTP headers.&lt;/p&gt;

&lt;p&gt;They examine how clients behave at the &lt;strong&gt;TLS and HTTP/2 level&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tools like php-rnet make it possible to reproduce real browser traffic from backend code.&lt;/p&gt;

&lt;p&gt;Some possible use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;automation&lt;/li&gt;
&lt;li&gt;scraping&lt;/li&gt;
&lt;li&gt;testing bot detection systems&lt;/li&gt;
&lt;li&gt;research&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;PHP is usually seen as a high-level web language.&lt;/p&gt;

&lt;p&gt;But combining it with Rust opens up interesting possibilities.&lt;/p&gt;

&lt;p&gt;In this case, it allowed PHP to speak the same network language as modern browsers.&lt;/p&gt;

&lt;p&gt;If you're curious about the project, you can find it here:&lt;/p&gt;

&lt;p&gt;Blog post explaining the project:&lt;br&gt;
&lt;a href="https://docs.ebuz.xyz/blog/posts/php-requests-dont-look-like-browsers" rel="noopener noreferrer"&gt;https://docs.ebuz.xyz/blog/posts/php-requests-dont-look-like-browsers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/takielias/php-rnet" rel="noopener noreferrer"&gt;https://github.com/takielias/php-rnet&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>rust</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀 Contract Resolver: Auto-Bind Repositories &amp; Services in Laravel</title>
      <dc:creator>Taki Elias</dc:creator>
      <pubDate>Sat, 05 Jul 2025 09:52:53 +0000</pubDate>
      <link>https://forem.com/takielias/contract-resolver-auto-bind-repositories-services-in-laravel-42jm</link>
      <guid>https://forem.com/takielias/contract-resolver-auto-bind-repositories-services-in-laravel-42jm</guid>
      <description>&lt;p&gt;Are you tired of manually binding interfaces to implementations in Laravel? Or creating the same service and repository boilerplate over and over?&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;Contract Resolver&lt;/strong&gt;, a Laravel package that handles this for you — cleanly and automatically.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎯 What Is It?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Contract Resolver&lt;/strong&gt; helps you follow Laravel's &lt;strong&gt;Repository + Service pattern&lt;/strong&gt; by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-binding interfaces to implementations&lt;/li&gt;
&lt;li&gt;Generating services/repositories/interfaces using artisan commands&lt;/li&gt;
&lt;li&gt;Supporting nested namespaces&lt;/li&gt;
&lt;li&gt;Requiring zero dependencies&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔧 Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require takielias/contract-resolver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optionally publish the config file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan vendor:publish &lt;span class="nt"&gt;--provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"TakiElias&lt;/span&gt;&lt;span class="se"&gt;\C&lt;/span&gt;&lt;span class="s2"&gt;ontractResolver&lt;/span&gt;&lt;span class="se"&gt;\C&lt;/span&gt;&lt;span class="s2"&gt;ontractResolverServiceProvider"&lt;/span&gt; &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"contract-resolver.config"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✨ Artisan Commands
&lt;/h3&gt;

&lt;p&gt;You can generate everything interactively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan cr:make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or individually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan cr:make-repo Product
php artisan cr:make-service Product
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also supports nested paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan cr:make-repo Admin&lt;span class="se"&gt;\\&lt;/span&gt;User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  📁 Convention-Based Binding
&lt;/h3&gt;

&lt;p&gt;Just follow this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/
├── Contracts/
│   └── Repositories/
│       └── UserRepositoryInterface.php
├── Repositories/
│   └── UserRepository.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the binding happens automatically! You can inject interfaces like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;UserRepositoryInterface&lt;/span&gt; &lt;span class="nv"&gt;$userRepo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;userRepo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$userRepo&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;h3&gt;
  
  
  🧪 Testing
&lt;/h3&gt;

&lt;p&gt;Run tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With coverage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer test-coverage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🛠 Why Use It?
&lt;/h3&gt;

&lt;p&gt;✅ Clean, testable Laravel apps&lt;br&gt;
✅ Focus more on business logic&lt;br&gt;
✅ No need to manually bind contracts&lt;br&gt;
✅ Fully customizable&lt;/p&gt;




&lt;h3&gt;
  
  
  🔗 Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🔸 GitHub: &lt;a href="https://github.com/takielias/contract-resolver" rel="noopener noreferrer"&gt;https://github.com/takielias/contract-resolver&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔸 Packagist: &lt;code&gt;takielias/contract-resolver&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find this useful, give it a ⭐ on GitHub. I'd love your feedback or contributions!&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>dependencyinversion</category>
      <category>development</category>
    </item>
    <item>
      <title>Laravel Tablar Admin Dashboard</title>
      <dc:creator>Taki Elias</dc:creator>
      <pubDate>Sun, 23 Oct 2022 14:58:27 +0000</pubDate>
      <link>https://forem.com/takielias/laravel-tablar-admin-dashboard-1m27</link>
      <guid>https://forem.com/takielias/laravel-tablar-admin-dashboard-1m27</guid>
      <description>&lt;p&gt;It's been 2 weeks that I have been working on a New Laravel Admin Dashboard Template.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;jeroennoten/laravel-adminlte&lt;/code&gt; is a well-known admin dashboard laravel package. I used it in different projects. It's highly customizable &amp;amp; feature-rich. The dynamic menu generator with auth guard is the most fantastic feature of this laravel package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabler &lt;/strong&gt;is one of the most popular modern HTML dashboard templates. I used this template a few years ago. There is no laravel package like &lt;code&gt;jeroennoten/laravel-adminlte&lt;/code&gt; for &lt;strong&gt;Tabler &lt;/strong&gt;HTML template. So, I decided to build a new laravel admin dashboard package using the eye-catching design of &lt;strong&gt;Tabler &lt;/strong&gt;HTML template. It's based on Bootstrap 5.0. You would get most of the Bootstrap features in this template.&lt;/p&gt;

&lt;p&gt;Vite js &lt;em&gt;Next Generation Frontend Tooling&lt;/em&gt;. It's super fast &amp;amp; faster than Webpack. I generally use laravel mix to build assets but In some cases, it performs slowly. Vite js is the default assets builder of the latest laravel. So, my plan was to use Vite &amp;amp; add a dynamic menu generator with auth guard.&lt;/p&gt;

&lt;p&gt;Here it is.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/takielias/tablar#tabler--laravel--tablar"&gt;&lt;/a&gt;Tabler + Laravel = TabLar&lt;/p&gt;

&lt;p&gt;Laravel 9.0+ Tabler Dashboard Preset built for Fast Development with Dark Mode. It also contains a dynamic menu generator that helps to maintain navigation permission easily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Light Mode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jS7FwJTf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ebuz.xyz/wp-content/uploads/2022/10/light-1024x755.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jS7FwJTf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ebuz.xyz/wp-content/uploads/2022/10/light-1024x755.png" alt="" width="800" height="590"&gt;&lt;/a&gt;Light Mode&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dark Mode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zn0BUlox--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ebuz.xyz/wp-content/uploads/2022/10/dark-1024x749.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zn0BUlox--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ebuz.xyz/wp-content/uploads/2022/10/dark-1024x749.png" alt="" width="800" height="585"&gt;&lt;/a&gt;Dark Mode&lt;/p&gt;

&lt;p&gt;The installation process is pretty straightforward.&lt;/p&gt;

&lt;h3&gt;Prerequisites&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PHP 8.0+&lt;/li&gt;
&lt;li&gt;Fresh Laravel Framework (10.* +)&lt;/li&gt;
&lt;li&gt;Composer&lt;/li&gt;
&lt;li&gt;Node js &amp;gt;= 18.0&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;composer require takielias/tablar&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;First Install the preset&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;php artisan tablar:install&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Finally, export the config, assets &amp;amp; auth scaffolding.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;php artisan tablar:export-all&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;N.B: You may export individual components. For assets.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;php artisan tablar:export-asset&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For config.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;php artisan tablar:export-config&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For auth scaffolding.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;php artisan tablar:export-auth&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For auth views.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;php artisan tablar:export-views&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Before starting the server don't forget to run migrate&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now visit your login route&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---e_KahB---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ebuz.xyz/wp-content/uploads/2022/10/login.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---e_KahB---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ebuz.xyz/wp-content/uploads/2022/10/login.png" alt="" width="800" height="824"&gt;&lt;/a&gt;Login Page&lt;/p&gt;

&lt;p&gt;N.B: If you use a virtual host for your laravel application, don't forget to change the &lt;strong&gt;APP_URL&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;APP_URL=http://your virtual host&lt;/pre&gt;

&lt;h2&gt;Usage&lt;/h2&gt;

&lt;p&gt;To use the blade template provided by this package, just create a new blade file and extend the layout with @extends('tablar::page'). You may use the following code snippet:&lt;/p&gt;

&lt;pre&gt;@extends('tablar::page')

@section('content')
    &amp;lt;!-- Page header --&amp;gt;
    &amp;lt;div class="page-header d-print-none"&amp;gt;
        &amp;lt;div class="container-xl"&amp;gt;
            &amp;lt;div class="row g-2 align-items-center"&amp;gt;
                &amp;lt;div class="col"&amp;gt;
                    &amp;lt;h2 class="page-title"&amp;gt;
                        Empty page
                    &amp;lt;/h2&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;!-- Page body --&amp;gt;
    &amp;lt;div class="page-body"&amp;gt;
        &amp;lt;div class="container-xl"&amp;gt;
            @if(config('tablar','display_alert'))
                &lt;a class="mentioned-user" href="https://dev.to/include"&gt;@include&lt;/a&gt;('tablar::common.alert')
            @endif

            &amp;lt;!-- Page Content goes here --&amp;gt;

        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
@endsection&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Enable Display Alert&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make &lt;code&gt;display_alert&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; from &lt;strong&gt;tablar.php&lt;/strong&gt; config file&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Tabler Pagination&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{!! $modelName-&amp;gt;links('tablar::pagination') !!}&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;Customization&lt;/h3&gt;

&lt;h5&gt;View : Use the below artisan command to export the views&lt;/h5&gt;

&lt;pre&gt;&lt;code&gt;php artisan tablar:export-views&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;All view files would be exported to &lt;strong&gt;resources/views/vendor/tablar&lt;/strong&gt; directory. You can customize it to your requirements.&lt;/p&gt;

&lt;h5&gt;Menu: Use the below artisan command to export the config file.&lt;/h5&gt;

&lt;p&gt;For config.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;php artisan tablar:export-config&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A &lt;strong&gt;tablar.php&lt;/strong&gt; file would be available in your config folder. You may customize your navigation bar in the menu block&lt;/p&gt;

&lt;p&gt;&lt;code&gt;'menu' =&amp;gt; [ ....... ]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are &lt;strong&gt;greatly appreciated&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Laravel Tablar Github Repo: &lt;a href="https://github.com/takielias/tablar" rel="noreferrer noopener"&gt;https://github.com/takielias/tablar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a CRUD generator &lt;/p&gt;

&lt;p&gt;Laravel Tablar CRUD Generator &lt;a href="https://github.com/takielias/tablar-crud-generator" rel="noreferrer noopener"&gt;https://github.com/takielias/tablar-crud-generator&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;That's It.&lt;/h1&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>templat</category>
      <category>dashboar</category>
    </item>
  </channel>
</rss>
