Skip to content



  • New: Simplify the landing page text.
  • Reorganization: Merge the Meta article into the index.



  • New: Introduce the anonymous feedback tool to improve diversity, equity and inclusion in an organization.

    Anonymous Feedback is a communication tool where people share feedback to teammates or other organizational members while protecting their identities.

    Until the safe space is built where direct feedback is viable, anonymous feedback gives these employees a mechanism to raise their concerns, practice their feedback-giving skills, test the waters, and understand how people perceive their constructive (and sometimes critical) opinions, thus building the needed trust.

  • New: Define Diversity, Equity and Inclusion.

    • Diversity is the representation and acknowledgement of the multitudes of identities, experiences, and ways of moving through the world. This includes—but is not limited to—ability, age, citizenship status, criminal record and/or incarceration, educational attainment, ethnicity, gender, geographical location, language, nationality, political affiliation, religion, race, sexuality, socioeconomic status, and veteran status. Further, we recognize that each individual's experience is informed by intersections across multiple identities.

    • Equity seeks to ensure respect and equal opportunity for all, using all resources and tools to elevate the voices of under-represented and/or disadvantaged groups.

    • Inclusion is fostering an environment in which people of all identities are welcome, valued, and supported. An inclusive organization solicits, listens to, learns from, and acts on the contributions of all its stakeholders.

  • New: Introduce Anti-transphobia.

    Anti-transphobia being reductionist is the opposition to the collection of ideas and phenomena that encompass a range of negative attitudes, feelings or actions towards transgender people or transness in general. Transphobia can include fear, aversion, hatred, violence, anger, or discomfort felt or expressed towards people who do not conform to social gender expectations. It is often expressed alongside homophobic views and hence is often considered an aspect of homophobia.

  • New: Introduce arguments against terf ideology.

    TERF is an acronym for trans-exclusionary radical feminist. The term originally applied to the minority of feminists that expressed transphobic sentiments such as the rejection of the assertion that trans women are women, the exclusion of trans women from women's spaces, and opposition to transgender rights legislation. The meaning has since expanded to refer more broadly to people with trans-exclusionary views who may have no involvement with radical feminism.


  • New: Introduce antifascism.

    Antifascism is a method of politics, a locus of individual and group self-indentification, it's a transnational movement that adapted preexisting socialist, anarchist, and communist currents to a sudden need to react to the fascist menace (Mark p. 11). It's based on the idea that any oppression form can't be allowed, and should be actively fought with whatever means are necessary.

Antifascist Actions

  • New: A fake company and five million recycled flyers.

    A group of artists belonging to the Center for political beauty created a fake company Flyerservice Hahn and convinced more than 80 regional sections of the far right party AfD to hire them to deliver their electoral propaganda.

    They gathered five million flyers, with a total weight of 72 tons. They justify that they wouldn't be able to lie to the people, so they did nothing in the broader sense of the word. They declared that they are the "world wide leader in the non-delivery of nazi propaganda". At the start of the electoral campaign, they went to the AfD stands, and they let their members to give them flyers the throw them to the closest bin. "It's something that any citizen can freely do, we have only industrialized the process".

    They've done a crowdfunding to fund the legal process that may result.



  • New: Feminist analysis of privileges and rights.

    Privileges are a group of special structural benefits, social advantages, that a group holds over another. So they are elements that should be removed from our lives.

    Some of the topics included are:

Free Knowledge

  • New: Introduce how to contribute to the free knowledge initiative.

    One of the early principles of the internet has been to make knowledge free to everyone. Alexandra Elbakyan of Sci-Hub, bookwarrior of Library Genesis, Aaron Swartz, and countless unnamed others have fought to free science from the grips of for-profit publishers. Today, they do it working in hiding, alone, without acknowledgment, in fear of imprisonment, and even now wiretapped by the FBI. They sacrifice everything for one vision: Open Science.

    If you want to know how to contribute, check the article.

Life Management

  • Reorganization: Split the life automation article into life management and process automation.

    I understand life management as the act of analyzing yourself and your interactions with the world to define processes and automations that shape the way to efficiently achieve your goals.

    I understand process automation as the act of analyzing yourself and your interactions with the world to find the way to reduce the time or willpower spent on your life processes.

Time Management

Task Management

  • New: Introduce the task management concept.

    Task management is the process of managing a task through its life cycle. It involves planning, testing, tracking, and reporting. Task management can help either individual achieve goals, or groups of individuals collaborate and share knowledge for the accomplishment of collective goals.

  • Improvement: Introduce the main task management tools.

    The inbox does not refer only to your e-mail inbox. It is a broader concept that includes all the elements you have collected in different ways: tasks you have to do, ideas you have thought of, notes, bills, business cards, etc…

    The task manager tool to make your interaction with the tasks easier. You can start with the simplest task manager, a markdown file in your computer with a list of tasks to do. Annotate only the actionable tasks that you need to do today, otherwise it can quickly grow to be unmanageable.

  • Improvement: Add the benefits when you do task management well, and the side effects if you do it wrong.

  • Improvement: Add a small guide on how to introduce yourself into task management.

Task Management Workflows

Interruption Management

  • New: Introduce the interruption management concept.

    Interruption management is the life management area that gathers the processes to minimize the time and willpower toll consumed by interruptions.

    The article proposes a way to analyze your existent interruptions and define how can you improve your interaction with them. I've applied it both to my work and personal interruptions.

  • Improvement: Explain what to do once you have the interruption analysis.

Work Interruption Analysis

  • Improvement: Add analysis of instant message interruptions.

Personal Interruption Analysis

  • Improvement: Add analysis of instant message interruptions.

Money Management

  • Reorganization: Move the accounting automation to money management.

Email Management

  • New: Explain how I configure and interact with email efficiently.

Email Automation

  • New: Explain how setup an infrastructure to automate.

Music Management

  • New: Introduce how I manage my music library.


  • New: How to contribute to MusicBrainz.

    MusicBrainz is an open music encyclopedia that collects music metadata and makes it available to the public.

    MusicBrainz aims to be:

    • The ultimate source of music information by allowing anyone to contribute and releasing the data under open licenses.
    • The universal lingua franca for music by providing a reliable and unambiguous form of music identification, enabling both people and machines to have meaningful conversations about music.

    Like Wikipedia, MusicBrainz is maintained by a global community of users and we want everyone — including you — to participate and contribute.

Book Management

  • New: Introduce the book management concept.

    Book management is the set of systems and processes to get and categorize books so it's easy to browse and discover new content. It involves the next actions:

    • Automatically index and download metadata of new books.
    • Notify the user when a new book is added.
    • Monitor the books of an author, and get them once they are released.
    • Send books to the e-reader.
    • A nice interface to browse the existent library, with the possibility of filtering by author, genre, years, tags or series.
    • An interface to preview or read the items.
    • An interface to rate and review library items.
    • An interface to discover new content based on the ratings and item metadata.

    I haven't yet found a single piece of software that fulfills all these needs, in the article I tell you about Readarr, Calibre-web, [calibre]((, Polar bookself, GCStar, and how they interact with each other.

  • Improvement: Add link to the calibre-web kobo integration project.

Map Management

  • New: How I manage maps in my life.

    For navigating on the go, I strongly recommend OSMand+, for browsing maps in the browser, use OpenStreetMaps or CyclOSM if you want to move by bike.

    To plan routes, you can use, it works perfectly for bikes. For hiking is awesome too, it shows you a lot of data needed to plan your tracks (check the settings on the right). If you want to invest a little more time, you can even set your personalize profiles, so that the routing algorithm prioritizes the routes to your desires. It's based on brouter and both can be self-hosted, although brouter does not yet use Docker.

Instant Messages Management

  • New: Explain how I configure and interact with chat applications efficiently.

Process Automation

  • Improvement: Add xkcd comics that gather the essence and pitfalls of process automation.

Virtual Assistant

  • New: Introduce project with kalliope.
  • New: Explain the Speech-To-Text open source solutions.



  • New: Explain the sleep cycle.

    Humans cycle through two types of sleep in a regular pattern throughout the night with a period of 90 minutes. They were called non-rapid eye movement (NREM) and rapid eye movement (REM).

    I answer the questions:

    • What is the period of the REM/NREM cycle?
    • What happens to your body in REM and NREM phases?
    • How does the ratio of REM/NREM changes throughout the night? with a possible explanation.
    • Why sleeping 6 hours can make you loose up to 90% of your REM or NREM phases?
  • New: Explain sleeping time and sense distortions.

    Answer the questions:

    • Why time feels longer in our dreams?
    • How do we loose awareness of the outside world when sleeping?


  • New: Explain how to take care of your teeth.

    A full guide on why should you take care of your teeth, the description on how the basic oral diseases work, why and how to brush your teeth, floss and usage of mouthwash

  • Correction: Recommend a regular clean instead of a deep clean.

Deep cleaning

  • New: Explain what a deep cleaning is and when should you do it.

    Analyze the reasons why would you need to do this procedure, how it works, when you need to do it, side effects and scientific evidences of it's effectiveness.

Fitness Tracker

  • New: Introduce the fitness band in your life automation.

    Fitness tracker or activity trackers are devices or applications for monitoring and tracking fitness-related metrics such as distance walked or run, calorie consumption, and in some cases heartbeat. It is a type of wearable computer.

    Explain also why it's interesting

  • Improvement: Discovery of wasp-os and Colmi P8.

    wasp-os is an open source firmware for smart watches that are based on the nRF52 family of microcontrollers. Fully supported by gadgetbridge, Wasp-os features full heart rate monitoring and step counting support together with multiple clock faces, a stopwatch, an alarm clock, a countdown timer, a calculator and lots of other games and utilities. All of this, and still with access to the MicroPython REPL for interactive tweaking, development and testing.

    One of the supported devices, the Colmi P8, looks really good.

Amazfit Band 5

  • New: Add insights on sleep detection.

    The sleep tracking using Gadgetbridge is not good at all. After two nights, the band has not been able to detect when I woke in the middle of the night, or when I really woke up, as I usually stay in the bed for a time before standing up. I'll try with the proprietary application soon and compare results.

  • New: Explain how to upgrade the firmware.

    Gadgetbridge people have a guide on how to upgrade the firmware, you need to get the firmware from the geek doing forum though, so it is interesting to create an account and watch the post.

  • Improvement: Add insights on sleep tracking.

    You can't use the Withings sleep analyzer without their app (as expected), maybe the Emfit QS is the way to go.


  • New: Introduce Vue.js.

    Vue.js is a progressive framework for building user interfaces.

Generic Coding Practices

Program Versioning

Keep a Changelog

  • New: Introduce the Changelog practice.

    A changelog is a file which contains a curated, chronologically ordered list of notable changes for each version of a project.

    It's purpose is to make it easier for users and contributors to see precisely what notable changes have been made between each release (or version) of the project.

    In the article we added:

  • New: Introduce Semantic Versioning.

    Semantic Versioning is a way to define your program's version based on the type of changes you've introduced. It's defined as a three-number string (separated with a period) in the format of MAJOR.MINOR.PATCH.

    Also included in the article is:

Calendar Versioning

  • New: Start explaining how to write good documentation for a software project.

    It doesn't matter how good your program is, because if its documentation is not good enough, people will not use it.

    People working with software need different kinds of documentation at different times, in different circumstances, so good software documentation needs them all. In this first iteration, I define the five kinds of documentation, and give the ideas to write good introduction and get started sections.

  • New: Introduce Calendar Versioning.

    Calendar Versioning is a versioning convention based on your project's release calendar, instead of arbitrary numbers.

    CalVer suggests version number to be in format of: YEAR.MONTH.sequence. For example, 20.1 indicates a release in 2020 January, while 20.5.2 indicates a release that occurred in 2020 May, while the 2 indicates this is the third release of the month.


  • New: Explain how to check if a loop ends completely.
  • New: Explain how to merge lists and dictionaries.
  • New: Explain how to create your own exceptions.
  • New: Add python landing page.
  • Improvement: Add aiomultiprocess to the list of libraries to test.

    aiomultiprocess: Presents a simple interface, while running a full AsyncIO event loop on each child process, enabling levels of concurrency never before seen in a Python application. Each child process can execute multiple coroutines at once, limited only by the workload and number of cores available.

  • New: Add interesting links on how to write good documentation.

    I would like to refactor divio's and Vue's guidelines and apply it to my projects.

  • Improvement: Add FastAPI docs as a model to study and follow.

  • New: Add apprise to the interesting libraries to explore.

    apprise: Allows you to send a notification to almost all of the most popular notification services available to us today such as: Linux, Telegram, Discord, Slack, Amazon SNS, Gotify, etc. Look at all the supported notifications (¬º-°)¬.

  • New: Add kivi and kivimd to the interesting libraries to explore.

    kivi is used to create android/Linux/iOS/Windows applications with python. Use it with kivimd to make it beautiful, check the examples and the docs.

  • New: Add parso library to interesting libraries to explore.

    parso is a library to parse Python code.

  • Improvement: Add textual as interesting library to explore.

    textual: Textual is a TUI (Text User Interface) framework for Python using Rich as a renderer.

  • New: Add schedule to interesting libraries to explore.

    schedule is a Python job scheduling for humans. Run Python functions (or any other callable) periodically using a friendly syntax.

  • New: Add tryceratops to interesting linters to try.

    tryceratops is a linter of exceptions.

Pydantic Field Types

  • New: Introduce the asyncio library.

    asyncio is a library to write concurrent code using the async/await syntax.

    asyncio is used as a foundation for multiple Python asynchronous frameworks that provide high-performance network and web-servers, database connection libraries, distributed task queues, etc.

    asyncio is often a perfect fit for IO-bound and high-level structured network code.

  • New: Limit concurrency.

    Use asyncio.Semaphore.

    sem = asyncio.Semaphore(10)
    async with sem:
        # work with shared resource
  • New: Using constrained strings in list attributes.

    import re
    import pydantic
    from pydantic import Field
    from typing import List
    class Regex(pydantic.ConstrainedStr):
        regex = re.compile("^[0-9a-z_]*$")
    class Data(pydantic.BaseModel):
        regex: List[Regex]
    data = Data(**{"regex": ["abc", "123", "asdf"]})




  • New: Explain how to log python program exceptions better than to a file.

    Using logging to write write exceptions and breadcrumbs to a file might not be the best solution because unless you look at it directly most errors will pass unnoticed.

    To actively monitor and react to code exceptions use an application monitoring platform like sentry.

    In the article I explain what are the advantages of using this solution and do a comparison between Sentry and GlitchTip.

  • New: Testing Dash applications.

    dash.testing provides some off-the-rack pytest fixtures and a minimal set of testing APIs with our internal crafted best practices at the integration level. The commit includes a simple example and some guides on how to test Dash application.

  • New: Test programs that use sh.

    sh can be patched in your tests the typical way, with unittest.mock.patch():

    from unittest.mock import patch
    import sh
    def get_something():
        return sh.pwd()
    @patch("sh.pwd", create=True)
    def test_something(pwd):
        pwd.return_value = "/"
        assert get_something() == "/"

Code Styling

  • Improvement: Don't use try-except to initialize dictionaries.

    Instead of:

    except KeyError:
        dictionary['key'] = {}


    dictionary.setdefault('key', {})
  • New: Introduce the awesome, life saving library pydantic_factories.

    Pydantic factories is a library offers powerful mock data generation capabilities for pydantic based models and dataclasses. It automatically creates FactoryBoy factories from a pydantic model.

    from datetime import date, datetime
    from typing import List, Union
    from pydantic import BaseModel, UUID4
    from pydantic_factories import ModelFactory
    class Person(BaseModel):
        id: UUID4
        name: str
        hobbies: List[str]
        age: Union[float, int]
        birthday: Union[datetime, date]
    class PersonFactory(ModelFactory):
        __model__ = Person
    result =
  • Reorganization: Moved the semantic versioning commit guidelines to the semver article.


  • Correction: Remove murmur from the installation steps.

    It seems it's the default for the new versions

  • Improvement: Add warning that regular expressions are not yet supported.

    Until #239 is merged, the official library doesn't support searching for regular expressions. You can use my fork instead.

  • Improvement: Remove advice to use my fork instead.

    The original one has already merged my PR \\ ٩( ᐛ )و //. Beware though as the regexp are not enabled by default (against my will). You need to use the use_regexp=True as an argument to grep or DeepSearch.


Package Management

  • New: Explain how to create your own provider.

    Useful to generate custom objects for testing purposes.

  • New: Explain how to create Optional data.

    faker-optional is a custom faker provider that acts as a wrapper over other Faker providers to return their value or None. Useful to create data of type Optional[Any].

  • New: Create a random string with a defined format.

  • New: Create an IP address.


    If you want a CIDR, use network=True.

  • New: Compare Poetry, Pipenv and PDM package management tools.

    Pipenv has broad support. It is an official project of the Python Packaging Authority, alongside pip. It's also supported by the Heroku Python buildpack, which is useful for anyone with Heroku or Dokku-based deployment strategies.

    Poetry is a one-stop shop for dependency management and package management. It simplifies creating a package, managing its dependencies, and publishing it. Compared to Pipenv, Poetry's separate add and install commands are more explicit, and it's faster for everything except for a full dependency install.

    I liked Poetry most, and in the end I didn't analyze pdm.

  • New: Describe what a dependency solver does.

    A Solver tries to find a working set of dependencies that all agree with each other. By looking back in time, it’s happy to solve very old versions of packages if newer ones are supposed to be incompatible. This can be helpful, but is slow, and also means you can easily get a very ancient set of packages when you thought you were getting the latest versions.

    In the section we compare Pip's and Poetry's solver.

  • New: Add downsides of Poetry.

    It does upper version capping by default, which is becoming a big problem in the Python environment.

    This is specially useless when you add dependencies that follow CalVer. poetry add packaging will still do ^21 for the version it adds. You shouldn’t be capping versions, but you really shouldn’t be capping CalVer.

    It's equally troublesome that it upper pins the python version.


Plugin System

  • New: Add beets system as a first approach.

    When building Python applications, it's good to develop the core of your program, and allow extension via plugins.

    I still don't know how to do it, but Beets plugin system looks awesome for a first start.

Flask Restplus

  • New: Introduce the Flask-RESTPlus library.

    Flask-RESTPlus is an extension for Flask that adds support for quickly building REST APIs, but I'd use FastAPI instead.



  • New: Introduce the python library.

    GitPython is a python library used to interact with git repositories, high-level like git-porcelain, or low-level like git-plumbing.

    It provides abstractions of git objects for easy access of repository data, and additionally allows you to access the git repository more directly using either a pure python implementation, or the faster, but more resource intensive git command implementation.

    Explain how to:

    • Initialize or load repositories.
    • Make commits.
    • Interact with the history.
    • Test applications that use it.
  • Improvement: Explain how to get the working directory of a repo.

    Using the working_dir attribute.

    perf(python_snippets#Group a list of dictionaries by a specific key) Explain how to group a list of dictionaries by a specific key

    With itertools.groupby.

  • New: Clone a repository.

    from git import Repo
    Repo.clone_from(git_url, repo_dir)
  • New: Create a branch.

    new_branch = repo.create_head('new_branch')
    assert repo.active_branch != new_branch # It's not checked out yet
    repo.head.reference = new_branch
    assert not repo.head.is_detached
  • New: Get the latest commit of a repository.



  • New: Explain how to exclude code from the coverage report.

    Add # pragma: no cover.

  • New: Explain how to run tests in parallel.

    pytest-xdist makes it possible to run the tests in parallel, useful when the test suit is large or when the tests are slow.

    pip install pytest-xdist
    pytest -n auto
  • New: Explain how to set a timeout for your tests.

    Using pytest-timeout.

  • New: Explain how to rerun tests that fail sometimes.

    With pytest-rerunfailures that is a plugin for pytest that re-runs tests to eliminate intermittent failures. Using this plugin is generally a bad idea, it would be best to solve the reason why your code is not reliable. It's useful when you rely on non robust third party software in a way that you can't solve, or if the error is not in your code but in the testing code, and again you are not able to fix it.

    feat(python_snippets#Create combination of elements in groups of two): Explain how to create combination of elements in groups of two

    >>> list(itertools.combinations('ABC', 2))
    [('A', 'B'), ('A', 'C'), ('B', 'C')]
  • New: Exclude the if TYPE_CHECKING code from the coverage.

    If you want other code to be excluded, for example the statements inside the if TYPE_CHECKING: add to your pyproject.toml:

    exclude_lines = [
        # Have to re-enable the standard pragma
        'pragma: no cover',
        # Type checking can not be tested
        'if TYPE_CHECKING:',
  • New: Introduce goodconf the pyndantic YAML friendly configuration management.

    goodconf is a thin wrapper over Pydantic's settings management. Allows you to define configuration variables and load them from environment or JSON/YAML file. Also generates initial configuration files and documentation for your defined configuration.

  • New: Capture deprecation warnings.

    Python and its ecosystem does not have an assumption of strict SemVer, and has a tradition of providing deprecation warnings. If you have good CI, you should be able to catch warnings even before your users see them. Try the following pytest configuration:

    filterwarnings = ["error"]

    This will turn warnings into errors and allow your CI to break before users break.

    Other sections added are:

Python Snippets



  • New: Introduce the python library.

    NetworkX is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks.


  • New: Introduce the pexpect python library.

    A pure Python module for spawning child applications; controlling them; and responding to expected patterns in their output. Pexpect works like Don Libes’ Expect. Pexpect allows your script to spawn a child application and control it as if a human were typing commands.

  • New: Explain how to read the output of a command run by pexpect.

    import sys
    import pexpect
    child = pexpect.spawn('ls')
    child.logfile = sys.stdout

Prompt Toolkit



  • New: Explain how to insert, update, select data.
  • New: Explain how to join tables.

Python Mysql

  • New: Give examples on joins for each relationship type.
  • New: Explain how to interact with MySQL databases with Python.
  • Correction: Correct the syntax of the left joins.

    Instead of using ON == addresses.user_id, use ON = addresses.user_id


  • New: Introduce tui python library.

    questionary is a Python library for effortlessly building pretty command line interfaces. It makes it very easy to query your user for input.

  • Correction: Correct the link to the examples.

  • New: Conditionally skip questions.

    Sometimes it is helpful to be able to skip a question based on a condition. To avoid the need for an if around the question, you can pass the condition when you create the question:

    import questionary
    DISABLED = True
    response = questionary.confirm("Are you amazed?").skip_if(DISABLED, default=True).ask()
  • New: Don't highlight the selected option by default.

    If you don't want to highlight the default choice in the select question use the next style:

    from questionary import Style
    choice = select(
        "Question title: ",
        choices=['a', 'b', 'c'],
        style=Style([("selected", "noreverse")]),


  • New: Introduce the python cli builder library and it's progress bar.

    Rich is a Python library for rich text and beautiful formatting in the terminal.

    Check out the beautiful progress bar:

    pip install rich
    python -m rich.progress
  • New: Explain how to build pretty tables with rich.

    from rich.console import Console
    from rich.table import Table
    table = Table(title="Star Wars Movies")
    table.add_column("Released", justify="right", style="cyan", no_wrap=True)
    table.add_column("Title", style="magenta")
    table.add_column("Box Office", justify="right", style="green")
    table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690")
    table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347")
    table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889")
    table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889")
    console = Console()
  • New: Explain how to print pretty text with rich.

    from rich.console import Console
    from rich.text import Text
    console = Console()
    text = Text.assemble(("Hello", "bold magenta"), " World!")

Ruamel YAML

  • Improvement: Suggest to use ruyaml instead of ruamel.yaml.

    As it's maintained by the community and versioned with git.




  • New: Introduce the requests python library.


  • New: Add note to test arq.

    arq is a similar library that can be better.


  • New: Introduce the Tenacity python library.

    Tenacity is an Apache 2.0 licensed general-purpose retrying library, written in Python, to simplify the task of adding retry behavior to just about anything.






  • New: Introduce the diagram library and how to make flowchart diagrams.

    MermaidJS is a Javascript library that lets you create diagrams using text and code.

    It can render the next diagram types:

    • Flowchart
    • Sequence.
    • Gantt
    • Class
    • Git graph
    • Entity Relationship
    • User journey


  • New: Introduce the issue tracking document.

    I haven't found a tool to monitor the context it made me track certain software issues, so I get lost when updates come. Until a tool shows up, I'll use the good old markdown to keep track of them.

  • New: Add today's issues.

    • Gadgetbridge improvements
    • Ombi improvements
  • Improvement: Monitor today's issues.

    • Mkdocs migration to 7.x is giving errors with the search bar and repo stats.
  • Improvement: Track python dependency errors.

  • Correction: Gitdb has updated smmap.
  • New: Jellyfin 10.7.1 broke the login page.

    Don't upgrade till it's solved, as the rollback is not easy.

  • Correction: Jellyfin login page problem after upgrade to 10.7.X is solved.

    Surprisingly the instructions in #5489 solved it.

    systemctl stop jellyfin.service
    mv /var/lib/jellyfin/data/jellyfin.db{,.bak}
    systemctl start jellyfin.service
    [ Go to JF URL, get asked to log in even though there are no Users in the JF DB now]
    systemctl stop jellyfin.service
    mv /var/lib/jellyfin/data/jellyfin.db{.bak,}
    systemctl start jellyfin.service


  • New: Comment on the DevOps pitfalls and update the learn path.

Infrastructure as Code



  • New: Introduce terraform and how to handle RDS secrets.

    Terraform is an open-source infrastructure as code software tool created by HashiCorp. It enables users to define and provision a datacenter infrastructure using an awful high-level configuration language known as Hashicorp Configuration Language (HCL), or optionally JSON. Terraform supports a number of cloud infrastructure providers such as Amazon Web Services, IBM Cloud , Google Cloud Platform, DigitalOcean, Linode, Microsoft Azure, Oracle Cloud Infrastructure, OVH, or VMware vSphere as well as OpenNebula and OpenStack.

  • New: Explain how to ignore the change of an attribute.

    resource "aws_instance" "example" {
      # ...
      lifecycle {
        ignore_changes = [
          # Ignore changes to tags, e.g. because a management agent
          # updates these based on some ruleset managed elsewhere.
  • New: Explain how to define the default value of an variable that contains an object as empty.

    variable "database" {
      type = object({
        size                 = number
        instance_type        = string
        storage_type         = string
        engine               = string
        engine_version       = string
        parameter_group_name = string
        multi_az             = bool
      default     = null
  • New: Explain how to do a conditional if a variable is not null.

    resource "aws_db_instance" "instance" {
      count                = var.database == null ? 0 : 1
  • New: How to do elif conditionals in terraform.

    locals {
      test = "${ condition ? value : (elif-condition ? elif-value : else-value)}"
  • New: How to enable debug traces.

    You can set the TF_LOG environmental variable to one of the log levels TRACE, DEBUG, INFO, WARN or ERROR to change the verbosity of the logs.

Helm Secrets

  • Correction: Update the repository url.

    The last fork is dead, long live the fork

  • New: How to install the plugin.

Helm Git

  • Correction: Suggest version 0.8.0 until issue is solved.

    Newer versions have a bug that makes impossible to use helm_git with a repository that contains just one chart in the root of the git repository.

  • Correction: Update installation method.

    In the last version 0.11.1, the issue that forced us to use the version 0.8.0 was solved

Infrastructure Solutions




  • Improvement: Remove false positive alerts on failed jobs that succeeded.

    A Kubernetes cronjob spawns jobs, if the first one fails, it will try to spawn a new one. If the second succeeds, the cronjob status should be success, but with the rule we had before, a successful job with failed past jobs will still raise an alert.

  • New: Explain how to rerun failed cronjobs.

    If you have a job that has failed after the 6 default retries, it will show up in your monitorization forever, to fix it, you can manually trigger the job.

    kubectl get job "your-job" -o json \
        | jq 'del(.spec.selector)' \
        | jq 'del(.spec.template.metadata.labels)' \
        | kubectl replace --force -f -
  • New: Manually creating a job from a cronjob.

    kubectl create job {{ job_name }} -n {{ namespace }} \
        --from=cronjobs/{{ cronjob_name}}

Continuous Integration

  • New: Explain how to troubleshoot the error: pathspec master did not match any file.

    Remove all git hooks with rm -r .git/hooks.



  • New: Introduce Pyment.

    Pyment is a python3 program to automatically create, update or convert docstrings in existing Python files, managing several styles.

    As of 2021-11-17, the program is not production ready yet for me, I've tested it in one of my projects and found some bugs that needed to be fixed before it's usable. Despite the number of stars, it looks like the development pace has dropped dramatically, so it needs our help to get better :).

Dependency managers

  • New: Sync the virtualenv libraries with the requirements files.

    python -m piptools sync requirements.txt requirements-dev.txt
  • Correction: Use -c instead of -r in the nested requirement files.

    To avoid duplication of version pins.

  • Correction: Deprecate in favour of Poetry.

Automating Processes



Monitoring Comparison

  • New: Compare Nagios and Prometheus as monitoring.
  • Correction: Improve the comparison.

    • State that nagios is not easy to configure. If you're used to it it is, otherwise it's not.
    • Add that grafana has a huge community building graphs.
    • Mention Thanos as the long term storage solution for Prometheus.
  • Correction: Add the insights of a nagios power user.

    • Update open source and community analysis with nagios exchange.
    • Correct nagios community analysis with its trajectory
    • Correct the analysis of the high availability of nagios
    • Add the option to host the script exporter in a dedicated server

Prometheus Install

  • Correction: Add warning that helm 2 support is dropped.

    If you want to use the helm chart above 11.1.7 you need to use helm 3.

  • Improvement: Add upgrading notes from 10.x -> 11.1.7.

    Don't upgrade to 12.x if you're still using Helm 2.

Elasticsearch Exporter

  • New: Introduce the prometheus elasticsearch exporter.

    The elasticsearch exporter allows monitoring Elasticsearch clusters with Prometheus.

    Explain how to install it, configure the grafana dashboards and the alerts.

  • Improvement: Add more elasticsearch alerts.

    Measure the search latency, search rate and create alerts on the garbage collector, json parser and circuit breaker errors

  • New: Add alert on low number of healthy master nodes.


  • New: Introduce the scrum framework.

    Scrum is an agile framework for developing, delivering, and sustaining complex products, with an initial emphasis on software development, although it has been used in other fields such as personal task management. It is designed for teams of ten or fewer members, who break their work into goals that can be completed within time-boxed iterations, called sprints, no longer than one month and most commonly two weeks. The Scrum Team track progress in 15-minute time-boxed daily meetings, called daily scrums. At the end of the sprint, the team holds sprint review, to demonstrate the work done, a sprint retrospective to improve continuously, and a sprint planning to prepare next sprint's tasks.

    In the article I explain:

Software Architecture

Domain Driven Design

  • Improvement: Add warning when migrating old code.

    You may be tempted to migrate all your old code to this architecture once you fall in love with it. Truth being told, it's the best way to learn how to use it, but it's time expensive too! The last refactor I did required a change of 60% of the code. The upside is that I reduced the total lines of code a 25%.

Architecture Decision Record

  • New: Introduce the Architecture Decision Records.

    ADR are short text documents that captures an important architectural decision made along with its context and consequences.

  • New: Update the ADR template with the week learnings.

    • Add the Proposals and Date sections
    • Explain the possible Status states.
    • Add an Ultisnip vim snippet.
    • Explain how I've used it to create mkdocs-newsletter.
  • Improvement: Explain how to show relationship between ADRs.

    Suggest a mermaidjs diagram to show the state of the project ADRs.

Operative Systems


  • New: Introduce Tahoe-LAFS.

    Tahoe-LAFS is a free and open, secure, decentralized, fault-tolerant, distributed data store and distributed file system.

    Tahoe-LAFS is a system that helps you to store files. You run a client program on your computer, which talks to one or more storage servers on other computers. When you tell your client to store a file, it will encrypt that file, encode it into multiple pieces, then spread those pieces out among multiple servers. The pieces are all encrypted and protected against modifications. Later, when you ask your client to retrieve the file, it will find the necessary pieces, make sure they haven’t been corrupted, reassemble them, and decrypt the result.

Linux Snippets


  • New: Explain how to use tabs, buffers and windows in vim.
  • New: Introduce afew.

    afew is an initial tagging script for notmuch mail.

    Its basic task is to provide automatic tagging each time new mail is registered with notmuch. In a classic setup, you might call it after notmuch new in an offlineimap post sync hook.


  • New: Follow the issue to add elipsis instead of ... in vim-abolish.
  • Correction: Forget to use abolish to insert the elipsis symbol.

    Tpope said that it's not going to happen.

  • New: Introduce vim-easymotion.

    EasyMotion provides a much simpler way to use some motions in vim. It takes the <number> out of <number>w or <number>f{char} by highlighting all possible choices and allowing you to press one key to jump directly to the target.

    When one of the available motions is triggered, all visible text preceding or following the cursor is faded, and motion targets are highlighted.

  • Reorganization: Move vim-test to the plugins page.

  • Correction: Typo.

    There was a missing comma in the list.

  • Improvement: Explain how to configure the vim-easymotion movement keys.

  • New: Introduce alot.

    alot is a terminal-based mail user agent based on the notmuch mail indexer. It is written in python using the urwid toolkit and features a modular and command prompt driven interface to provide a full MUA experience.


  • New: Introduce ActivityWatch tracking software.

    It's a web application that can be installed both in Linux and Android that automatically tracks where you spend the time on.

    Super interesting for life logging and automating stuff. Until I save some time to react on the data, I'll just gather it and see how to aggregate it.

  • Improvement: Add week insights.


  • New: Introduce the cli double entry accounting program.
  • New: Add links on how to use as a library.
  • Correction: Correct the git repository link.


  • New: Introduce Beets the music management library.

    Beets is a music management library used to get your music collection right once and for all. It catalogs your collection, automatically improving its metadata as it goes using the MusicBrainz database. Then it provides a set of tools for manipulating and accessing your music.


  • New: Introduce dunst.

    Dunst is a lightweight replacement for the notification daemons provided by most desktop environments. It’s very customizable, isn’t dependent on any toolkits, and therefore fits into those window manager centric setups we all love to customize to perfection.

Dynamic DNS

  • New: Introduce the Dynamic DNS concept.

    Dynamic DNS (DDNS) is a method of automatically updating a name server in the Domain Name Server (DNS), often in real time, with the active DDNS configuration of its configured hostnames, addresses or other information.



  • New: Introduce gajim.

    Gajim is the best Linux XMPP client in terms of end-to-end encryption support as it's able to speak OMEMO.

Github cli

  • New: Basic usage of gh.

    gh is GitHub’s official command line tool.

    It can be used to speed up common operations done with github, such as opening PRs, merging them or checking the checks of the PRs


  • New: Introduce Graylog.

    Graylog is a log management tool. The commit includes some tips like how to send a test message to check an input.


Hard drive health

  • New: Taking care of your hard drives.

    Hard drives die, so we must be ready for that to happen. There are several solutions, such as using RAID to minimize the impact of a disk loss, but even then, we should monitor the bad sectors to see when are our disks dying.

    In the article we talk about S.M.A.R.T and how to solve some hard drive problems.


  • New: Introduce Husboard.

    Hushboard is an utility that mutes your microphone while you’re typing.

    (Thanks M0wer!)


  • New: Introduce the media system and monitor interesting issues.

    Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it.

  • Correction: Explain how to fix the stuck at login page issue.

    systemctl stop jellyfin.service
    mv /var/lib/jellyfin/data/jellyfin.db{,.bak}
    systemctl start jellyfin.service
    systemctl stop jellyfin.service
    mv /var/lib/jellyfin/data/jellyfin.db{.bak,}
    systemctl start jellyfin.service
  • Correction: Explain how to fix the Intel Hardware transcoding.

    docker exec -it jellyfin /bin/bash
    dpkg -i jellyfin-ffmpeg_4.3.2-1-focal_amd64.deb
  • Improvement: Explain how to fix the wrong image covers.

    Remove all the jpg files of the directory and then fetch again the data from your favourite media management software.

  • New: Track the issue of trailers not working.

  • New: Explain how to fix the green bars in the reproduction.
  • Correction: Fix the stuck at login page error.

    If you use jfa-go for the invites, you may need to regenerate all the user profiles, so that the problem is not introduced again.

  • New: Track subtitles get delayed from the video on some devices issue.


  • New: Introduce the program and multiple of it's uses.

    ffmpeg is a complete, cross-platform solution to record, convert and stream audio and video.


  • New: Introduce kitty the terminal emulator.

    kitty is a fast, feature-rich, GPU based terminal emulator written in C and Python with nice features for the keyboard driven humans like me.

  • New: Scrollback when ssh into a machine doesn't work.

    This happens because the kitty terminfo files are not available on the server. You can ssh in using the following command which will automatically copy the terminfo files to the server:

    kitty +kitten ssh myserver
  • New: Enable infinite scrollback history.

    To make the history scrollback infinite add the next lines:

    scrollback_lines -1
    scrollback_pager_history_size 0
  • New: Reasons to migrate from urxvt to kitty.

    • It doesn't fuck up your terminal colors.
    • You can use peek to record your screen.
    • Easier to extend.



  • New: Explain how to develop your own plugins.
  • New: Document the Navigation object and the on_nav event.

    Useful if you develop MkDocs plugins, it holds the information to build the navigation of the site.

  • New: Describe navigation objects used in plugins.

    Explain how to use the Page, Section, and SectionPage objects.

  • Correction: You need to edit the nav in the on_nav and not in the on_files event.

    Even though it seems more easy to create the nav structure in the on_files event, by editing the nav dictionary of the config object, there is no way of returning the config object in that event, so we're forced to do it in this event.

  • Correction: Explain how to add files through a plugin.

    Long story short, use the on_config event instead of on_files and on_nav if you need to add files and want to change the navigation menu.

  • New: Explain how to use MermaidJS diagrams.

  • New: Explain how to test mkdocs plugins.
  • New: Explain additions of version 7.1.0 of the material theme.


  • New: Introduce the music server.

    Mopidy is an extensible music server written in Python, that plays perfectly with beets and the MPD ecosystem.

    The awesome documentation, being Python based, the extension system, JSON-RPC, and JavaScript APIs make Mopidy a perfect base for your projects.

Oracle Database

  • New: Explain how to build an oracle database docker while feeling dirty inside.


  • New: Introduce Peek the screen recorder.

    Peek is a simple animated GIF screen recorder with an easy to use interface.

    If you try to use it with i3, you're going to have a bad time, you'd need to install Compton, and then the elements may not even be clickable.

  • Correction: Add note that it works with kitty.



  • New: Configure Vim to set the upstream by default when git pushing.
  • New: Add vim landing page.
  • Reorganization: Refactor the vim_automation article into vim and vim_plugins.
  • Correction: Correct vim snippet to remember the folds when saving a file.



  • New: Introduce the mobile double entry accounting application.
  • Correction: Correct the description of the transaction to be beancount compatible.


  • New: Add more guidelines to reverse engineer the band protocol.


  • New: Introduce OsmAnd.

    OsmAnd is a mobile application for global map viewing and navigating based on OpenStreetMaps. Perfect if you're looking for a privacy focused, community maintained open source alternative to google maps.


  • New: Introduce the messaging app and how to decrypt the backups.



  • New: Try vim-pencil without success, but love mdnav.

    mdnav opens links to urls or files when pressing enter in normal mode over a markdown link, similar to gx but more powerful. I specially like the ability of following [self referencing link][] links, that allows storing the links at the bottom.

  • New: Explain when to use I'm good or I'm well.

    Use I'm well when referring to being ill, use I'm good for the rest.

Grammar and Orthography

Forking this garden

  • New: Analyze interesting books on writing style.

    • The elements of style by William Strunk Jr and E.B White
    • On writing well by William Zinsser
    • Bird by bird by Anne Lamott
    • On writing by Stephen King
  • New: Explain how to end a letter.

    Use Sincerely in doubt and Best if you have more confidence. Add a comma after the sign-off and never use Cheers (it's what I've been doing all my life (◞‸◟;) ).

  • New: Explain how to fork the blue book.

Digital Gardens

  • New: Introduce the digital garden concept.

    Digital Garden is a method of storing and maintaining knowledge in an maintainable, scalable and searchable way. They are also known as second brains.


  • New: Introduce the cooking art.

Cooking Basics


  • New: Introduce the art.

    Pilates is a physical fitness system based on controlled movements putting emphasis on alignment, breathing, developing a strong core, and improving coordination and balance. The core (or powerhouse), consisting of the muscles of the abdomen, low back, and hips, is thought to be the key to a person's stability.

    Pilates' system allows for different exercises to be modified in range of difficulty from beginner to advanced or to any other level, and also in terms of the instructor and practitioner's specific goals and/or limitations. Intensity can be increased over time as the body adapts itself to the exercises.

    You can think of yoga, but without the spiritual aspects.

    Also added:

Board Gaming


  • New: Introduce the awesome Regicide card game.

    Regicide is a wonderful cooperative card game for 1 to 4 players. It's awesome how they've built such a rich game dynamic with a normal deck of cards. Even if you can play it with any deck, I suggest to buy the deck they sell because their cards are magnificent and they deserve the money for their impressive game. Another thing I love about them is that even if you can't or don't want to pay for the game, they give the rules for free.

    If you don't like reading the rules directly from their pdf (although it's quite short), they explain them in this video.

    I've loved the game so much, that I've created some variations of the rules to make each game more different and changeling.


  • New: How to draw Ellipses.

    Ellipses are the next basic shape we're going to study (after the lines). They are extremely important and notoriously annoying to draw. Important because we're going to be using ellipses in 2D space to represent circles that exist in 3D space.

    In this section we:

Exercise Pool

  • New: Add the Tables of ellipses drawing exercise.

    This exercise is meant to get you used to drawing ellipses, in a variety of sizes, orientations and degrees. It also sets out a clear space each ellipse is meant to occupy, giving us a means to assess whether or not an ellipse was successful, or if there were visible mistakes (where it went outside of its allotted space, or ended up falling short). Practicing against set criteria, with a way to judge success/failure is an important element of learning. There's nothing wrong with failure - it's an opportunity to learn. Having a clearly defined task allows us to analyze those failures and make the most of them.


  • New: Add mark1626 digital garden article on origamis.


  • Correction: Update the XMPP address.

    Riseup has stopped giving support for XMPP :(


  • New: Add remote work tips.
  • New: Introduce lazy loading implementation paradigm with python.
  • New: Explain how to lazy load pydantic objects.
  • New: Explain my accounting automation workflow.
  • New: Feature mkdocs-rss-plugin as a solution of publishing mkdocs updates as an RSS.
  • New: Add a git issue tracker and markdown formatter.
  • Correction: Deprecate mkdocs issues.

    They've been fixed in the last release

  • New: Suggest organize to act on computer file changes.

    organize looks good for automating processes on files. Maybe it's interesting to run it with inotifywait instead of with a cron job.

  • New: Introduce Outrun.

    Outrun lets you execute a local command using the processing power of another Linux machine.

  • Correction: Broken links.

    Removed the link to ( since it no longer exists. Updated some links that where broken due to a folder structure change.

  • New: Explain how to select a random choice from Enum objects.

    pydantic uses Enum objects to define the choices of fields, so we need them to create the factories of those objects.

  • New: Improve the periodic tasks and application metrics monitoring.

    Setup an healthchecks instance with the linuxserver image to monitor cronjobs.

    For the notifications either use the prometheus metrics or an apprise compatible system.

  • New: Explain how to check if an rsync command has gone well.

    Run diff -r --brief source/ dest/, and check that there is no output.

  • Reorganization: Reorder the sections of the site navigation menu.

    Give more importance to Coding, Activism and Life Management, reducing the Software Architecture and Data Analysis sections.

  • New: Introduce the tool management section.

    Most of the tasks or processes we do involve some kind of tool, the better you know how to use them, the better your efficiency will be. The more you use a tool, the more it's worth the investment of time to improve your usage of it.

    Whenever I use a tool, I try to think if I could configure it or use it in a way that will make it easier or quicker. Don't go crazy and try to change everything. Go step by step, and once you've internalized the improvement, implement the next.

  • Reorganization: Move the tasks tools from the task management article to their own.