<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Sourcehut &amp;mdash; csantosb</title>
    <link>https://infosec.press/csantosb/tag:Sourcehut</link>
    <description>Random thoughts</description>
    <pubDate>Wed, 13 May 2026 23:23:42 +0000</pubDate>
    <item>
      <title>ci (sourcehut): alu</title>
      <link>https://infosec.press/csantosb/ci-sourcehut-alu</link>
      <description>&lt;![CDATA[img br/&#xA;Remote #ci is the way to go in #modernhw digital design testing. In this #ciseries, let’s see how to implement it with detail using sourcehut and a real world example. !--more-- br/&#xA;Sourcehut is a lightweight #gitforge where I host my #git repositories. Not only it is based on a paradigm perfectly adapted to #modernhw, but also its builds service includes support for guix (x8664) images. This means that we will be able to execute all of our testing online inside guix profiles, shells or natively on top of the bare-bones image. br/&#xA;&#xA;Alu&#xA;&#xA;Let’s consider now a variant of the previous example with open-logic. Here, we concentrate on a toy design only for demonstration purposes, a dummy alu emulator, which uses #osvvm as verification framework and relies on a few #openlogic blocs. In this case, its dependencies are defined in a manifest.scm file, including both fw-open-logic and osvvm, among other dependencies. br/&#xA;Install dependencies locally, in a new profile with br/&#xA;&#xA;cd alu&#xA;mkdir deps&#xA;export GUIXPROFILE=open-logic/deps&#xA;guix install -P $GUIXPROFILE -m .builds/manifest.scm&#xA;. $GUIXPROFILE/etc/profile&#xA;&#xA;In this case, we will test the design using, first, a custom made makefile. Secondly, we will use hdlmake to automatically produce our makefile. Similarly to previous #openlogic example, two build manifest are used: br/&#xA;&#xA;    profile1 br/&#xA;    profile2 br/&#xA;&#xA;You’ll realise how some of the tasks are common with the case of previous #openlogic example (update channels, auth and update profile). br/&#xA;&#xA;osvvm&#xA;&#xA;In this case, we also need to compile osvvm libraries br/&#xA;&#xA;    compile\_osvvm, produce a compiled version of #osvvm verification libraries; this is necessary as we are using here the tcl  scripts included in the library itself to follow the correct order of compilation. Libraries will appear within the local profile under $GUIXPROFILE/VHDLLIBS/GHDL-X.Y.Z br/&#xA;&#xA;test&#xA;&#xA;    test, for a fully custom made testing pipeline; in this case, using a Makefile br/&#xA;    Just simply, source the .envrc file where the local $GUIXPROFILE variable is defined, cd to the ghdl directory and call make to compile the design and run the simulation in two steps: first, clean all and include sources in its corresponding libraries with br/&#xA;    &#xA;        make cleanall include&#xA;        &#xA;    Then, produce a new Makefile using ghdl. br/&#xA;    &#xA;        ./makefile.sh # ghdl --gen-makefile ...&#xA;        &#xA;    Finally, run the simulation with br/&#xA;    &#xA;        make GHDLRUNFLAGS=&#34;--stop-time=4us --disp-time --ieee-asserts=enable&#34; run&#xA;        &#xA;    This will produce a executable file before running it with the provided parameters. br/&#xA;    You may notice that, in this case, you need to produce somehow your own Makefile, or equivalent pipeline, right ? br/&#xA;&#xA;hdlmake&#xA;&#xA;Wouldn’t it be nice if we had a tool to deploy online which produces makefiles for us ? It exists, and its name is #hdlmake. br/&#xA;&#xA;    test\hdlmake br/&#xA;    Source the .envrc file where the local $GUIXPROFILE variable is defined, cd to the .builds/hdlmake directory where all Manifest.py files are located, and call hdlmake to produce the Makefile. Finally, just run make to compile the design, produce an executable and run it. br/&#xA;&#xA;Check the resulting logs inline here, for example. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/sourcehut.png" alt="img"> <br/>
Remote <a href="/csantosb/tag:ci" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ci</span></a> is the <a href="https://infosec.press/csantosb/tag:ciseries" rel="nofollow">way to go</a> in <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a> digital design testing. In this <a href="/csantosb/tag:ciseries" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ciseries</span></a>, let’s see how to implement it with detail using <a href="https://sourcehut.org/" rel="nofollow">sourcehut</a> and a real world example.  <br/>
<a href="https://infosec.press/csantosb/sourcehut-crash-course" rel="nofollow">Sourcehut</a> is a lightweight <a href="/csantosb/tag:gitforge" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">gitforge</span></a> where I host my <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> repositories. Not only it is <a href="https://infosec.press/csantosb/git-forges#sourcehut" rel="nofollow">based on a paradigm</a> perfectly adapted to <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a>, but also its <a href="https://infosec.press/csantosb/sourcehut-crash-course#builds" rel="nofollow">builds</a> service includes support for <a href="https://man.sr.ht/builds.sr.ht/compatibility.md#guix-system" rel="nofollow">guix</a> (x86_64) images. This means that we will be able to execute all of our testing online inside <a href="https://infosec.press/csantosb/guix-crash-course#profiles-and-generations" rel="nofollow">guix profiles</a>, <a href="https://infosec.press/csantosb/guix-crash-course#shell-containers" rel="nofollow">shells</a> or natively on top of the bare-bones image. <br/></p>

<h1 id="alu">Alu</h1>

<p>Let’s consider now a variant of the <a href="https://infosec.press/csantosb/ci-sourcehut" rel="nofollow">previous example with open-logic</a>. Here, we concentrate on a <a href="https://git.sr.ht/~csantosb/ip.alu/tree" rel="nofollow">toy design</a> only for demonstration purposes, a <a href="https://git.sr.ht/~csantosb/ip.alu/tree/master/item/src/alu.vhd" rel="nofollow">dummy alu emulator</a>, which uses <a href="/csantosb/tag:osvvm" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">osvvm</span></a> as verification framework and relies on a few <a href="/csantosb/tag:openlogic" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">openlogic</span></a> blocs. In this case, its dependencies are defined in a <a href="https://git.sr.ht/~csantosb/ip.alu/tree/test/item/.builds/manifest.scm" rel="nofollow">manifest.scm</a> file, including both <code>fw-open-logic</code> and <code>osvvm</code>, among other dependencies. <br/>
Install dependencies locally, in a new <a href="https://infosec.press/csantosb/guix-crash-course#profiles-and-generations" rel="nofollow">profile</a> with <br/></p>

<pre><code class="language-sh">cd alu
mkdir _deps
export GUIX_PROFILE=open-logic/_deps
guix install -P $GUIX_PROFILE -m .builds/manifest.scm
. $GUIX_PROFILE/etc/profile
</code></pre>

<p>In this case, we will test the design using, first, a custom made makefile. Secondly, we will use <a href="https://hdlmake.readthedocs.io/en/master/" rel="nofollow">hdlmake</a> to automatically produce our makefile. Similarly to <a href="https://infosec.press/csantosb/ci-sourcehut" rel="nofollow">previous</a> <a href="/csantosb/tag:openlogic" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">openlogic</span></a> example, two build manifest are used: <br/></p>

<p>    <a href="https://git.sr.ht/~csantosb/ip.alu/tree/test/item/.builds/profile1.yml" rel="nofollow">profile1</a> <br/>
    <a href="https://git.sr.ht/~csantosb/ip.alu/tree/test/item/.builds/profile2.yml" rel="nofollow">profile2</a> <br/></p>

<p>You’ll realise how some of the tasks are common with the case of previous <a href="/csantosb/tag:openlogic" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">openlogic</span></a> example (update channels, auth and update profile). <br/></p>

<h2 id="osvvm">osvvm</h2>

<p>In this case, we also need to compile osvvm libraries <br/></p>

<p>    <strong>compile__osvvm</strong>, <a href="https://builds.sr.ht/~csantosb/job/1389146#task-compile_osvvm" rel="nofollow">produce a compiled version</a> of <a href="/csantosb/tag:osvvm" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">osvvm</span></a> verification libraries; this is necessary as we are using here the <code>tcl</code>  scripts included in the library itself to follow the correct order of compilation. Libraries will appear within the local profile under <code>$GUIX_PROFILE/VHDL_LIBS/GHDL-X.Y.Z</code> <br/></p>

<h2 id="test">test</h2>

<p>    <strong>test</strong>, for a fully custom made testing pipeline; in this case, using a <code>Makefile</code> <br/>
    Just simply, source the <code>.envrc</code> file where the local <code>$GUIX_PROFILE</code> variable is defined, cd to the <code>ghdl</code> directory and call make to compile the design and run the simulation in two steps: first, clean all and include sources in its corresponding libraries with <br/></p>

<p>    <code>sh
    make __clean_all __include
</code></p>

<p>    Then, produce a new <code>Makefile</code> using <code>ghdl</code>. <br/></p>

<p>    <code>sh
    ./makefile.sh # ghdl --gen-makefile ...
</code></p>

<p>    Finally, run the simulation with <br/></p>

<p>    <code>sh
    make GHDLRUNFLAGS=&#34;--stop-time=4us --disp-time --ieee-asserts=enable&#34; run
</code></p>

<p>    This will produce a executable file before <a href="https://builds.sr.ht/~csantosb/job/1389146#task-test" rel="nofollow">running it</a> with the provided parameters. <br/>
    You may notice that, in this case, you need to produce somehow your own <code>Makefile</code>, or equivalent pipeline, right ? <br/></p>

<h2 id="hdlmake">hdlmake</h2>

<p>Wouldn’t it be nice if we had a tool to deploy online which produces makefiles for us ? It exists, and its name is <a href="/csantosb/tag:hdlmake" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">hdlmake</span></a>. <br/></p>

<p>    <strong>test__hdlmake</strong> <br/>
    <a href="https://git.sr.ht/~csantosb/ip.alu/tree/8324cd0fcb838cfb8303aae9e668b6831a329cbb/.builds/profile1.yml#L39" rel="nofollow">Source</a> the <code>.envrc</code> file where the local <code>$GUIX_PROFILE</code> variable is defined, cd to the <code>.builds/hdlmake</code> directory where all <code>Manifest.py</code> files are located, and call <code>hdlmake</code> to produce the <code>Makefile</code>. Finally, just run make to compile the design, produce an executable and run it. <br/></p>

<p>Check the resulting logs inline <a href="https://builds.sr.ht/~csantosb/job/1389146#task-test_hdlmake" rel="nofollow">here</a>, for example. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/ci-sourcehut-alu</guid>
      <pubDate>Fri, 13 Dec 2024 12:38:24 +0000</pubDate>
    </item>
    <item>
      <title>ci (sourcehut): open-logic</title>
      <link>https://infosec.press/csantosb/ci-sourcehut</link>
      <description>&lt;![CDATA[img br/&#xA;Remote #ci is the way to go in #modernhw digital design testing. In this #ciseries, let’s see how to implement it with detail using sourcehut and a real world example. !--more-- br/&#xA;Sourcehut is a lightweight #gitforge where I host my #git repositories. Not only it is based on a paradigm perfectly adapted to #modernhw, but also its builds service includes support for guix (x8664) images. This means that we will be able to execute all of our testing online inside guix profiles, shells or natively on top of the bare-bones image. br/&#xA;&#xA;Open logic&#xA;&#xA;Let’s see how in detail using the cookbook as a starting point, and taking as a complete example the fw-open-logic #openlogic firmware package which comes with the electronics guix channel. br/&#xA;Get it with: br/&#xA;&#xA;guix install fw-open-logic:out&#xA;&#xA;Open logic is a useful #vhdl library of commonly used components, implemented in a reusable and vendor/tool-independent way.  As any other #modernhw library, it includes tests sets for any of its components, using the vunit utility in this case. br/&#xA;To run the full tests suite use (user wide using the default $GUIXPROFILE), install its dependencies, defined in a manifest.scm file (ghdl-clang and python-vunit in this case). br/&#xA;&#xA;cd open-logic&#xA;guix install -m .builds/manifest.scm&#xA;cd sim&#xA;python3 run.py --ghdl -v&#xA;&#xA;or local to the project, using a profile br/&#xA;&#xA;cd open-logic&#xA;mkdir deps&#xA;export GUIXPROFILE=open-logic/deps&#xA;guix install -P $GUIXPROFILE -m .builds/manifest.scm&#xA;. $GUIXPROFILE/etc/profile&#xA;cd sim&#xA;python3 run.py --ghdl -v&#xA;&#xA;go remote&#xA;&#xA;img br/&#xA;Now, how do we proceed online using #sourcehut #ci builds facility ? Builds will pop up a new environment based on an up to date guix-system image when we push a commit to git.sr.ht, provided we include a .build.yml build manifest file, or by a .build folder with up to 4 build manifest files, at the root of the git project 1]. Be careful: consider that this image is [built daily using a crontab job, which is a good and a bad thing at the same time. From one side, you won’t be using the same environment for your tests, which breaks #reproducibility (see comments section below). On the other side, #guix is a rolling release, and new fancy features and new fixes are added every day. Keep this in mind. br/&#xA;Let’s create a .builds folder in a topic test branch, with the following contents: br/&#xA;&#xA;    manifest.scm, list of dependencies in our project br/&#xA;    guix.scm, default guix repository, redundant, included here for convenience br/&#xA;    channels.scm, list of guix channels remote repositories, in addition to the default guix repository, from where we pull packages br/&#xA;    We will be using here my own electronics channel (no substitutes), as well as the guix science channel (which provides substitutes). br/&#xA;    (note how here we load the local guix.scm file, instead of making use of the %default-channels global variable) br/&#xA;    &#xA;        (load &#34;guix.scm&#34;)&#xA;    ;;; %default-channels&#xA;        key.pub, auth key to access substitutes of packages in guix channels br/&#xA;&#xA;build manifests&#xA;&#xA;From now on, every new push to the test #git branch will trigger the execution of the tasks defined in the three build manifest files br/&#xA;&#xA;    profile1 br/&#xA;    profile2 br/&#xA;    shell1 br/&#xA;&#xA;The two profile build manifest files use a slightly different approach, and are given here for comparison purposes only. The shell build manifest uses an isolated shell container within the image itself to illustrate this feature. br/&#xA;Inside the manifests, I declare the image to use, guix, and the global environment variables sourced before each task is run: prj (project name), srv (list of servers with substitutes), manifest and channels (pointing to the corresponding files) and key (same). It is important to declare a trigger action, to receive an email with all relevant information in case of failure (log, id, commit, etc.). br/&#xA;&#xA;tasks&#xA;&#xA;What’s interesting here is the list of tasks. Some of them are common to all three manifests br/&#xA;&#xA;    env, useful only for debugging br/&#xA;    guix\updatechannels, replace the default project local guix.scm file by the output of br/&#xA;    &#xA;        guix describe --format=channels&#xA;        &#xA;    The goal here is avoid pulling latest guix upstream, useless and cpu and time consuming, and using the local version instead. Remember that the guix system image we are using here is updated daily. br/&#xA;    &#xA;        guix\auth, runs the authorize command to add the key.pub file to guix, so that we will be able to download package substitutes when necessary br/&#xA;        &#xA;                sudo guix archive --authorize &lt; &#34;$key&#34;&#xA;                &#xA;        Here, one may opt by doing a br/&#xA;        &#xA;                guix pull --channels=&#34;$channels&#34;&#xA;                &#xA;        as in profile2, to set the revision of the guix channels we are using (remember channels are nothing but git repositories). br/&#xA;        Note how in profile1 and shell1 we opt for a different approach. br/&#xA;        guix\updateprofile, where we create a deps folder to be used as a local $GUIXPROFILE (defined in .envrc). br/&#xA;        Then, one of br/&#xA;        &#xA;                # profile1&#xA;        guix time-machine --channels=&#34;$channels&#34; -- \&#xA;             package -p &#34;$GUIXPROFILE&#34; \&#xA;             --substitute-urls=&#34;$srv&#34; \&#xA;             -m &#34;$manifest&#34;&#xA;                &#xA;        or br/&#xA;        &#xA;                # profile2&#xA;        guix \&#xA;            package -p &#34;$GUIXPROFILE&#34; \&#xA;            --substitute-urls=&#34;$srv&#34; \&#xA;            -m &#34;$manifest&#34;&#xA;                &#xA;        will install packages in $manifest into the $GUIXPROFILE. I’m using here the time-machine mechanism to set the revision of the guix channels, depending if guix pull was run in the previous stage or not. br/&#xA;        vunit, sets env variables in .envrc and runs python3 run.py --ghdl -v inside sim directory br/&#xA;        Note that here, we are using ghdl-clang and python-vunit packages, provided respectively by guix-science and the electronics channel. br/&#xA;        guix\shelltest, used by shell1, make use of time-machine (no former guix pull, then), to create a shell container, where to install project dependencies. Then, if calls inmediately run.sh to run the unit tests br/&#xA;        &#xA;                guix time-machine --channels=&#34;$channels&#34; -- shell -C --substitute-urls=&#34;$srv&#34; -m &#34;$manifest&#34; -- ./.builds/run.sh&#xA;        &#xA;&#xA;comments&#xA;&#xA;You may check the logs of profile1, profile2 and shell1 manifests, including a section with logs per task, to better understand what’s going on here. Remember that #sourcehut gives ssh access to the builds by connecting to the runners in case of failures, which provides a practical way of debugging the manifest files. br/&#xA;You may see how, using the remove guix image, it is possible to deploy a series of tasks to test our #modernhw design as we develop it: we will get an email in case of failure to pass the tests. Here, I present three approaches: guix pulling to set the repositories revisions on use; time-machine, to achieve the same, and guix shell to create an isolated container. These three alternatives are not necessary here, of course, but are given as a simple and practical demo of what can be achieved with #guix, #sourcehut and #ci. br/&#xA;To conclude this long post, it is important to stress once again that the point on using #guix resides in its reproducibility capabilities. By keeping a couple of #plaintext files, namely the manifest.scm and channels.scm, one can obtain #determinism in the execution of the tests. Even if the guix image is upgraded and rebuilt daily (and so it changes), by fixing the revision of our channels (remember, guix pull or guix time-machine) we obtain always the same products out of our tests, as we run the same (project and tests) code, within exactly the same environment. br/&#xA;&#xA;---&#xA;&#xA;[1] It is also possible to automatically submit builds when a patch to a repo with build manifests is sent to a mailing list. This is achieved by appending the project name as a prefix to the subject of the message, for example [PATCH project-name]. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/sourcehut.png" alt="img"> <br/>
Remote <a href="/csantosb/tag:ci" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ci</span></a> is the <a href="https://infosec.press/csantosb/tag:ciseries" rel="nofollow">way to go</a> in <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a> digital design testing. In this <a href="/csantosb/tag:ciseries" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ciseries</span></a>, let’s see how to implement it with detail using <a href="https://sourcehut.org/" rel="nofollow">sourcehut</a> and a real world example.  <br/>
<a href="https://infosec.press/csantosb/sourcehut-crash-course" rel="nofollow">Sourcehut</a> is a lightweight <a href="/csantosb/tag:gitforge" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">gitforge</span></a> where I host my <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> repositories. Not only it is <a href="https://infosec.press/csantosb/git-forges#sourcehut" rel="nofollow">based on a paradigm</a> perfectly adapted to <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a>, but also its <a href="https://infosec.press/csantosb/sourcehut-crash-course#builds" rel="nofollow">builds</a> service includes support for <a href="https://man.sr.ht/builds.sr.ht/compatibility.md#guix-system" rel="nofollow">guix</a> (x86_64) images. This means that we will be able to execute all of our testing online inside <a href="https://infosec.press/csantosb/guix-crash-course#profiles-and-generations" rel="nofollow">guix profiles</a>, <a href="https://infosec.press/csantosb/guix-crash-course#shell-containers" rel="nofollow">shells</a> or natively on top of the bare-bones image. <br/></p>

<h1 id="open-logic">Open logic</h1>

<p>Let’s see how in detail using the <a href="https://man.sr.ht/~whereiseveryone/builds.sr.ht-guix-cookbook/" rel="nofollow">cookbook</a> as a starting point, and taking as a complete example the <code>fw-open-logic</code> <a href="/csantosb/tag:openlogic" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">openlogic</span></a> firmware package which comes with the <a href="https://infosec.press/csantosb/guix-channels#electronics-channel" rel="nofollow">electronics guix channel</a>. <br/>
Get it with: <br/></p>

<pre><code class="language-sh">guix install fw-open-logic:out
</code></pre>

<p><a href="https://github.com/open-logic/open-logic" rel="nofollow">Open logic</a> is a useful <a href="/csantosb/tag:vhdl" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">vhdl</span></a> library of commonly used components, implemented in a reusable and vendor/tool-independent way.  As any other <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a> library, it includes tests sets for any of its components, using the <a href="https://infosec.press/csantosb/on-testing#vunit" rel="nofollow">vunit</a> utility in this case. <br/>
To run the full tests suite use (user wide using the default <code>$GUIX_PROFILE</code>), install its dependencies, defined in a <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/manifest.scm" rel="nofollow">manifest.scm</a> file (<code>ghdl-clang</code> and <code>python-vunit</code> in this case). <br/></p>

<pre><code class="language-sh">cd open-logic
guix install -m .builds/manifest.scm
cd sim
python3 run.py --ghdl -v
</code></pre>

<p>or local to the project, using <a href="https://infosec.press/csantosb/guix-crash-course#profiles-and-generations" rel="nofollow">a profile</a> <br/></p>

<pre><code class="language-sh">cd open-logic
mkdir _deps
export GUIX_PROFILE=open-logic/_deps
guix install -P $GUIX_PROFILE -m .builds/manifest.scm
. $GUIX_PROFILE/etc/profile
cd sim
python3 run.py --ghdl -v
</code></pre>

<h2 id="go-remote">go remote</h2>

<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/ci2.png" alt="img"> <br/>
Now, how do we proceed online using <a href="/csantosb/tag:sourcehut" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">sourcehut</span></a> <a href="/csantosb/tag:ci" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ci</span></a> <code>builds</code> facility ? <a href="https://infosec.press/csantosb/sourcehut-crash-course#builds" rel="nofollow">Builds</a> will pop up a new environment based on an up to date <code>guix-system</code> image when we push a commit to <code>git.sr.ht</code>, provided we include a <code>.build.yml</code> build manifest file, or by a <code>.build</code> folder with up to 4 build manifest files, at the root of the git project [1]. Be careful: consider that this image is <a href="https://git.sr.ht/~sircmpwn/builds.sr.ht/tree/master/item/images/guix" rel="nofollow">built daily</a> using a <a href="https://git.sr.ht/~sircmpwn/builds.sr.ht/tree/master/item/contrib/crontab" rel="nofollow">crontab</a> job, which is a good and a bad thing at the same time. From one side, you won’t be using the same environment for your tests, which breaks <a href="/csantosb/tag:reproducibility" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">reproducibility</span></a> (see <strong>comments</strong> section below). On the other side, <a href="/csantosb/tag:guix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">guix</span></a> is a rolling release, and new fancy features and new fixes are added every day. Keep this in mind. <br/>
Let’s create a <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds" rel="nofollow">.builds</a> folder in a topic <code>test branch</code>, with the following contents: <br/></p>

<p>    <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/manifest.scm" rel="nofollow">manifest.scm</a>, list of dependencies in our project <br/>
    <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/guix.scm" rel="nofollow">guix.scm</a>, default guix repository, redundant, included here for convenience <br/>
    <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/channels.scm" rel="nofollow">channels.scm</a>, list of <a href="https://infosec.press/csantosb/guix-channels" rel="nofollow">guix channels</a> remote repositories, in addition to the default guix repository, from where we pull packages <br/>
    We will be using here my own <a href="https://infosec.press/csantosb/guix-channels#electronics-channel" rel="nofollow">electronics channel</a> (no substitutes), as well as the <a href="https://codeberg.org/guix-science/guix-science" rel="nofollow">guix science</a> channel (which provides substitutes). <br/>
    (note how here we load the local <code>guix.scm</code> file, instead of making use of the <code>%default-channels</code> global variable) <br/></p>

<p>    <code>scheme
    (load &#34;guix.scm&#34;)
    ;;; %default-channels
</code>
    <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/key.pub" rel="nofollow">key.pub</a>, <a href="https://man.sr.ht/~whereiseveryone/builds.sr.ht-guix-cookbook/" rel="nofollow">auth key</a> to access <a href="https://infosec.press/csantosb/guix-crash-course#packages" rel="nofollow">substitutes</a> of packages in guix channels <br/></p>

<h3 id="build-manifests">build manifests</h3>

<p>From now on, every new push to the <code>test</code> <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> branch will trigger the execution of the tasks defined in the three <a href="https://man.sr.ht/builds.sr.ht/#build-manifests" rel="nofollow">build manifest files</a> <br/></p>

<p>    <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/profile1.yml" rel="nofollow">profile1</a> <br/>
    <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/profile2.yml" rel="nofollow">profile2</a> <br/>
    <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/shell1.yml" rel="nofollow">shell1</a> <br/></p>

<p>The two profile build manifest files use a slightly different approach, and are given here for comparison purposes only. The shell build manifest uses an isolated shell container <em>within</em> the image itself to illustrate this feature. <br/>
Inside the manifests, I declare the image to use, <code>guix</code>, and the global environment variables sourced before each task is run: <code>prj</code> (project name), <code>srv</code> (list of servers with substitutes), <code>manifest</code> and <code>channels</code> (pointing to the corresponding files) and <code>key</code> (same). It is important to declare a trigger action, to receive an email with all relevant information in case of failure (log, id, commit, etc.). <br/></p>

<h3 id="tasks">tasks</h3>

<p>What’s interesting here is the list of tasks. Some of them are common to all three manifests <br/></p>

<p>    <strong>env</strong>, useful only for debugging <br/>
    <strong>guix__update__channels</strong>, replace the default project local <code>guix.scm</code> file by the output of <br/></p>

<p>    <code>sh
    guix describe --format=channels
</code></p>

<p>    The goal here is avoid pulling latest guix upstream, useless and cpu and time consuming, and using the local version instead. Remember that the guix system image we are using here is <a href="https://git.sr.ht/~sircmpwn/builds.sr.ht/tree/master/item/images/guix" rel="nofollow">updated daily</a>. <br/></p>

<p>        <strong>guix__auth</strong>, runs the authorize command to add the <code>key.pub</code> file to guix, so that we will be able to download package substitutes when necessary <br/></p>

<p>        <code>sh
        sudo guix archive --authorize &lt; &#34;$key&#34;
</code></p>

<p>        Here, one may opt by doing a <br/></p>

<p>        <code>sh
        guix pull --channels=&#34;$channels&#34;
</code></p>

<p>        as in <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/profile2.yml" rel="nofollow">profile2</a>, to set the revision of the guix channels we are using (remember channels are nothing but git repositories). <br/>
        Note how in <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/profile1.yml" rel="nofollow">profile1</a> and <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/shell1.yml" rel="nofollow">shell1</a> we opt for a different approach. <br/>
        <strong>guix__update__profile</strong>, where we create a <code>_deps</code> folder to be used as a local <code>$GUIX_PROFILE</code> (defined in <code>.envrc</code>). <br/>
        Then, one of <br/></p>

<p>        <code>sh
        # profile1
        guix time-machine --channels=&#34;$channels&#34; -- \
             package -p &#34;$GUIX_PROFILE&#34; \
             --substitute-urls=&#34;$srv&#34; \
             -m &#34;$manifest&#34;
</code></p>

<p>        or <br/></p>

<p>        <code>sh
        # profile2
        guix \
            package -p &#34;$GUIX_PROFILE&#34; \
            --substitute-urls=&#34;$srv&#34; \
            -m &#34;$manifest&#34;
</code></p>

<p>        will install packages in <code>$manifest</code> into the <code>$GUIX_PROFILE</code>. I’m using here the <a href="https://infosec.press/csantosb/guix-crash-course#time-machine" rel="nofollow">time-machine</a> mechanism to set the revision of the guix channels, depending if <code>guix pull</code> was run in the previous stage or not. <br/>
        <strong>vunit</strong>, sets env variables in <code>.envrc</code> and runs <code>python3 run.py --ghdl -v</code> inside <code>sim</code> directory <br/>
        Note that here, we are using <code>ghdl-clang</code> and <code>python-vunit</code> packages, provided respectively by <code>guix-science</code> and the <code>electronics</code> channel. <br/>
        <strong>guix__shell__test</strong>, used by <a href="https://git.sr.ht/~csantosb/ip.open-logic/tree/test/item/.builds/shell1.yml" rel="nofollow">shell1</a>, make use of <code>time-machine</code> (no former <code>guix pull</code>, then), to create a <a href="https://infosec.press/csantosb/guix-crash-course#time-machine%23shell-containers" rel="nofollow">shell container</a>, where to install project dependencies. Then, if calls inmediately <code>run.sh</code> to run the unit tests <br/></p>

<p>        <code>sh
        guix time-machine --channels=&#34;$channels&#34; -- shell -C --substitute-urls=&#34;$srv&#34; -m &#34;$manifest&#34; -- ./.builds/run.sh
</code></p>

<h2 id="comments">comments</h2>

<p>You may check the logs of <a href="https://builds.sr.ht/~csantosb/job/1384658" rel="nofollow">profile1</a>, <a href="https://builds.sr.ht/~csantosb/job/1384659" rel="nofollow">profile2</a> and <a href="https://builds.sr.ht/~csantosb/job/1384660" rel="nofollow">shell1</a> manifests, including a section with logs per task, to better understand what’s going on here. Remember that <a href="/csantosb/tag:sourcehut" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">sourcehut</span></a> gives <a href="https://man.sr.ht/builds.sr.ht/build-ssh.md" rel="nofollow">ssh access</a> to the builds by connecting to the runners in case of failures, which provides a practical way of debugging the manifest files. <br/>
You may see how, using the remove guix image, it is possible to deploy a series of tasks to test our <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a> design as we develop it: we will get an email in case of failure to pass the tests. Here, I present three approaches: <code>guix pulling</code> to set the repositories revisions on use; <code>time-machine</code>, to achieve the same, and <code>guix shell</code> to create an isolated container. These three alternatives are not necessary here, of course, but are given as a simple and practical demo of what can be achieved with <a href="/csantosb/tag:guix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">guix</span></a>, <a href="/csantosb/tag:sourcehut" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">sourcehut</span></a> and <a href="/csantosb/tag:ci" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ci</span></a>. <br/>
To conclude this long post, it is important to stress once again that the point on using <a href="/csantosb/tag:guix" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">guix</span></a> resides in its <a href="https://infosec.press/csantosb/use-guix#reproducibility" rel="nofollow">reproducibility</a> capabilities. By keeping a couple of <a href="/csantosb/tag:plaintext" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">plaintext</span></a> files, namely the <a href="https://infosec.press/csantosb/guix-crash-course#manifest-channels" rel="nofollow">manifest.scm and channels.scm</a>, one can obtain <a href="/csantosb/tag:determinism" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">determinism</span></a> in the execution of the tests. Even if the guix image is upgraded and rebuilt daily (and so it changes), by fixing the revision of our channels (remember, <code>guix pull</code> or <code>guix time-machine</code>) we obtain always the same products out of our tests, as we run the same (project and tests) code, within exactly the same environment. <br/></p>

<hr>

<p>[1] It is also possible to automatically submit builds when a patch to a repo with build manifests is sent to a mailing list. This is achieved by appending the project name as a prefix to the subject of the message, for example [PATCH project-name]. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/ci-sourcehut</guid>
      <pubDate>Fri, 13 Dec 2024 10:18:11 +0000</pubDate>
    </item>
    <item>
      <title>git forges</title>
      <link>https://infosec.press/csantosb/git-forges</link>
      <description>&lt;![CDATA[img br/&#xA;Using #git is not the whole picture on #modernhw version control landscape. Git is great when one decides to locally follow changes, take diffs, create branches and so on. When it comes to collaboration with other people or to create a community around a common project, the need for extra tooling arises, and it becomes evident that git alone is not enough. A #gitforge fills this gap. !--more-- br/&#xA;Git bare repositories are a means of sharing the local git history remotely. Bares doesn’t show the worktree, as they are used solely as a common exchange place. This might be a remote server accessible through ssh, for example. Several different users may collaborate this way, provided they agree on a common workflow. Bares are more than enough for some needs. A front end on top of it may help to get an overview of what is going on and to take a look at branches, users and the like. All it takes to make this workflow useful is a little management, as git was designed with a fully distributed architecture in mind. Check the docs for more details. br/&#xA;Now, this approach is a bit too bare bones for most people. On top of bare git repositories, some decided to add extra functionality to ease using git remotely, calling for contributors attracted by buttons, colors, menus and most generally, being used to web frontends. Web forges include all usual suspects (project creation and configutation, markup rendering, user account and authorizations, project overview, etc.), as well as more advanced features (continuous integration, #ci, for testing and deployment with git hooks, wikis, code linters, built in actions, issue tracking, etc.). They abstract the use of git showing diffs, logs, issues threads, etc. As any other web gui tool, they come with its own set of inconvenients in what concern user freedom. br/&#xA;Popular examples are all around. #Gitlab may be deployed as a custom (not federated) instance, and is commonly found in research and public institutions; codeberg, based on forgejo, is a great example of how to deploy a lightweight #freesoftware instance of a collaborative forge (and the promise to federate on the fediverse). Many others exist, which more or less features, bells and whistles. You always have the choice. br/&#xA;&#xA;sourcehut&#xA;&#xA;#Sourcehut, as a collaborative platform, deserves special attention. It departs from mainstream forges, following a different paradigm based on the most robust, distributed and flexible technology at our hands since decades, plain text #email. Git, since its origins, includes a close integration with email, as they both share a distributed philosophy, avoiding central point of failure silos (surprising how mosft git forges tend to concentrate in silos). Sourcehut core architecture is based on mail exchange, patches and #maillists, which turns out to be a much more flexible approach than that of what most forges propose. Their concept of project goes well beyond that of usual workflows, integrating nicely git with email, wikis, bug trackers and build features. They’re still in an alpha stage, so expect the best still to come. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/forge.png" alt="img"> <br/>
Using <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> is not the whole picture on <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a> version control landscape. Git is great when one decides to locally follow changes, take diffs, create branches and so on. When it comes to collaboration with other people or to create a community around a common project, the need for extra tooling arises, and it becomes evident that git alone is not enough. A <a href="/csantosb/tag:gitforge" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">gitforge</span></a> fills this gap.  <br/>
<a href="https://git-scm.com/book/en/v2/Git-on-the-Server-Getting-Git-on-a-Server" rel="nofollow">Git bare repositories</a> are a means of sharing the local git history remotely. Bares doesn’t show the worktree, as they are used solely as a common exchange place. This might be a remote server accessible through ssh, for example. Several different users may collaborate this way, provided they agree on a common workflow. Bares are more than enough for some needs. A front end on top of it may help to get an overview of what is going on and to take a look at branches, users and the like. All it takes to make this workflow useful is a little management, as git was designed with a fully distributed architecture in mind. Check the docs for more details. <br/>
Now, this approach is a bit too bare bones for most people. On top of bare git repositories, some decided to add extra functionality to ease using git remotely, calling for contributors attracted by buttons, colors, menus and most generally, being used to web frontends. Web forges include all usual suspects (project creation and configutation, markup rendering, user account and authorizations, project overview, etc.), as well as more advanced features (continuous integration, <a href="/csantosb/tag:ci" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">ci</span></a>, for testing and deployment with git hooks, wikis, code linters, built in actions, issue tracking, etc.). They abstract the use of git showing diffs, logs, issues threads, etc. As any other web gui tool, they come with its own set of inconvenients in what concern user freedom. <br/>
Popular examples are all around. <a href="/csantosb/tag:Gitlab" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Gitlab</span></a> may be deployed as a custom (not federated) instance, and is <a href="https://about.gitlab.com/" rel="nofollow">commonly found</a> in research and public institutions; <a href="https://codeberg.org/" rel="nofollow">codeberg</a>, based on <a href="https://forgejo.org/" rel="nofollow">forgejo</a>, is a great example of how to deploy a lightweight <a href="/csantosb/tag:freesoftware" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">freesoftware</span></a> instance of a collaborative forge (and the promise to federate on the <a href="https://www.fediverse.to/" rel="nofollow">fediverse</a>). Many others exist, which more or less features, bells and whistles. You always <a href="https://drewdevault.com/2022/03/29/free-software-free-infrastructure.html" rel="nofollow">have the choice</a>. <br/></p>

<h1 id="sourcehut">sourcehut</h1>

<p><a href="/csantosb/tag:Sourcehut" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sourcehut</span></a>, as a collaborative platform, deserves special attention. It departs from mainstream forges, following a <a href="https://begriffs.com/posts/2018-06-05-mailing-list-vs-github.html" rel="nofollow">different paradigm</a> based on the most robust, distributed and flexible technology at our hands since decades, <a href="https://useplaintext.email/" rel="nofollow">plain text</a> <a href="/csantosb/tag:email" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">email</span></a>. Git, since its origins, includes a close integration with email, as they both share a distributed philosophy, avoiding central point of failure silos (surprising how mosft git forges tend to concentrate in silos). <a href="https://drewdevault.com/2018/07/02/Email-driven-git.html" rel="nofollow">Sourcehut</a> core architecture is based on mail exchange, patches and <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a>, which turns out to be a much more flexible approach than that of what most forges propose. Their concept of project goes well beyond that of usual workflows, integrating nicely git with email, wikis, bug trackers and build features. They’re still in an alpha stage, so expect the best still to come. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/git-forges</guid>
      <pubDate>Sun, 08 Dec 2024 22:36:11 +0000</pubDate>
    </item>
    <item>
      <title>sourcehut crash course</title>
      <link>https://infosec.press/csantosb/sourcehut-crash-course</link>
      <description>&lt;![CDATA[img br/&#xA;Everything you need to get started with sourcehut, an original and interesting #gitforge . !--more-- br/&#xA;#Sourcehut is organized in independent, closely related services. #Git repositories, #maillists, #wiki pages, #bug trackers, etc. belong to different domains, see below. They cooperate to provide a pleasant and practical experience when doing #modernhw. br/&#xA;Check the official documentation for details in all that follows. br/&#xA;Each user is given a ~alias. Each user’s service will appear under the SERVICE.sr.ht/~user domain, and are accessible in the top panels of the web interface. br/&#xA;Main services are: br/&#xA;&#xA;git&#xA;&#xA;git.sr.ht/~user/project, #git repositories. br/&#xA;There are no groups to combine them. I use dot notation to group my projects git.sr.ht/~user/group1.prj1. br/&#xA;&#xA;builds&#xA;&#xA;builds.sr.ht/~user, task building service, with the list of builds by the user, with user’s recent activity. br/&#xA;builds.sr.ht, similar to the previous. br/&#xA;Builds are trigger by a .build.yml manifest, or by a .build folder folder with up to 4 manifest files, at the root of a project. br/&#xA;It is also possible to automatically submit builds when a patch to a repo with build manifests is sent to a mailing list. This is achieved by appending the project name as a prefix to the subject of the message, for example [PATCH project-name]. br/&#xA;Check doc for details. br/&#xA;&#xA;hub&#xA;&#xA;The main tab, sourcehut, gives access to the hub hub.sr.ht/~user (identical to sr.ht/~user). br/&#xA;The hub displays user’s projects. br/&#xA;Projects are groups of git repositories, #maillists and bug trackers. There may be any of them in a project. br/&#xA;Sourcehut itself is organised as a project here https://sr.ht/~sircmpwn/sourcehut, and may be used as an example. br/&#xA;&#xA;todo&#xA;&#xA;todo.sr.ht/~user, ticket tracking service, with the list of trackers created by the user, with user’s recent activity br/&#xA;todo.sr.ht, similar to the previous br/&#xA;&#xA;man&#xA;&#xA;man.sr.ht/~user/NAME, #wiki service to create documentation, with the wikis created by the user br/&#xA;man.sr.ht, sourcehut documentation br/&#xA;man.sr.ht/builds.sr.ht, builds service documentation br/&#xA;man.sr.ht/hub.sr.ht, hub service documentation, etc. br/&#xA;&#xA;lists&#xA;&#xA;lists.sr.ht/~user/NAME, #email #maillists service, with the list created by the user, with user’s recent activity br/&#xA;lists.sr.ht, lists the user follows, with recent activity br/&#xA;&#xA;Extra services are alse provided: br/&#xA;&#xA;chat&#xA;&#xA;chat.sr.ht, without the user alias, is a paid service. It provides a bouncer to save history of IRC channels while not connected, and may be used from another IRC client. br/&#xA;&#xA;paste.sr.ht&#xA;&#xA;Paste hosting service. br/&#xA;&#xA;srht.site&#xA;&#xA;Once again, the official documentation gives in depth details about the previous. And remember, there is also hut to operate from the #cli. br/]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://git.sr.ht/~csantosb/csbwiki/blob/master/pics/sourcehut.png" alt="img"> <br/>
Everything you need to get started with <a href="https://sr.ht" rel="nofollow">sourcehut</a>, an <a href="https://infosec.press/csantosb/git-forges#sourcehut" rel="nofollow">original and interesting</a> <a href="/csantosb/tag:gitforge" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">gitforge</span></a> .  <br/>
<a href="/csantosb/tag:Sourcehut" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Sourcehut</span></a> is organized in independent, closely related services. <a href="/csantosb/tag:Git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">Git</span></a> repositories, <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a>, <a href="/csantosb/tag:wiki" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">wiki</span></a> pages, <a href="/csantosb/tag:bug" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">bug</span></a> trackers, etc. belong to different domains, see below. They cooperate to provide a pleasant and practical experience when doing <a href="/csantosb/tag:modernhw" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">modernhw</span></a>. <br/>
Check the <a href="https://man.sr.ht" rel="nofollow">official documentation</a> for details in all that follows. <br/>
Each user is given a <code>~alias</code>. Each user’s service will appear under the <code>SERVICE.sr.ht/~user</code> domain, and are accessible in the top panels of the web interface. <br/>
Main services are: <br/></p>

<h1 id="git">git</h1>

<p><code>git.sr.ht/~user/project</code>, <a href="/csantosb/tag:git" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">git</span></a> repositories. <br/>
There are no groups to combine them. I use dot notation to group my projects <code>git.sr.ht/~user/group1.prj1</code>. <br/></p>

<h1 id="builds">builds</h1>

<p><code>builds.sr.ht/~user</code>, task building service, with the list of builds by the user, with user’s recent activity. <br/>
<code>builds.sr.ht</code>, similar to the previous. <br/>
Builds are trigger by a <code>.build.yml</code> manifest, or by a <code>.build</code> folder folder with up to 4 manifest files, at the root of a project. <br/>
It is also possible to automatically submit builds when a patch to a repo with build manifests is sent to a mailing list. This is achieved by appending the project name as a prefix to the subject of the message, for example [PATCH project-name]. <br/>
Check <a href="https://man.sr.ht/builds.sr.ht/" rel="nofollow">doc</a> for details. <br/></p>

<h1 id="hub">hub</h1>

<p>The main tab, <code>sourcehut</code>, gives access to the hub <code>hub.sr.ht/~user</code> (identical to <code>sr.ht/~user</code>). <br/>
The hub displays user’s projects. <br/>
Projects are groups of git repositories, <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a> and bug trackers. There may be any of them in a project. <br/>
Sourcehut itself is organised as a project here <a href="https://sr.ht/~sircmpwn/sourcehut" rel="nofollow">https://sr.ht/~sircmpwn/sourcehut</a>, and may be used as an example. <br/></p>

<h1 id="todo">todo</h1>

<p><code>todo.sr.ht/~user</code>, ticket tracking service, with the list of trackers created by the user, with user’s recent activity <br/>
<code>todo.sr.ht</code>, similar to the previous <br/></p>

<h1 id="man">man</h1>

<p><code>man.sr.ht/~user/NAME</code>, <a href="/csantosb/tag:wiki" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">wiki</span></a> service to create documentation, with the wikis created by the user <br/>
<code>man.sr.ht</code>, <code>sourcehut</code> documentation <br/>
<code>man.sr.ht/builds.sr.ht</code>, builds service documentation <br/>
<code>man.sr.ht/hub.sr.ht</code>, hub service documentation, etc. <br/></p>

<h1 id="lists">lists</h1>

<p><code>lists.sr.ht/~user/NAME</code>, <a href="/csantosb/tag:email" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">email</span></a> <a href="/csantosb/tag:maillists" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">maillists</span></a> service, with the list created by the user, with user’s recent activity <br/>
<code>lists.sr.ht</code>, lists the user follows, with recent activity <br/></p>

<p><strong>Extra services</strong> are alse provided: <br/></p>

<h1 id="chat">chat</h1>

<p><code>chat.sr.ht</code>, without the user alias, is a paid service. It provides a <a href="https://sourcehut.org/blog/2021-11-29-announcing-the-chat.sr.ht-public-beta/" rel="nofollow">bouncer to save history of IRC channels</a> while not connected, and may be used from another IRC client. <br/></p>

<h1 id="paste-sr-ht">paste.sr.ht</h1>

<p>Paste hosting service. <br/></p>

<h1 id="srht-site">srht.site</h1>

<p>Once again, the <a href="https://man.sr.ht" rel="nofollow">official documentation</a> gives in depth details about the previous. And remember, there is also <a href="https://sr.ht/~emersion/hut/" rel="nofollow">hut</a> to operate from the <a href="/csantosb/tag:cli" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">cli</span></a>. <br/></p>
]]></content:encoded>
      <guid>https://infosec.press/csantosb/sourcehut-crash-course</guid>
      <pubDate>Fri, 29 Nov 2024 14:33:48 +0000</pubDate>
    </item>
  </channel>
</rss>