Updates
This commit is contained in:
parent
07cf2aec06
commit
1fe29b8b1a
53 changed files with 651 additions and 161 deletions
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -93,7 +93,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>July 2, 2020</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 0" href="/tags/ethos">ethos</a>
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -93,7 +93,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>October 16, 2021</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 4" href="/tags/faith">faith</a>
|
||||
<a class="tag" style="--tagIndex: 0" href="/tags/ethos">ethos</a>
|
||||
</span>
|
||||
|
|
205
posts/ffmpeg-audio-cleanup/index.html
Normal file
205
posts/ffmpeg-audio-cleanup/index.html
Normal file
|
@ -0,0 +1,205 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
font-family: "Inter Variable";
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 100 900;
|
||||
src: url(/fonts/inter-latin-wght-normal.woff2)
|
||||
format("woff2-variations");
|
||||
unicode-range:
|
||||
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
|
||||
U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
|
||||
U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
} /* inter-latin-wght-italic */
|
||||
@font-face {
|
||||
font-family: "Inter Variable";
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
font-weight: 100 900;
|
||||
src: url(/fonts/inter-latin-wght-italic.woff2)
|
||||
format("woff2-variations");
|
||||
unicode-range:
|
||||
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
|
||||
U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
|
||||
U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
</style>
|
||||
<script
|
||||
defer
|
||||
src="https://stats.apps.seigler.net/script.js"
|
||||
data-website-id="ccb4bd94-2a71-47fe-8eea-d85bf75b7f6d"
|
||||
></script>
|
||||
<script defer src="/scripts/effects.js?v=d86d3b7642f1"></script>
|
||||
<link rel="me" href="https://github.com/seigler" />
|
||||
<link
|
||||
rel="webmention"
|
||||
href="https://webmention.io/joshua.seigler.net/webmention"
|
||||
/>
|
||||
<title>FFmpeg audio cleanup - joshua.seigler.net</title>
|
||||
<meta name="description" content="" />
|
||||
<meta name="keywords" content="posts, technical, ffmpeg" />
|
||||
<meta property="og:title" content="FFmpeg audio cleanup" />
|
||||
<meta property="og:type" content="" />
|
||||
<meta
|
||||
property="og:url"
|
||||
content="https://joshua.seigler.net/posts/ffmpeg-audio-cleanup/"
|
||||
/>
|
||||
<meta name="twitter:title" content="FFmpeg audio cleanup" />
|
||||
<meta name="twitter:description" content="" />
|
||||
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta name="generator" content="Eleventy v3.1.0" />
|
||||
</head>
|
||||
<body data-font="english" data-path="/posts/ffmpeg-audio-cleanup/">
|
||||
<script>
|
||||
const savedTheme = localStorage.getItem("theme");
|
||||
if (savedTheme != null) {
|
||||
document.body.setAttribute("data-theme", savedTheme);
|
||||
}
|
||||
</script>
|
||||
<header>
|
||||
<nav>
|
||||
<div class="nav-row">
|
||||
<div class="nav-home"><a href="/">joshua.seigler.net</a></div>
|
||||
</div>
|
||||
<div class="nav-categories">
|
||||
<a class="nav-active" href="/posts/">/posts</a>
|
||||
<a class="" href="/about/">/about</a>
|
||||
<a class="" href="/now/">/now</a>
|
||||
<a class="" href="/uses/">/uses</a>
|
||||
<a class="" href="/recipes/">/recipes</a>
|
||||
<a class="" href="/music/">/music</a>
|
||||
<a class="" href="/books/">/books</a>
|
||||
<a class="" href="/search/">/search</a>
|
||||
</div>
|
||||
</nav>
|
||||
<h1>FFmpeg audio cleanup</h1>
|
||||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>June 26, 2025</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 5" href="/tags/technical"
|
||||
>technical</a
|
||||
>
|
||||
<a class="tag" style="--tagIndex: 10" href="/tags/ffmpeg">ffmpeg</a>
|
||||
</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<header class="toc"></header>
|
||||
|
||||
<main data-pagefind-body="data-pagefind-body">
|
||||
<p>
|
||||
I recently needed to process 20+ phone audio recordings. The audio is
|
||||
mp3 recordings in stereo, made in an environment with echoes and noise
|
||||
from fans/heaters.
|
||||
</p>
|
||||
<p>
|
||||
Although I could do it easily with
|
||||
<a href="https://tenacityaudio.org/" target="_blank" rel="noopener"
|
||||
>Tenacity</a
|
||||
>
|
||||
I didn’t want to use a manual process, since it would take days. So I
|
||||
tried using FFmpeg filters and Bash scripting.
|
||||
</p>
|
||||
<p>
|
||||
I found an FFmpeg filter called
|
||||
<a
|
||||
href="https://ffmpeg.org/ffmpeg-filters.html#compand"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>compand</a
|
||||
>
|
||||
which lets you map an input decibel range to an output decibel range. I
|
||||
also used the
|
||||
<a
|
||||
href="https://ffmpeg.org/ffmpeg-filters.html#anlmdn"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>anlmdn</a
|
||||
>
|
||||
filter to reduce noise, and the
|
||||
<a
|
||||
href="https://ffmpeg.org/ffmpeg-filters.html#highpass"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>highpass</a
|
||||
>
|
||||
filter to help with clarity.
|
||||
</p>
|
||||
<p>I ran into a couple gotchas.</p>
|
||||
<ol>
|
||||
<li>
|
||||
<code>mpv</code> does something special for audio playback that
|
||||
prevents audio from clipping. <code>vlc</code> plays the file as it
|
||||
is.
|
||||
</li>
|
||||
<li>
|
||||
Because the compressor has an attack and decay (which is necessary for
|
||||
things to sound good) it can cause clipping if the volume rises
|
||||
sharply. Applying a <code>delay</code> parameter with half the
|
||||
duration of the attack length fixed this.
|
||||
</li>
|
||||
</ol>
|
||||
<p>Here is the script:</p>
|
||||
<pre
|
||||
class="language-bash"
|
||||
><code class="language-bash"><span class="token shebang important">#!/bin/bash</span>
|
||||
<span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$#</span>"</span> <span class="token operator">==</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span>
|
||||
<span class="token builtin class-name">echo</span> <span class="token string">"Error: no arguments provided."</span>
|
||||
<span class="token builtin class-name">echo</span> <span class="token string">"Usage: <span class="token variable">$0</span> file1 file2 file3 ..."</span>
|
||||
<span class="token builtin class-name">echo</span> <span class="token string">" or: <span class="token variable">$0</span> *.ext"</span>
|
||||
<span class="token builtin class-name">exit</span> <span class="token number">1</span>
|
||||
<span class="token keyword">fi</span>
|
||||
|
||||
<span class="token builtin class-name">trap</span> <span class="token string">"exit"</span> INT
|
||||
|
||||
<span class="token keyword">while</span> <span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$#</span>"</span> <span class="token operator">!=</span> <span class="token string">"0"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">do</span>
|
||||
<span class="token assign-left variable">base</span><span class="token operator">=</span><span class="token string">"<span class="token variable">${1<span class="token operator">%%</span>.*}</span>"</span>
|
||||
<span class="token assign-left variable">ext</span><span class="token operator">=</span><span class="token string">"<span class="token variable">${1<span class="token operator">##</span>*.}</span>"</span>
|
||||
<span class="token assign-left variable">outfile</span><span class="token operator">=</span><span class="token string">"./normalized--<span class="token variable">$base</span>.<span class="token variable">$ext</span>"</span>
|
||||
<span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token operator">!</span> <span class="token parameter variable">-f</span> <span class="token string">"<span class="token variable">$outfile</span>"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span>
|
||||
<span class="token builtin class-name">echo</span> <span class="token string">"Processing <span class="token variable">$1</span>"</span>
|
||||
ffmpeg <span class="token parameter variable">-i</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token parameter variable">-v</span> warning <span class="token parameter variable">-ac</span> <span class="token number">1</span> <span class="token parameter variable">-af</span> <span class="token string">"compand=attacks=0.3:decays=0.3:delay=0.15:points=-80/-300|-45/-25|-27/-15|0/-12|20/-12,anlmdn=s=10,highpass=f=500"</span> <span class="token parameter variable">-threads</span> <span class="token number">4</span> <span class="token string">"<span class="token variable">$outfile</span>"</span>
|
||||
<span class="token keyword">else</span>
|
||||
<span class="token builtin class-name">echo</span> <span class="token string">"Skipping <span class="token variable">$1</span>, already processed."</span>
|
||||
<span class="token keyword">fi</span>
|
||||
<span class="token builtin class-name">shift</span>
|
||||
<span class="token keyword">done</span>
|
||||
</code></pre>
|
||||
<p>
|
||||
If this is useful to you please leave a comment or send an email, I
|
||||
would love to hear about it.
|
||||
</p>
|
||||
</main>
|
||||
<script
|
||||
data-isso="//comments.apps.seigler.net/"
|
||||
src="//comments.apps.seigler.net/js/embed.min.js"
|
||||
></script>
|
||||
<section id="isso-thread" data-title="">
|
||||
<noscript>Javascript needs to be activated to view comments.</noscript>
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
© Joshua Seigler 2025. -
|
||||
<a rel="me" href="mailto:joshua@seigler.net?subject=Hello">Contact</a>
|
||||
-
|
||||
<a href="/feed.xml">RSS</a>
|
||||
-
|
||||
<a href="/unoffice-hours/">Unoffice Hours</a>
|
||||
-
|
||||
<a href="/webrings/">Webrings</a>
|
||||
</footer>
|
||||
<div id="effects"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -93,7 +93,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>July 14, 2023</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 4" href="/tags/faith">faith</a>
|
||||
<a class="tag" style="--tagIndex: 0" href="/tags/ethos">ethos</a>
|
||||
</span>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -81,18 +81,33 @@
|
|||
</nav>
|
||||
<h1>Posts</h1>
|
||||
<div class="header-meta">
|
||||
<span class="tags" style="--totalTags: 10"></span>
|
||||
<span class="tags" style="--totalTags: 11"></span>
|
||||
</div>
|
||||
</header>
|
||||
<main>
|
||||
<section data-pagefind-body></section>
|
||||
|
||||
<ul class="collection">
|
||||
<li>
|
||||
<a href="/posts/ffmpeg-audio-cleanup/">FFmpeg audio cleanup</a>
|
||||
<aside>June 26, 2025</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 5" href="/tags/technical"
|
||||
>technical</a
|
||||
>
|
||||
<a class="tag" style="--tagIndex: 10" href="/tags/ffmpeg"
|
||||
>ffmpeg</a
|
||||
>
|
||||
</span>
|
||||
</aside>
|
||||
<p></p>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/posts/july-21-2025/">War</a>
|
||||
<aside>June 21, 2025</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 6" href="/tags/zeitgeist"
|
||||
>zeitgeist</a
|
||||
>
|
||||
|
@ -107,7 +122,7 @@
|
|||
>
|
||||
<aside>June 15, 2025</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 2" href="/tags/how-to"
|
||||
>how to</a
|
||||
>
|
||||
|
@ -128,7 +143,7 @@
|
|||
<a href="/posts/tools-of-the-trade/">Tools of the trade</a>
|
||||
<aside>May 15, 2025</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 5" href="/tags/technical"
|
||||
>technical</a
|
||||
>
|
||||
|
@ -143,7 +158,7 @@
|
|||
<a href="/posts/thinking-machines/">Thinking machines</a>
|
||||
<aside>April 24, 2025</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 6" href="/tags/zeitgeist"
|
||||
>zeitgeist</a
|
||||
>
|
||||
|
@ -156,7 +171,7 @@
|
|||
<a href="/posts/site-design-updated/">Site design updated</a>
|
||||
<aside>June 05, 2024</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 5" href="/tags/technical"
|
||||
>technical</a
|
||||
>
|
||||
|
@ -170,7 +185,7 @@
|
|||
>
|
||||
<aside>July 14, 2023</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 4" href="/tags/faith">faith</a>
|
||||
<a class="tag" style="--tagIndex: 0" href="/tags/ethos">ethos</a>
|
||||
</span>
|
||||
|
@ -181,7 +196,7 @@
|
|||
<a href="/posts/embracing-mysticism/">Embracing Mysticism</a>
|
||||
<aside>October 16, 2021</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 4" href="/tags/faith">faith</a>
|
||||
<a class="tag" style="--tagIndex: 0" href="/tags/ethos">ethos</a>
|
||||
</span>
|
||||
|
@ -197,7 +212,7 @@
|
|||
>
|
||||
<aside>May 26, 2021</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 3" href="/tags/communication"
|
||||
>communication</a
|
||||
>
|
||||
|
@ -214,7 +229,7 @@
|
|||
>
|
||||
<aside>April 03, 2021</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 1" href="/tags/learning"
|
||||
>learning</a
|
||||
>
|
||||
|
@ -234,7 +249,7 @@
|
|||
>
|
||||
<aside>July 02, 2020</aside>
|
||||
<aside>
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 0" href="/tags/ethos">ethos</a>
|
||||
</span>
|
||||
</aside>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -87,7 +87,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>June 21, 2025</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 6" href="/tags/zeitgeist"
|
||||
>zeitgeist</a
|
||||
>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -93,7 +93,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>June 15, 2025</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 2" href="/tags/how-to">how to</a>
|
||||
<a class="tag" style="--tagIndex: 5" href="/tags/technical"
|
||||
>technical</a
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -93,7 +93,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>May 26, 2021</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 3" href="/tags/communication"
|
||||
>communication</a
|
||||
>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -87,7 +87,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>June 5, 2024</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 5" href="/tags/technical"
|
||||
>technical</a
|
||||
>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -104,7 +104,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>April 3, 2021</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 1" href="/tags/learning"
|
||||
>learning</a
|
||||
>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -102,7 +102,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>April 24, 2025</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 6" href="/tags/zeitgeist"
|
||||
>zeitgeist</a
|
||||
>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
name="viewport"
|
||||
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
|
||||
/>
|
||||
<link rel="stylesheet" href="/site.css?v=6a81398da707" />
|
||||
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
|
||||
<style>
|
||||
/* inter-latin-wght-normal */
|
||||
@font-face {
|
||||
|
@ -87,7 +87,7 @@
|
|||
<div class="header-meta">
|
||||
<author>Joshua Seigler</author><date>May 15, 2025</date>
|
||||
|
||||
<span class="tags" style="--totalTags: 10"
|
||||
<span class="tags" style="--totalTags: 11"
|
||||
><a class="tag" style="--tagIndex: 5" href="/tags/technical"
|
||||
>technical</a
|
||||
>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue