<?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: Daniel Habib</title>
    <description>The latest articles on DEV Community by Daniel Habib (@danielhabib).</description>
    <link>https://dev.to/danielhabib</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%2F621910%2F8e28328f-c289-49f3-b70d-3fd7d484d9fa.png</url>
      <title>DEV Community: Daniel Habib</title>
      <link>https://dev.to/danielhabib</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielhabib"/>
    <language>en</language>
    <item>
      <title>I hate black bars on video. So we're killing them for good.</title>
      <dc:creator>Daniel Habib</dc:creator>
      <pubDate>Fri, 26 Jun 2026 19:25:54 +0000</pubDate>
      <link>https://dev.to/danielhabib/i-hate-black-bars-on-video-so-were-killing-them-for-good-3507</link>
      <guid>https://dev.to/danielhabib/i-hate-black-bars-on-video-so-were-killing-them-for-good-3507</guid>
      <description>&lt;p&gt;Today, you can only shoot video for one screen at a time.&lt;/p&gt;

&lt;p&gt;Go landscape and it won't fit a phone. Go vertical and it looks awful on a laptop. And without a super specialized lens, forget about the big screen.&lt;/p&gt;

&lt;p&gt;We've all seen the black bars you slap around a video to force it into a new aspect ratio. I hate them with a passion. My favorite movie, Lord of the Rings, was shot in 2.39:1. It doesn't fit a single TV out there.&lt;/p&gt;

&lt;p&gt;So we're on a mission to end black bars for good. Every video should fit every screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Today we're launching Ad Reframe
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://outpaint.com/ad-reframe" rel="noopener noreferrer"&gt;Ad Reframe&lt;/a&gt; turns winning vertical UGC ads (9:16) into CTV ready placements (16:9). Send us your UGC ad and get back a TV and desktop ready version within days.&lt;/p&gt;

&lt;p&gt;Advertisers test endlessly to find a winning UGC video, then want to squeeze every bit of value out of it, including running it on TV. But today, going from vertical to horizontal for the big screen leaves you with one of two bad options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pillarboxing: black bars on either side of the frame&lt;/li&gt;
&lt;li&gt;Side blur: a smeared, stretched copy of the video filling the gap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both scream "this was not made for this screen."&lt;/p&gt;

&lt;h2&gt;
  
  
  What outpainting does instead
&lt;/h2&gt;

&lt;p&gt;Instead of hiding the gap, we fill it. We generate new content where the black bars used to be, matched to the motion, lighting, and subject of the original, so the frame looks like it was shot natively for the screen it's playing on.&lt;/p&gt;

&lt;p&gt;In our &lt;a href="https://outpaint.com/case-studies/ctv-format-test" rel="noopener noreferrer"&gt;CTV format test&lt;/a&gt;, outpainting won on everything advertisers measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engagement: skip rate falls to 17%, the lowest we tested&lt;/li&gt;
&lt;li&gt;Quality: 55% say it looks professionally produced, versus under 40% for the alternatives&lt;/li&gt;
&lt;li&gt;Brand lift: consideration at 51%, favorability at 58%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Filling the screen with real content beats hiding the gap behind bars or blur.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;We generate net new content where the black bars used to be, then keep it temporally consistent across every frame so nothing flickers or drifts. It is format agnostic by design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any aspect ratio, not just 9:16 to 16:9&lt;/li&gt;
&lt;li&gt;Resolutions up to 8K&lt;/li&gt;
&lt;li&gt;Any frame rate&lt;/li&gt;
&lt;li&gt;Any color space&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So whether it lands on a phone, a laptop, or a connected TV, the output looks like it was made for that screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on your own video
&lt;/h2&gt;

&lt;p&gt;Send us a video you want reframed and we'll send back a free sample so you can see it for yourself. We'd love to hear what you think.&lt;/p&gt;

&lt;p&gt;See Ad Reframe: &lt;a href="https://outpaint.com/ad-reframe" rel="noopener noreferrer"&gt;https://outpaint.com/ad-reframe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grab 15 minutes with me: &lt;a href="https://cal.com/daniel-habib/15min" rel="noopener noreferrer"&gt;https://cal.com/daniel-habib/15min&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're on a mission to end black bars for good. Every video should fit every screen.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>startup</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Create a Simple Splat Video with spatialstudio</title>
      <dc:creator>Daniel Habib</dc:creator>
      <pubDate>Mon, 18 Aug 2025 19:56:25 +0000</pubDate>
      <link>https://dev.to/danielhabib/create-a-simple-splat-video-with-spatialstudio-32an</link>
      <guid>https://dev.to/danielhabib/create-a-simple-splat-video-with-spatialstudio-32an</guid>
      <description>&lt;p&gt;This tutorial assumes you have a basic understanding of Python. If anything is unclear, feel free to ask in the comments below!&lt;/p&gt;

&lt;h2&gt;
  
  
  Install spatialstudio
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;spatialstudio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This library offers low‑level utilities that help you easily create &lt;strong&gt;splat videos&lt;/strong&gt;—3D videos you can walk around in. These videos use the &lt;code&gt;.splv&lt;/code&gt; file format, short for &lt;code&gt;SPatiaLVideo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In this guide, we'll build a simple splat video that displays a cube toggling between red and blue every second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initialize the encoder (&lt;code&gt;main.py&lt;/code&gt;)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;spatialstudio&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;splv&lt;/span&gt;

&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;splv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Encoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;framerate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;outputPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;color_cube.splv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;We define the resolution of our 3D video—think of it like going from 1080p to 8p, but in 3D.&lt;/li&gt;
&lt;li&gt;Then, we create the &lt;strong&gt;encoder&lt;/strong&gt;, which collects frames, compresses them, and writes them to a &lt;code&gt;.splv&lt;/code&gt; file. We also specify the framerate here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create the frames
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;frame_total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;  
&lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;blue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;frame_index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_total&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;splv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;voxel_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;frame_index&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;blue&lt;/span&gt;
    &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_voxel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;voxel_color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s what’s happening:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;frame_total&lt;/strong&gt;: Total number of frames we’ll generate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;red&lt;/strong&gt; and &lt;strong&gt;blue&lt;/strong&gt;: RGB tuples defining the colors.&lt;/li&gt;
&lt;li&gt;Inside the loop:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;We create an empty &lt;code&gt;Frame&lt;/code&gt; (3D grid).&lt;/li&gt;
&lt;li&gt;Pick red or blue depending on whether the frame index is even or odd.&lt;/li&gt;
&lt;li&gt;Set a single voxel at &lt;code&gt;(4, 4, 4)&lt;/code&gt; to that color.&lt;/li&gt;
&lt;li&gt;Encode the frame with &lt;code&gt;encoder.encode(frame)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re free to populate more voxels per frame as desired!&lt;/p&gt;

&lt;h2&gt;
  
  
  Finish encoding and write to disk
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finish&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This final step tells the encoder to compress all collected frames and write the &lt;code&gt;.splv&lt;/code&gt; file. You’ll end up with &lt;code&gt;color_cube.splv&lt;/code&gt; in your working directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preview your splv file
&lt;/h2&gt;

&lt;p&gt;Use the free browser‑based preview tool—no login required:&lt;br&gt;
&lt;a href="https://splats.com/preview" rel="noopener noreferrer"&gt;https://splats.com/preview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run into issues, drop a comment below or hop into our Discord!&lt;/p&gt;

&lt;p&gt;Can’t wait to see your 3D creations—share them on the subreddit or Discord!&lt;/p&gt;

&lt;h2&gt;
  
  
  Full code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;spatialstudio&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;splv&lt;/span&gt;

&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;splv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Encoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;framerate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outputPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;color_cube.splv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;frame_total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;  
&lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;blue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;frame_index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame_total&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;splv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;voxel_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;frame_index&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;blue&lt;/span&gt;
    &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_voxel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;voxel_color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finish&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Created color-changing voxel animation: color_cube.splv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Formatting Notes for dev.to
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Posts on dev.to use &lt;strong&gt;Jekyll front matter&lt;/strong&gt;, enclosed in triple dashes (&lt;code&gt;---&lt;/code&gt;) at the top (&lt;a href="https://dev.to/p/editor_guide?utm_source=chatgpt.com"&gt;dev.to&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Use fenced code blocks with three backticks, and specify the language (like &lt;code&gt;python&lt;/code&gt; or &lt;code&gt;bash&lt;/code&gt;) for syntax highlighting (&lt;a href="https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-and-highlighting-code-blocks?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.github.com&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Including a blank line before and after code blocks helps readability (&lt;a href="https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/creating-and-highlighting-code-blocks?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;docs.github.com&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know if you'd like to adjust anything or add visuals, diagrams, or links!&lt;/p&gt;

</description>
      <category>python</category>
      <category>3d</category>
      <category>tutorial</category>
      <category>spatialstudio</category>
    </item>
    <item>
      <title>Splashgen: Create splash pages in less than 20 lines of python for free. </title>
      <dc:creator>Daniel Habib</dc:creator>
      <pubDate>Thu, 20 May 2021 17:28:29 +0000</pubDate>
      <link>https://dev.to/danielhabib/splashgen-create-splash-pages-in-less-than-20-lines-of-python-for-free-5dh7</link>
      <guid>https://dev.to/danielhabib/splashgen-create-splash-pages-in-less-than-20-lines-of-python-for-free-5dh7</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/true3dco/splashgen"&gt;Github package repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/true3dco/splashgen.sh-site"&gt;Github repo using Splashgen&lt;/a&gt;&lt;br&gt;
&lt;a href="https://splashgen.sh/"&gt;Example splash page&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What
&lt;/h2&gt;

&lt;p&gt;SplashGen is a free and open source project that lets you rapidly build simple splash pages as easily as you can build a simple command-line application.&lt;/p&gt;

&lt;h2&gt;
  
  
  How
&lt;/h2&gt;

&lt;p&gt;You write this:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ak9LwIHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/70rfs6o6t2d52c87435n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ak9LwIHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/70rfs6o6t2d52c87435n.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and get this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oyh3TyY7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yxv6csdwvuc3snh7ozlv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oyh3TyY7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yxv6csdwvuc3snh7ozlv.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;The main motivation behind this project is that backend developers don't like to write CSS, so I wanted to give them a way to get around that. When I was a backend engineer at FB we had a bunch of tools that let backend developers build UIs by leveraging predefined but flexible components without ever leaving PHP. When I left FB, I couldn't find anything similar, so I kicked off this project.&lt;/p&gt;

&lt;p&gt;While this isn't super compelling today,(we are just giving people a single splash page that they can go and create), we plan to add a ton of templates and eventually a component system. If you are looking to deploy a splash page that requires a template we don't currently have, let me know and I can spin it up for you super quickly.&lt;/p&gt;

&lt;p&gt;Any/all feedback is welcome :)&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>contributorswanted</category>
      <category>news</category>
      <category>python</category>
    </item>
  </channel>
</rss>
