<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Guides - There Is No Ox</title><link>https://thereisnoox.com/guides/</link><description>How-tos and reference notes - practical, self-contained, kept up to date.</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 20 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thereisnoox.com/guides/feed.xml" rel="self" type="application/rss+xml"/><item><title>Substack to Local html and to epub</title><link>https://thereisnoox.com/guides/substack-to-local-html-and-to-epub/</link><pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate><guid>https://thereisnoox.com/guides/substack-to-local-html-and-to-epub/</guid><category>Guides</category><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;&#10;&lt;p&gt;To convert the public posts of a substack blog into epub.&lt;/p&gt;&#10;&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;&#10;&lt;p&gt;By using &lt;a href="https://github.com/alexferrari88/sbstck-dl"&gt;sbstck-dl&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;Step 1: first install the Go language. The easiest way which would download, install the language, and then configure the PATH automatically.&lt;/p&gt;&#10;&lt;p&gt;In PowerShell (windows)&#10;&lt;code&gt; &amp;gt; winget install GoLang.Go&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Step 2: verify it&lt;br&gt;&#10;&lt;code&gt;&amp;gt; go version&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Step 3: download the &lt;code&gt;sbstck-dl-win-amd64.exe&lt;/code&gt; file from the above mentioned sbstck-dl repo. The method of installation provided in the repo installs an earlier version.&lt;/p&gt;&#10;&lt;p&gt;Step 4: Better to create a new directory with the exe file in it and then run the following command&#10;&lt;code&gt; .\sbstck-dl-win-amd64.exe download --url https://example.substack.com --download-images --create-archive&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;This will download the entire public blog at example.substack.com, download all the files in html format (sbstck-dl has options to download individual posts as well as into md or text formats, instead of html), and also download the images in a separate folder.&#10;These html files can then be read in the browser directly. The &lt;code&gt;create-archive&lt;/code&gt; option creates an index.html file which can then be used for TOC (table of contents) for the entire blog.&lt;/p&gt;&#10;&lt;p&gt;Step 5: To convert the entire stack of html files into an epub, there are two ways: either use ebook-convert (you get that with &lt;a href="https://calibre-ebook.com/"&gt;Calibre&lt;/a&gt;) or by using &lt;a href="https://pandoc.org/"&gt;pandoc&lt;/a&gt;. Both are available in scoop and can be installed &lt;code&gt;scoop install calibre&lt;/code&gt; or &lt;code&gt;scoop install pandoc&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Step 6: For text-heavy substacks, it is better to ignore the images and just have the texts. first create a local file &lt;code&gt;no-images.lua&lt;/code&gt; with the following text&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;function Image(el)&#10; return pandoc.Str(&amp;#34;[image]&amp;#34;)&#10;end &#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Step 7: Because of some windows powershell glob issues, you will have to run the following command in Powershell (this needs the index.html, all the blogpost html, the images folder, and the no-images.lua files in the same folder where the command is being run).&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;pandoc (Get-ChildItem *.html | Where-Object Name -ne &amp;#34;index.html&amp;#34; | Sort-Object Name).FullName -o Name_of.epub --lua-filter=no-images.lua --metadata title=&amp;#34;Name_of&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;or in cmd.exe&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;pandoc *.html -o Name_of.epub --lua-filter=no-images.lua --metadata title=&amp;#34;Name_of&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Happy Reading!&lt;/p&gt;&#10;</description></item><item><title>Downloading a Youtube Playlist</title><link>https://thereisnoox.com/guides/downloading-a-youtube-playlist/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><guid>https://thereisnoox.com/guides/downloading-a-youtube-playlist/</guid><category>Guides</category><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;&#10;&lt;p&gt;To locally download a youtube playlist.&lt;/p&gt;&#10;&lt;h2 id="solutions"&gt;Solutions&lt;/h2&gt;&#10;&lt;p&gt;Best Command-line solution&lt;/p&gt;&#10;&lt;h3 id="yt-dlp"&gt;yt-dlp&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;From their &lt;a href="https://github.com/yt-dlp/yt-dlp/releases"&gt;github repo&lt;/a&gt;, download the appropriate version.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;For Windows, it will be yt-dlp.exe / keep it in a separate folder.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Make sure you have &lt;code&gt;ffmpeg&lt;/code&gt; installed on your system. If not, use &lt;code&gt;scoop install ffmpeg &lt;/code&gt; would work.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Basic command to download a playlist as audio:&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;code&gt; &amp;gt; yt-dlp -x &amp;quot;PLAYLIST_URL&amp;quot;&lt;/code&gt;&#10;The &lt;code&gt;-x&lt;/code&gt; flag extracts audio and by default saves as the best available audio format.&lt;/p&gt;&#10;&lt;p&gt;and that&amp;rsquo;s it.&lt;/p&gt;&#10;&lt;h4 id="other-options"&gt;Other Options&lt;/h4&gt;&#10;&lt;p&gt;Download as MP3 specifically.&#10;&lt;code&gt;&amp;gt; yt-dlp -x --audio-format mp3 &amp;quot;PLAYLIST_URL&amp;quot;&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Download as MP3 with high quality (320kbps)&#10;&lt;code&gt;yt-dlp -x --audio-format mp3 --audio-quality 0 &amp;quot;PLAYLIST_URL&amp;quot;&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Save files in a named folder, numbered by playlist order&#10;&lt;code&gt;yt-dlp -x --audio-format mp3 -o &amp;quot;%(playlist_index)s - %(title)s.%(ext)s&amp;quot; &amp;quot;PLAYLIST_URL&amp;quot;&lt;/code&gt;&lt;/p&gt;&#10;&lt;h3 id="jdownloader"&gt;JDownloader&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://jdownloader.org/download/index"&gt;JDownloader.org - Official Homepage&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;This is a GUI version. But I haven&amp;rsquo;t tried it.&lt;/p&gt;&#10;</description></item><item><title>The Making of This Site</title><link>https://thereisnoox.com/guides/making-of-this-site/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><guid>https://thereisnoox.com/guides/making-of-this-site/</guid><category>Guides</category><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;&#10;&lt;p&gt;I wanted a personal site that is plain, fast, cheap to keep running, and that I fully own: text files I can read in twenty years, no database, no accounts, no trackers.&lt;/p&gt;&#10;&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;&#10;&lt;p&gt;A static site built with &lt;a href="https://gohugo.io"&gt;Hugo&lt;/a&gt;, hosted on &lt;a href="https://docs.gitlab.com/user/project/pages/"&gt;GitLab Pages&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h3 id="the-pieces"&gt;The pieces&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Content&lt;/strong&gt; - every post is a plain Markdown file with a short header (title, date, description). The files live in folders that become the sections of the site: Notebooks, Weblog, Guides, Questions and Reading.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Templates&lt;/strong&gt; - no ready-made theme. A handful of small HTML templates (&lt;code&gt;layouts/&lt;/code&gt;) and one stylesheet (&lt;code&gt;static/style.css&lt;/code&gt;) control everything.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Hosting&lt;/strong&gt; - the source sits in a private GitLab repository. Every push to the &lt;code&gt;main&lt;/code&gt; branch triggers a GitLab CI job that runs &lt;code&gt;hugo&lt;/code&gt; and publishes the result. The site is live about a minute after a push.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="design"&gt;Design&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Colours&lt;/strong&gt; - the &lt;a href="https://github.com/morhetz/gruvbox"&gt;Gruvbox&lt;/a&gt; palette, in a light and a dark version. Each kind of element has one colour: titles orange, section headings aqua, sub-headings green, links blue, dates yellow, quotations purple.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Type&lt;/strong&gt; - Source Serif 4 for reading text, the system font for small labels. The font is served from this site itself, trimmed to the characters the site actually uses (about 80 KB instead of about 2 MB).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Light / dark&lt;/strong&gt; - follows your system setting. If you press the toggle, the choice is remembered in your own browser (local storage, not a cookie) and never leaves it.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="what-it-does-not-have"&gt;What it does not have&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;No cookies, no analytics, no comments, no ads.&lt;/li&gt;&#10;&lt;li&gt;No requests to any other server: fonts, styles and feeds all come from this site.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="dates"&gt;Dates&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;The publish date is written in each post&amp;rsquo;s header.&lt;/li&gt;&#10;&lt;li&gt;The &amp;ldquo;Updated&amp;rdquo; date is automatic: at build time Hugo reads the git history and shows the date of the last change to that file. Nothing to maintain by hand.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="following-the-site"&gt;Following the site&lt;/h3&gt;&#10;&lt;p&gt;Every section has an RSS feed, and there is one feed for everything: &lt;a href="https://thereisnoox.com/feed.xml"&gt;feed.xml&lt;/a&gt;. Paste the site address into any feed reader and it will find them. The &lt;a href="https://thereisnoox.com/archive/"&gt;Archive&lt;/a&gt; lists every post on one page.&lt;/p&gt;&#10;&lt;h3 id="adding-a-post"&gt;Adding a post&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Create a Markdown file in the right section folder, with a header like:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;---&#10;title: &amp;#34;Title of the post&amp;#34;&#10;date: 2026-09-18&#10;description: &amp;#34;One line that appears in lists and feeds.&amp;#34;&#10;---&#10;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Commit and push. That is all.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="help"&gt;Help&lt;/h3&gt;&#10;&lt;p&gt;Parts of the templates and styling were built with help from Claude, an AI assistant.&lt;/p&gt;&#10;&lt;h2 id="references"&gt;References&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://gohugo.io/documentation/"&gt;Hugo documentation&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://docs.gitlab.com/user/project/pages/"&gt;GitLab Pages&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/morhetz/gruvbox"&gt;Gruvbox colour scheme&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/adobe-fonts/source-serif"&gt;Source Serif 4&lt;/a&gt; - typeface by Frank Grießhammer for Adobe, SIL Open Font License; files taken from the &lt;a href="https://github.com/google/fonts/tree/main/ofl/sourceserif4"&gt;Google Fonts repository&lt;/a&gt; and trimmed with &lt;a href="https://github.com/fonttools/fonttools"&gt;fontTools&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Speech to Text and Text-to-Speech</title><link>https://thereisnoox.com/guides/speech-to-text-and-text-to-speech/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><guid>https://thereisnoox.com/guides/speech-to-text-and-text-to-speech/</guid><category>Guides</category><description>&lt;h1 id="speech-to-text"&gt;Speech to Text&lt;/h1&gt;&#10;&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;&#10;&lt;p&gt;To convert a podcast mp3 into text file.&lt;/p&gt;&#10;&lt;h2 id="solutions"&gt;Solutions&lt;/h2&gt;&#10;&lt;h3 id="online"&gt;Online&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Adobe Podcast&lt;/li&gt;&#10;&lt;li&gt;Otter.ai&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="offline-local"&gt;Offline, local&lt;/h3&gt;&#10;&lt;p&gt;By using &lt;a href="https://github.com/openai/whisper"&gt;openai Whisper&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Get the .mp3 or .wav file from the podcast.&lt;/p&gt;&#10;&lt;p&gt;In PowerShell (windows)&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; check if you have python installed on your system.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;&amp;gt; python --version&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; use pip to install openai.whisper from their repo (MIT license)&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;&amp;gt; python -m pip install git+https://github.com/openai/whisper.git&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; check if you have ffmpeg installed in your system.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;&amp;gt; ffmpeg -h&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;if not, install it on your system. I used Scoop to install it&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt; scoop install ffmpeg&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; make sure whisper.exe is in your Path environment, if not do it in your System Variables and Reboot or use the path of the file.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt; whisper podcast.mp3 --model small --output_format txt --task transcribe&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;it will download the &amp;lsquo;small&amp;rsquo; model and then transcribe the podcast into a local text file.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Other options:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;You can use it to &lt;em&gt;translate&lt;/em&gt; the podcast mp3 into whichever language you want.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt; whisper podcast_in_spanish.mp3 --model small --output_format txt --language english --task translate&lt;/code&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;you can use it &lt;em&gt;programmatically&lt;/em&gt; within python or django frameworks.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h1 id="text-to-speech"&gt;Text to Speech&lt;/h1&gt;&#10;&lt;h2 id="online-1"&gt;Online&lt;/h2&gt;&#10;&lt;p&gt;Elevenlabs, Murf.ai, and Speechify&lt;/p&gt;&#10;&lt;h2 id="offline-for-android"&gt;Offline for Android&lt;/h2&gt;&#10;&lt;h3 id="piper-tts-engine"&gt;Piper TTS engine&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;goto &lt;strong&gt;&lt;a href="https://k2-fsa.github.io/sherpa/onnx/tts/apk-engine.html"&gt;https://k2-fsa.github.io/sherpa/onnx/tts/apk-engine.html&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Find an English voice you want - &lt;code&gt;en_US-libritts_r-medium&lt;/code&gt; or &lt;code&gt;en_GB-jenny-dioco-medium&lt;/code&gt; are good ones which I checked.&lt;/li&gt;&#10;&lt;li&gt;Download the APK for your device - arm64-v8a is the last 5 years usage. around 80mb files. You can only install one of the them.&lt;/li&gt;&#10;&lt;li&gt;Install it and use it instead of the default Google TTS.&lt;/li&gt;&#10;&lt;li&gt;Now Moon+ Reader or Librera can use it.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item></channel></rss>