<?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: Cristian</title>
    <description>The latest articles on Forem by Cristian (@xcs).</description>
    <link>https://forem.com/xcs</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%2F202877%2F49724767-232e-4e5d-b5a4-af4ec6256396.png</url>
      <title>Forem: Cristian</title>
      <link>https://forem.com/xcs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/xcs"/>
    <language>en</language>
    <item>
      <title>Hetzner Servers Benchmarks</title>
      <dc:creator>Cristian</dc:creator>
      <pubDate>Tue, 04 Nov 2025 22:41:42 +0000</pubDate>
      <link>https://forem.com/xcs/hetzner-servers-benchmarks-28f8</link>
      <guid>https://forem.com/xcs/hetzner-servers-benchmarks-28f8</guid>
      <description>&lt;p&gt;I wanted to quickly compare how different &lt;a href="https://hetzner.cloud/?ref=UbRqvwvi1mfG" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt; servers are doing (especially in single-threaded), for CPU-intensive tasks.&lt;/p&gt;

&lt;p&gt;I ran sysbench on four different machines:&lt;/p&gt;

&lt;h2&gt;
  
  
  Hetzner Servers Tested
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hetzner Cloud CPX21&lt;/strong&gt; (AMD EPYC Processor, 3vCPU, 4GB RAM) ~9EUR/mo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hetzner Dedicated EX44&lt;/strong&gt; (i5-13500, 64GB RAM) ~40EUR/mo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hetzner Server Auction&lt;/strong&gt; (i7-8700 128GB RAM) ~40EUR/mo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NEW: Hetzner Dedicated EX63&lt;/strong&gt; (Intel Ultra 7 265, 64GB RAM) ~69EUR/mo&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Benchmark
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;sysbench
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run
&lt;/h3&gt;

&lt;p&gt;Each benchmark is run 3 times and the best result is taken.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sysbench cpu run
sysbench &lt;span class="nt"&gt;--threads&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; cpu run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Results Summary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86ky8crp9ss417irjt7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86ky8crp9ss417irjt7j.png" alt=" " width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Results - Single Thread
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Score (events/sec)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EX63 (Intel Ultra 7 265)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4343.19&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EX44 (i5-13500)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4133.64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPX21 (AMD EPYC)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1617.52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server Auction (i7-8700)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1480.96&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Results - Multi-thread
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;Score (events/sec)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EX63 (Intel Ultra 7 265)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;119944.36&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EX44 (i5-13500)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;50234.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPX21 (AMD EPYC)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4835.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server Auction (i7-8700)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;13043.05&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;EX63 (Intel Ultra 7 265)&lt;/strong&gt; leads both single- and multi-thread performance. It scores about 5% higher than EX44 in single-thread and 2.4× higher in multi-thread.&lt;br&gt;
&lt;strong&gt;EX44 (i5-13500)&lt;/strong&gt; remains strong for its price, still delivering excellent per-core performance and roughly half the multi-thread throughput of EX63.&lt;br&gt;
&lt;strong&gt;CPX21 (EPYC)&lt;/strong&gt; and &lt;strong&gt;Server Auction (i7-8700)&lt;/strong&gt; stay far behind in both metrics.&lt;/p&gt;




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

&lt;p&gt;For &lt;strong&gt;CPU-bound workloads&lt;/strong&gt;, &lt;strong&gt;EX63&lt;/strong&gt; provides top raw compute power, particularly if you can utilize all cores.&lt;br&gt;
&lt;strong&gt;EX44&lt;/strong&gt; continues to offer the &lt;strong&gt;best price-performance balance&lt;/strong&gt;.&lt;br&gt;
The &lt;strong&gt;cloud CPX21&lt;/strong&gt; remains suitable for lightweight or bursty compute tasks.&lt;/p&gt;

&lt;p&gt;If you are new to Hetzner, you can use my referral link to get €20 in cloud credits:&lt;br&gt;
&lt;a href="https://hetzner.cloud/?ref=UbRqvwvi1mfG" rel="noopener noreferrer"&gt;https://hetzner.cloud/?ref=UbRqvwvi1mfG&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cloud</category>
      <category>linux</category>
      <category>performance</category>
    </item>
    <item>
      <title>Running Discourse on Coolify</title>
      <dc:creator>Cristian</dc:creator>
      <pubDate>Tue, 15 Jul 2025 14:25:05 +0000</pubDate>
      <link>https://forem.com/xcs/running-discourse-on-coolify-238i</link>
      <guid>https://forem.com/xcs/running-discourse-on-coolify-238i</guid>
      <description>&lt;p&gt;Discourse does not officially provide a Docker image to run their forum software, which makes it harder to install on Coolify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution:
&lt;/h2&gt;

&lt;p&gt;Use the &lt;a href="https://hub.docker.com/r/bitnami/discourse/tags?ref=softuts.com" rel="noopener noreferrer"&gt;Bitnami Discourse Docker Image&lt;/a&gt; with a custom docker-compose file.&lt;/p&gt;

&lt;p&gt;⚠️ Make sure to replace the following placeholders👇&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;PASSWORD_YOUR_DISCOURSE_PASS (all occurrences)&lt;/span&gt;
&lt;span class="s"&gt;PASSWORD_YOUR_PG_PASS (all occurrences)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Passwords placeholders&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_HOST=yourdomain.com (all occurrences)&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_EMAIL=noreply@yourdomain.com&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SITENAME=Forum&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Branding placeholders&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  - DISCOURSE_SMTP_HOST=in-v3.mailjet.com
  - DISCOURSE_SMTP_PORT=587
  - DISCOURSE_SMTP_USER=YOUR_MAILJET_USER
  - DISCOURSE_SMTP_PASSWORD=YOUR_MAILJET_PASSWORD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Email/SMTP placeholders&lt;/p&gt;

&lt;h2&gt;
  
  
  Discourse docker-compose.yml for Coolify:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgresql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker.io/bitnami/postgresql:16'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;postgresql_data:/bitnami/postgresql'&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRESQL_DATABASE=discourse_db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRESQL_PASSWORD=PASSWORD_YOUR_PG_PASS&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker.io/bitnami/redis:8.0.2'&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;REDIS_PASSWORD=PASSWORD_YOUR_DISCOURSE_PASS&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;redis_data:/bitnami/redis'&lt;/span&gt;
  &lt;span class="na"&gt;discourse&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker.io/bitnami/discourse:3.4.4'&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3145:3000'&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;discourse_data:/bitnami/discourse'&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgresql&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_HOST=yourdomain.com&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_DATABASE_HOST=postgresql&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_USERNAME=admin&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_PASSWORD=PASSWORD_YOUR_DISCOURSE_PASS&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_EMAIL=noreply@yourdomain.com&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SITENAME=Forum&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_POSTGRESQL_NAME=discourse_db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_POSTGRESQL_USERNAME=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_POSTGRESQL_PASSWORD=PASSWORD_YOUR_PG_PASS&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SMTP_HOST=in-v3.mailjet.com&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SMTP_PORT=587&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SMTP_USER=YOUR_MAILJET_USER&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SMTP_PASSWORD=YOUR_MAILJET_PASSWORD&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_REDIS_HOST=redis&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_REDIS_PORT_NUMBER=6379&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_REDIS_PASSWORD=PASSWORD_YOUR_DISCOURSE_PASS&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRESQL_CLIENT_POSTGRES_USER=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRESQL_CLIENT_POSTGRES_PASSWORD=PASSWORD_YOUR_PG_PASS&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POSTGRESQL_CLIENT_CREATE_DATABASE_NAME=discourse_db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;POSTGRESQL_CLIENT_CREATE_DATABASE_EXTENSIONS=hstore,pg_trgm'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;BITNAMI_DEBUG=true&lt;/span&gt;
  &lt;span class="na"&gt;sidekiq&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker.io/bitnami/discourse:3.4.4'&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;discourse&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sidekiq_data:/bitnami/discourse'&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/bitnami/scripts/discourse-sidekiq/run.sh&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_HOST=yourdomain.com&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_DATABASE_HOST=postgresql&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_DATABASE_PORT_NUMBER=5432&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_DATABASE_USER=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_DATABASE_NAME=discourse_db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_DATABASE_PASSWORD=PASSWORD_YOUR_PG_PASS&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_REDIS_HOST=redis&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_REDIS_PASSWORD=PASSWORD_YOUR_DISCOURSE_PASS&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_REDIS_PORT_NUMBER=6379&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SMTP_HOST=in-v3.mailjet.com&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SMTP_PORT=587&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SMTP_USER=YOUR_MAILJET_USER&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DISCOURSE_SMTP_PASSWORD=YOUR_MAILJET_PASSWORD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use this in &lt;strong&gt;Coolify → New Resource → Docker Compose Empty&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2mk2up96lonmbw12bjj1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2mk2up96lonmbw12bjj1.png" alt="docker compose coolify" width="800" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>socialmedia</category>
      <category>docker</category>
      <category>tooling</category>
    </item>
    <item>
      <title>PostHog’s $70M Round: What This Means for Web Analytics</title>
      <dc:creator>Cristian</dc:creator>
      <pubDate>Sat, 14 Jun 2025 23:49:35 +0000</pubDate>
      <link>https://forem.com/xcs/posthogs-70m-round-what-this-means-for-web-analytics-5264</link>
      <guid>https://forem.com/xcs/posthogs-70m-round-what-this-means-for-web-analytics-5264</guid>
      <description>&lt;h1&gt;
  
  
  PostHog’s $70M Round: What This Means for Web Analytics
&lt;/h1&gt;

&lt;p&gt;Web analytics continues to evolve rapidly, and PostHog’s recent &lt;a href="https://posthog.com/blog/series-d" ref="nofollow noreferrer" rel="noopener noreferrer"&gt;$70 million Series D funding round&lt;/a&gt; (announced June 9th, 2025) and led by Stripe marks a significant moment in this landscape.&lt;/p&gt;

&lt;p&gt;With a new company valuation of $920 million and strong investor backing, PostHog is signaling its intention to become a comprehensive “customer infrastructure” suite for digital teams. Yet, while this strategy offers powerful capabilities, it also brings added complexity, opening opportunities for leaner, privacy-focused alternatives.&lt;/p&gt;

&lt;p&gt;Here’s an overview of how the space is changing, a comparison of PostHog and UXWizz, and guidance to help you decide which solution could be the best fit for your organization.&lt;/p&gt;




&lt;h2&gt;
  
  
  PostHog: Ambitious Growth and Expanding Capabilities
&lt;/h2&gt;

&lt;p&gt;Since its founding in 2020, PostHog has earned visibility as a developer-friendly, open-source analytics tool. The Series D raise gives PostHog the resources to transition from a niche solution into a broad platform targeting product and data teams. The latest roadmap includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product analytics&lt;/li&gt;
&lt;li&gt;Session replay&lt;/li&gt;
&lt;li&gt;Feature flags and A/B testing&lt;/li&gt;
&lt;li&gt;Surveys and user feedback collection&lt;/li&gt;
&lt;li&gt;Built-in data warehousing (ClickHouse)&lt;/li&gt;
&lt;li&gt;Error tracking, LLM observability, and plans for a Customer Data Platform (CDP)&lt;/li&gt;
&lt;li&gt;Advanced integrations, a robust API, and frequent feature releases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strengths:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ample funding enables rapid development, especially in emerging areas like AI and CDP&lt;/li&gt;
&lt;li&gt;Strong VC and developer community support rooted in open source&lt;/li&gt;
&lt;li&gt;Suited for large, ambitious teams needing end-to-end analytics and experimentation functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Potential Challenges:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feature sprawl: The drive for expansion could risk product focus and contribute to increased maintenance overhead&lt;/li&gt;
&lt;li&gt;Pressure for growth: Investor expectations could influence priorities, possibly resulting in feature bloat or shifting direction&lt;/li&gt;
&lt;li&gt;Market competition: PostHog is moving into territory occupied by major players like Amplitude, Adobe, and Segment&lt;/li&gt;
&lt;li&gt;Self-hosting demands: Deploying advanced features (like ClickHouse) may require significant technical resources, which could add cost and complexity for smaller teams&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Long-term Considerations
&lt;/h2&gt;

&lt;p&gt;PostHog has the momentum and community to potentially become a leading “customer infrastructure” platform through its product-led growth strategy. However, the risks associated with rapid expansion and the need to maintain a coherent user experience will be key factors to watch as the company scales.&lt;/p&gt;




&lt;h2&gt;
  
  
  UXWizz: Focused, Self-Hosted, and Privacy-Conscious
&lt;/h2&gt;

&lt;p&gt;For teams seeking an alternative that is simple, privacy-focused, and fully under their control, UXWizz presents a different value proposition:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data is stored entirely on the user’s own MySQL/MariaDB server, no external cloud dependencies&lt;/li&gt;
&lt;li&gt;Designed and built in the EU, with focus on self-hosting and data ownership&lt;/li&gt;
&lt;li&gt;Completely bootstrapped business model with emphasis on sustainability and product&lt;/li&gt;
&lt;li&gt;Lightweight: UXWizz can run on affordable hosting (e.g., a standard VPS or cPanel), with low resource requirements&lt;/li&gt;
&lt;li&gt;Built by a developer with a competitve programming background, emphasizing clarity, user experience, and actionable analytics (heatmaps, funnels, sessions)&lt;/li&gt;
&lt;li&gt;Direct premium support from the creator for a more personalized experience&lt;/li&gt;
&lt;li&gt;Simple, flexible integration with popular tools such as Zapier and n8n with the MySQL connectors, and straightforward installation with Docker or scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organizations seeking a straightforward analytics tool that also provides all the insights needed&lt;/li&gt;
&lt;li&gt;Teams prioritizing self-hosting, data ownership and avoiding vendor lock-in&lt;/li&gt;
&lt;li&gt;Those who prefer a lean experience without pressure to adopt frequent new features&lt;/li&gt;
&lt;li&gt;Anyone valuing predictable, customer-driven product development over VC-fueled rapid growth&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Decide: PostHog or UXWizz?
&lt;/h2&gt;

&lt;p&gt;Both PostHog and UXWizz are strong tools, but which one is best for you depends on your requirements:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consider PostHog if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need a highly scalable, all-in-one analytics and experimentation platform&lt;/li&gt;
&lt;li&gt;You are comfortable with sophisticated infrastructure and want rapid feature development&lt;/li&gt;
&lt;li&gt;Your organization values the latest innovations in analytics and AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Consider UXWizz if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want a focused, easy-to-manage analytics solution&lt;/li&gt;
&lt;li&gt;Privacy, data control, and compliance (especially within the EU) are top concerns&lt;/li&gt;
&lt;li&gt;You favor a sustainable product with direct support and minimal overhead&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;PostHog’s $70 million Series D funding, announced on June 9th, 2025, is a major milestone in web analytics, especially for teams seeking extensive analytics capabilities and experimentation tools as they scale. However, not all organizations need or want the complexities accompanying such rapid growth. For those who care most about privacy, simplicity, and self-hosted control, UXWizz stands out as a strong alternative.&lt;/p&gt;

&lt;p&gt;Today’s web analytics landscape offers more choice than ever, making it easier to select a solution that matches your organization’s approach to data, privacy, and growth.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further reading:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://posthog.com/blog/series-d" rel="noopener noreferrer"&gt;PostHog Series D Announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uxwizz.com/" rel="noopener noreferrer"&gt;UXWizz Official Site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>analytics</category>
      <category>bootstrap</category>
      <category>ai</category>
    </item>
    <item>
      <title>Microsoft Clarity's New Cookie Consent Requirements</title>
      <dc:creator>Cristian</dc:creator>
      <pubDate>Mon, 23 Dec 2024 16:04:34 +0000</pubDate>
      <link>https://forem.com/xcs/microsoft-claritys-new-cookie-consent-requirements-57f2</link>
      <guid>https://forem.com/xcs/microsoft-claritys-new-cookie-consent-requirements-57f2</guid>
      <description>&lt;p&gt;On December 18th, Microsoft shared an important update about Clarity. By early 2025, websites using Clarity in the EEA, UK, and Switzerland will need to collect explicit user consent before placing cookies. This change is required to comply with local privacy regulations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The email
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmrp2symtbimkvzo8jsrt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmrp2symtbimkvzo8jsrt.png" alt="Clarity Cookie Consent Requirements Announcement" width="800" height="788"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What do you need to do?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Action Required&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You must integrate the &lt;a href="https://learn.microsoft.com/en-us/clarity/setup-and-installation/cookie-consent" rel="noreferrer nofollow noopener"&gt;Clarity Consent API&lt;/a&gt; to collect/manage user consent for sessions in these regions.&lt;/li&gt;
&lt;li&gt;Without explicit consent, Clarity features like session recordings and funnel tracking won't work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rollout Timeline&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft will enforce this requirement in early 2025. It's a good idea to start making updates soon.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;For technical details, visit the &lt;a href="https://learn.microsoft.com/en-us/clarity/setup-and-installation/clarity-api" rel="noreferrer nofollow noopener"&gt;Clarity Client API Documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you need help, contact Clarity's support team at &lt;a href="mailto:clarityms@microsoft.com"&gt;clarityms@microsoft.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Privacy laws are evolving quickly, and this change could be the first of many.&lt;br&gt;&lt;br&gt;
Self-hosted tools and data ownership might become the better choice for compliance in the future.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Self-Hosted Microsoft Clarity Alternative
&lt;/h2&gt;

&lt;p&gt;I'm working on a self-hosted alternative called &lt;strong&gt;&lt;a href="https://uxwizz.com/?ref=devtoclarity" rel="noopener noreferrer"&gt;UXWizz&lt;/a&gt;&lt;/strong&gt;. It's cookie-less, private, and gives you full control of your data.&lt;br&gt;&lt;br&gt;
This way, you don't need to rely on third-party cookies, simplifying privacy-law compliance.&lt;br&gt;&lt;br&gt;
You can get heatmaps and session recordings while keeping the data private, on your own server.&lt;br&gt;&lt;br&gt;
It's better for both your business and your visitors to not share stats and private data with another service/company.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I got $2500 from a single software license</title>
      <dc:creator>Cristian</dc:creator>
      <pubDate>Fri, 31 May 2024 23:03:14 +0000</pubDate>
      <link>https://forem.com/xcs/how-i-got-2500-from-a-single-software-license-228n</link>
      <guid>https://forem.com/xcs/how-i-got-2500-from-a-single-software-license-228n</guid>
      <description>&lt;p&gt;🥳 Landed a BIG client! Here's how I got $2500 from a single software license.&lt;/p&gt;

&lt;p&gt;They already had a lower-tier, Company license. They purchased it during last year's Black Friday sale for around $190.&lt;/p&gt;

&lt;p&gt;After using the product internally for the last 6 months, they realized that their clients could also get value out of using it.&lt;/p&gt;

&lt;p&gt;When they emailed me asking about the migration process from Company to Agency, it was close to midnight. But I knew that the sooner I responded, the higher the chances that they would buy. I quickly replied, asking for their license key, for verification purposes (I did this mostly to gain time). Then, I got an idea. I had to show that the migration process will be easy and smooth.&lt;/p&gt;

&lt;p&gt;I started coding. And coded I did... I coded from midnight until 6AM in the morning. After improving the migration system (and also enabling a feature to easily switch from a single to a multi-database setup, which they were interested in), I sent them a discount coupon for the amount they have already paid ($180). I made sure to mention the work I did to ease their migration process. &lt;/p&gt;

&lt;p&gt;After a few hours, I got another email. This time, it was from Paddle: they purchased. The final price, including the discount, was $2310. I think they would have purchased at full price too, but I believe it's only fair to just pay for the difference.&lt;/p&gt;

&lt;p&gt;$2310 is a considerable amount for an indie-hacker like me, as it covers rent and expenses for a month. This is not the whole story, though. I learned something more. Last month, I increased the prices to better match the value of the product. I was afraid that the new, higher prices, will scare away potential customers. It turns out, it didn't.&lt;/p&gt;

&lt;p&gt;My takeaways from this story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responding quickly to sales and support inquiries makes a BIG difference.&lt;/li&gt;
&lt;li&gt;Always provide proof to the customer that they will be well taken care of. With your actions, not with words.&lt;/li&gt;
&lt;li&gt;The pricing doesn't matter as much as you would think if your product is good and does bring value to customers. Offer higher quality and price higher instead of joining the race to the bottom.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>startup</category>
      <category>sales</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>We joined HackerNoon's Startup of 2023</title>
      <dc:creator>Cristian</dc:creator>
      <pubDate>Thu, 29 Jun 2023 14:56:46 +0000</pubDate>
      <link>https://forem.com/xcs/we-joined-hackernoons-startup-of-2023-43ph</link>
      <guid>https://forem.com/xcs/we-joined-hackernoons-startup-of-2023-43ph</guid>
      <description>&lt;p&gt;UXWizz has been nominated in HackerNoon's annual Startup of the Year awards in Craiova, Romania.&lt;/p&gt;

&lt;p&gt;Please vote for us here: &lt;a href="https://hackernoon.com/startups/europe/europe-craiova-dolj-county-romania"&gt;https://hackernoon.com/startups/europe/europe-craiova-dolj-county-romania&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Read more about us below to understand why we deserve your vote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet UXWizz
&lt;/h2&gt;

&lt;p&gt;UXWizz is a self-hosted website analytics platform that helps you improve all your websites without sharing your data or your visitors’ data with any 3rd party.&lt;/p&gt;

&lt;p&gt;UXWizz can be a complete, private, replacement for multiple platforms like Google Analytics, Hotjar, Google Optimize or Fullstory.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Role
&lt;/h3&gt;

&lt;p&gt;I am the founder and lead developer of UXWizz. I make sure the platform is always up-to-date and taking advantage of the latest technology improvements and browser features to provide a responsive, easy-to-use analytics dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We're Disrupting/Improving the Website Analytics Industry
&lt;/h2&gt;

&lt;p&gt;In the last few years, the new privacy laws have been a huge talking point across industries and any company that owns a website or digital asset had to look into it. The main problem that those laws try to solve is reducing or stopping the sharing of user private data between companies.&lt;/p&gt;

&lt;p&gt;UXWizz aims to solve this issue by providing a platform that is entirely in your control, where no data is sent to an external 3rd party analytics platform, that provides granular privacy controls, complete transparency and direct access to the data stored in your own MySQL database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Standing Out from The Crowd
&lt;/h2&gt;

&lt;p&gt;UXWizz is, as far as we know, the only premium analytics platform that is self-hosted-first and that has as the main goal the popularization of the self-hosted ecosystem and reducing external services and subscriptions being used.&lt;/p&gt;

&lt;p&gt;Other website analytics platforms monetize their cloud oferring, while open-sourcing their self-hosted option. This is a great model, but has a major flow: their business monetization model directly competes with the goal of making self-hosting easier. In other words, the easier the self-hosted version is to setup and maintain, the less money they would make. Because of this, most platforms using this pricing model only release older versions or feature-locked versions of the product as the self-hosted oferring or use a complicated stack that is hard to setup or maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Predictions/Thoughts on the Website Analytics Industry in 2023
&lt;/h2&gt;

&lt;p&gt;As more and more privacy laws are being issued and regulations are getting stricter, our prediction is that most companies that care about data privacy and respecting the laws will start moving away from 3rd party analytics to self-hosted analytics, where all the data remains in their control.&lt;/p&gt;

&lt;p&gt;Because of this, we predict that the self-hosted ecosystem will grow considerably in 2023 and 2024.&lt;/p&gt;

&lt;h2&gt;
  
  
  What word defines the state of Website Analytics in 2023?
&lt;/h2&gt;

&lt;p&gt;Change.&lt;/p&gt;

&lt;p&gt;This is not a prediction, change is already happening. Google Analytics has just enforced their new &lt;a href="https://support.google.com/analytics/answer/10089681?hl=en"&gt;GA4 tracking method&lt;/a&gt;, which very few of their users seem to be willing to adapt to and which is required since July 1, 2023.&lt;/p&gt;

&lt;p&gt;More and more “privacy-friendly” analytics platforms are released that do not use cookies and don’t store any private user information.&lt;/p&gt;

&lt;p&gt;There is not a clear monopoly in the website analytics space anymore, since people are moving away from the consecrated Google Analytics. Now it’s the time for a new era of website analytics to begin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we decided to participate in HackerNoon's Startup of the Year awards
&lt;/h2&gt;

&lt;p&gt;Awards are a simple way in which customers can decide whether a product is worthy of trying out. By winning an award, UXWizz will establish itself as a top product in the website analytics space, one for which  the customers should at least consider checking out the &lt;a href="https://www.uxwizz.com/trial?ref=hnpost"&gt;100% free trial&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;We are ready to change the website analytics ecosystem in 2023 and lead the way in the switch to a cheaper, more private and independent way of running all the services a digital business needs.&lt;/p&gt;

&lt;p&gt;Vote for us today! &lt;a href="https://hackernoon.com/startups/europe/europe-craiova-dolj-county-romania"&gt;https://hackernoon.com/startups/europe/europe-craiova-dolj-county-romania&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>php</category>
      <category>privacy</category>
      <category>startup</category>
    </item>
    <item>
      <title>Prevent others sending emails using your domain name</title>
      <dc:creator>Cristian</dc:creator>
      <pubDate>Mon, 12 Apr 2021 15:49:44 +0000</pubDate>
      <link>https://forem.com/xcs/prevent-others-sending-emails-using-your-domain-name-9en</link>
      <guid>https://forem.com/xcs/prevent-others-sending-emails-using-your-domain-name-9en</guid>
      <description>&lt;h1&gt;
  
  
  Prevent others sending emails using your domain name
&lt;/h1&gt;

&lt;p&gt;Yesterday a user contacted me on &lt;a href="https://twitter.com/XCSme" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; saying that she has received a scam email sent from an email address originating from my domain, &lt;a href="https://www.usertrack.net" rel="noopener noreferrer"&gt;usertrack.net&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You might know that anyone can set &lt;strong&gt;any address&lt;/strong&gt; in the "&lt;strong&gt;from&lt;/strong&gt;" field when sending an email. I thought there was nothing I could do about it, but upon looking deeper into it I realized that some of my email settings were wrong, which might allow attackers to send &lt;a href="https://en.wikipedia.org/wiki/Spoofing_attack" rel="noopener noreferrer"&gt;spoofed&lt;/a&gt; emails on my behalf.&lt;/p&gt;

&lt;p&gt;I did have &lt;strong&gt;DMARC&lt;/strong&gt; setup, but my &lt;strong&gt;SPF&lt;/strong&gt; and &lt;strong&gt;DKIM&lt;/strong&gt; records were invalid.&lt;/p&gt;

&lt;p&gt;After looking into it, I realized that there's a lot more to learn about it than I thought, so here's a summary of what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  What should you do? Correctly setup DMARC!
&lt;/h2&gt;

&lt;p&gt;There are some email security policies that can be set at the &lt;strong&gt;DNS&lt;/strong&gt; level. You can specifically allow only some IP addresses (usually your email server) or domains to send emails on your domain's behalf.&lt;/p&gt;

&lt;p&gt;I do think those policies are mostly just a suggestion that tells other email servers and email clients to mark an email as spam or not send it if the authentication checks are failing. That being said, most popular email clients should do a pretty good job of blocking emails that don't respect those policies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add those email policies to your DNS TXT records
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;DMARC&lt;/strong&gt;, &lt;strong&gt;SPF&lt;/strong&gt; and &lt;strong&gt;DKIM&lt;/strong&gt; policies.&lt;/p&gt;

&lt;h3&gt;
  
  
  DMARC
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Domain-based Message Authentication, Reporting and Conformance
&lt;/h4&gt;

&lt;p&gt;Useful for receiving reports about who is sending emails using your domain name. This also enables you to specify what to do with the emails that are not originating from allowed sources (do nothing, flag them, or reject them).&lt;/p&gt;

&lt;p&gt;Here is what DNS record I had added:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TXT record&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Name: &lt;strong&gt;_dmarc&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DMARC1; p=reject; rua=mailto:reports@usertrack.net;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;v = &lt;strong&gt;Version&lt;/strong&gt; - should be DMARC1&lt;/li&gt;
&lt;li&gt;p = &lt;strong&gt;Policy&lt;/strong&gt; - can be &lt;strong&gt;none&lt;/strong&gt;, &lt;strong&gt;quarantine&lt;/strong&gt; and &lt;strong&gt;reject&lt;/strong&gt;.
Reject is recommended once you know your other policies are setup correctly, so the spoofed email won't be delivered.&lt;/li&gt;
&lt;li&gt;rua = &lt;strong&gt;Reporting URI(s) for aggregate data&lt;/strong&gt; - Where to send reports that mail services generate about who tried to send emails from your domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SPF
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Sender Policy Framework
&lt;/h4&gt;

&lt;p&gt;With SPF you can say who is allowed to send emails using your domain name. This is the value I used:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TXT record&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Name: &lt;strong&gt;@&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 +mx +ip4:123.456.78.19 +include:websitewelcome.com +include:servers.mcsv.net -all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v&lt;/strong&gt; = Version - should be spf1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;+mx&lt;/strong&gt; = Allow emails for all domains mentioned in the MX records of this domain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;+ip4:123.456.78.19&lt;/strong&gt; = Allow emails sent from this IP address (this was the address of my mail server, hosted on HostGator)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;+include:websitewelcome.com&lt;/strong&gt; = Allow emails sent from this domain (it's the mail server domain of HostGator)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;+include:servers.mcsv.net&lt;/strong&gt; = MailChimp, I use them to send newsletters from &lt;a href="mailto:someemail@usertrack.net"&gt;someemail@usertrack.net&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;-all&lt;/strong&gt; = If none of the previous rules are met, deny all other emails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All those rules are tested left to right, and &lt;strong&gt;"+"&lt;/strong&gt; means allow, &lt;strong&gt;"-"&lt;/strong&gt; means reject and there is also &lt;strong&gt;"~"&lt;/strong&gt; which is like a soft reject (maybe mark as spam or something like that).&lt;/p&gt;

&lt;h3&gt;
  
  
  DKIM
&lt;/h3&gt;

&lt;h4&gt;
  
  
  DomainKeys Identified Mail
&lt;/h4&gt;

&lt;p&gt;Using DKIM all emails sent will be digitally signed using a private key and the DNS record provides a public key to test if the emails are correctly signed. If there is a missmatch, the DKIM policy will fail, and the email won't be sent or marked as spam.&lt;/p&gt;

&lt;p&gt;My &lt;strong&gt;DKIM&lt;/strong&gt; record looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TXT record&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Name: &lt;strong&gt;default._domainkey&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0B...very long key...AB\;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v&lt;/strong&gt; = Version - should be DKIM1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;k&lt;/strong&gt; = Key type - encryption algorithm used&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;p&lt;/strong&gt; = Public key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I got my DKIM TXT record value from &lt;strong&gt;Hostgator -&amp;gt; cPanel -&amp;gt; Email Authentication&lt;/strong&gt; (my email server provider), but I had some issues making it valid as their TXT record had a limited number of characters and showed my public key (p=...) as two distinct strings that I had to manually remove the quotes around and merge (concatenate) them together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some tools that I used
&lt;/h2&gt;

&lt;p&gt;To test if the policies are correct, the tools I found more useful are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MXToolBox - Email Deliverability&lt;/strong&gt; - &lt;a href="https://mxtoolbox.com/deliverability" rel="noopener noreferrer"&gt;mxtoolbox.com/deliverability&lt;/a&gt;
This allows you to test if your DMARC policies are correct&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MailTester - SPF and DKIM Checker&lt;/strong&gt; - &lt;a href="https://www.mail-tester.com/spf-dkim-check" rel="noopener noreferrer"&gt;mail-tester.com/spf-dkim-check&lt;/a&gt;
Quickly test if your SPF and DKIM records are valid strings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FQlvusIn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FQlvusIn.png" alt="dmarc dkim spf policies"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope that by fixing my email authentication on my domains it will be a lot less likely for phishing emails to be sent using my domain names.&lt;/p&gt;

&lt;p&gt;I hope you found this post useful. I tried to make this as concise as possible and provide examples, as I spent several hours trying to understand all those policies and how to set them up, having a hard time finding a TL:DR; on how to quickly setting up email authentication.&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I learned programming</title>
      <dc:creator>Cristian</dc:creator>
      <pubDate>Mon, 11 May 2020 01:46:31 +0000</pubDate>
      <link>https://forem.com/xcs/how-i-learned-programming-1f18</link>
      <guid>https://forem.com/xcs/how-i-learned-programming-1f18</guid>
      <description>&lt;p&gt;Disclaimer: I am 26 years old with a strong passion for programming since a young age. This is more about my journey than only programming.&lt;/p&gt;

&lt;p&gt;I had no computer at home, but there was something about computers that I always felt a drive towards.&lt;/p&gt;

&lt;p&gt;My first contact with programming that I remember was when I was in 2nd or 3rd grade and there was a computer course at school where I learned some shell commands to create a guess-the-number game.  I also remember finding a book about working in MS Word, I had no idea what it meant but I liked looking at the images of their UI in the book.&lt;/p&gt;

&lt;p&gt;I always loved creating stuff, I created some games in GameMaker, added fancy JavaScript code to my &lt;a href="https://en.wikipedia.org/wiki/Piczo"&gt;Piczo&lt;/a&gt; profile (if anyone used it, it was like a personal page where you could post photos/content, it was then overhyped by hi5), all this before I started actually learning programming.&lt;/p&gt;

&lt;p&gt;I started learning "real" programming while in high-school, in 2008 at 14 years old as I joined a math-informatics specialized class. I also decided to participate in the regional Informatics Olympiad. This meant that I also had to prepare for it. I solved several algorithmic problems per week (in C or C++). I also participated in non-algorithmic contents such as a game-development competitions, code-golf competitions and, most relevant the present day, web development competitions.&lt;/p&gt;

&lt;p&gt;After high-school I applied to MIT, but (not surprisingly), I didn't get in. I decided to go to the local university in my home-town (Craiova, Romania) on a computer-science degree. This meant I had more time for personal projects. During university I also joined programming competitions, created websites for various local businesses and tried creating several web projects/platforms. Although most of the platform ideas were nice and the implementation was good, none of them took off as I lacked the skills and time to market and maintain them. Apart from one: &lt;a href="https://www.usertrack.net/"&gt;userTrack&lt;/a&gt;. I somehow got the idea to create a heatmap &amp;amp; session-recording tool for websites and started implementing it on 30th of December 2012. That’s right, on New Year’s Eve 🎉 and 1st of January 2013 I was programming. I have Mercurial versioning to prove it:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yFwJ7sRZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.snipboard.io/yzUVNx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yFwJ7sRZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.snipboard.io/yzUVNx.jpg" alt="versioning" width="800" height="137"&gt;&lt;/a&gt;&lt;br&gt;
I posted userTrack on the &lt;a href="https://1.envato.market/XMRob"&gt;CodeCanyon marketplace&lt;/a&gt; and over the years I always maintained it and kept improving it, as clients would keep on buying it without any marketing from my part and their good reviews and feature requests kept me motivated to keep working on it. Until today, in 7 years, it sold for about $65k, which is around $8k/year.&lt;/p&gt;

&lt;p&gt;When I finished university I already knew programming and software engineering pretty well and felt like I could create any application I could imagine.&lt;/p&gt;

&lt;p&gt;Some quick after-university (2016-2020) facts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I was contacted by a Google recruiter and went through 14 interviews at Google (2 x phone interviews, 2 x 5 on-site interviews, 2 x extra phone interviews), but for both applications (one when I was contacted, one a year later when I applied) I got rejected in the very final stages of the process with no clear explanation why. 😢&lt;/li&gt;
&lt;li&gt;I created my own LLC so I could focus more on userTrack, freelancing and pay taxes as I should.&lt;/li&gt;
&lt;li&gt;In August 2017 I joined a really cool, small indie gaming company in Amsterdam and worked on &lt;a href="https://curvefever.pro"&gt;https://curvefever.pro&lt;/a&gt; . Even though we did make a really cool game, we couldn’t monetize it well enough so the company went bankrupt in October 2019.&lt;/li&gt;
&lt;li&gt;Since then I started working full-time on userTrack and released a number of big updates, while now I’m switching focus towards marketing. If you have a landing page and want to improve conversion rates or just want to replace Google Analytics or Hotjar, you can check it out at &lt;a href="https://www.usertrack.net/"&gt;www.usertrack.net&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don’t recall the exact moment I “learned” programming. I always loved building stuff. If I didn’t know how to make something, I would just try random stuff until it worked or searched for solutions, but I always persevered until I created what I imagined. Programming is just a tool.&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>programming</category>
      <category>motivation</category>
    </item>
    <item>
      <title>I created my own static PHP blogging platform</title>
      <dc:creator>Cristian</dc:creator>
      <pubDate>Wed, 22 Apr 2020 15:22:24 +0000</pubDate>
      <link>https://forem.com/xcs/i-created-my-own-static-php-blogging-platform-4o6m</link>
      <guid>https://forem.com/xcs/i-created-my-own-static-php-blogging-platform-4o6m</guid>
      <description>&lt;p&gt;TL;DR:  &lt;a href="https://github.com/Cristy94/markdown-blog"&gt;https://github.com/Cristy94/markdown-blog&lt;/a&gt; &lt;br&gt;
&lt;a href="https://usertrack.net/blog"&gt;Demo here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it all started
&lt;/h2&gt;

&lt;p&gt;A few days ago I asked for suggestions: &lt;a href="https://www.indiehackers.com/post/is-there-any-tool-to-create-static-blog-posts-0e88ebc949"&gt;"Is there any tool to create static blog posts?"&lt;/a&gt; on how could I easily add blog-like content to an existing site.&lt;/p&gt;

&lt;p&gt;Although most of the suggestions were great, almost all were &lt;strong&gt;too complex&lt;/strong&gt; for my needs. I didn't want to start using a 3rd party service to host my blog or to learn and add extra tools and build-steps that would still not allow me to easily create content.&lt;/p&gt;

&lt;p&gt;I came up with a solution inspired by &lt;a class="mentioned-user" href="https://dev.to/haltakov"&gt;@haltakov&lt;/a&gt; (he suggested to simply write markdown and preview it in the code editor) and &lt;a class="mentioned-user" href="https://dev.to/robenkleene"&gt;@robenkleene&lt;/a&gt; (he suggested to parse the markdown files directly in PHP, thus removing a build step).&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;I am really happy with the solution, it's really, really &lt;strong&gt;simple&lt;/strong&gt; but it works very well for my use-case (integrate a blog into an existing PHP site).&lt;br&gt;
The solution came by combining several suggestions received in the post mentioned above with some of my own ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write blog posts in Markdown.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://code.visualstudio.com/docs/languages/markdown"&gt;Preview Markdown while typing directly in VSCode&lt;/a&gt;.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PgkkfAQs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://code.visualstudio.com/assets/docs/languages/Markdown/preview-scroll-sync.gif" alt="vscode-image-preview" width="640" height="311"&gt;
&lt;/li&gt;
&lt;li&gt;Use a PHP Markdown parsing library to load the &lt;code&gt;.md&lt;/code&gt; files on the fly. I used &lt;a href="https://github.com/erusev/parsedown"&gt;Parsedown&lt;/a&gt;. This means that no database is needed, there is no build step and you can easily version posts using git.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;.htaccess&lt;/code&gt; rewrites for nice blog post URLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;You can see a usage &lt;a href="https://usertrack.net/blog"&gt;demo here&lt;/a&gt; (the blog is integrated into an existing site).&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, but it uses PHP, why do you call it "static"?
&lt;/h2&gt;

&lt;p&gt;You are right! It's not static as in plain HTML is hosted on the server.&lt;br&gt;
But if you think about it, even a plain HTML site is hosted on a server which dynamically responds to HTTP requests.&lt;/p&gt;

&lt;p&gt;I personally still consider it to be "static" because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I use &lt;strong&gt;Cloudflare&lt;/strong&gt; on top of it with &lt;em&gt;cache everything&lt;/em&gt; option, so requests do not reach my server, Cloudflare always responds with plain HTML/CSS, without executing the dynamic PHP code that processes the markdown.&lt;/li&gt;
&lt;li&gt;The servers that the client reaches are the Cloudflare servers, where the static assets are indeed served directly as-is.&lt;/li&gt;
&lt;li&gt;Content is written in a static file and doesn't change between requests.&lt;/li&gt;
&lt;li&gt;There is no database or content generated based on dynamic data (the only dynamic part is the URL, but it always points to the file name, the same as with static sites).&lt;/li&gt;
&lt;li&gt;There is no build step. If it's needed you can easily add a build step that simply saves the generated HTML output, thus making it truly satic. But now Cloudflare is already doing this.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What exactly makes a website "static"?&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I can now create new blog posts by simply writing a new &lt;code&gt;.md&lt;/code&gt; and I also have a nice preview while typing them.&lt;/p&gt;

&lt;p&gt;I now just have to start creating the content! 😅&lt;/p&gt;

&lt;p&gt;Let me know if you have any comments/suggestions.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>php</category>
      <category>webdev</category>
      <category>blog</category>
    </item>
  </channel>
</rss>
