<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>weblog.masukomi.org - documentation</title>
    <subtitle>Autistic, ADHD, Geek. The weblog of Kay Rhodes (masukomi).</subtitle>
    <link rel="self" type="application/atom+xml" href="https://weblog.masukomi.org/tags/documentation/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://weblog.masukomi.org"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2025-11-03T11:51:37-05:00</updated>
    <id>https://weblog.masukomi.org/tags/documentation/atom.xml</id>
    <entry xml:lang="en">
        <title>Recording &amp; Sharing Terminal Sessions</title>
        <published>2022-10-11T16:57:00-04:00</published>
        <updated>2025-11-03T11:51:37-05:00</updated>
        
        <author>
          <name>
            Kay Rhodes
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://weblog.masukomi.org/posts/recording_and_sharing_terminal_sessions/"/>
        <id>https://weblog.masukomi.org/posts/recording_and_sharing_terminal_sessions/</id>
        
        <content type="html" xml:base="https://weblog.masukomi.org/posts/recording_and_sharing_terminal_sessions/">&lt;p&gt;This post describes how to make high quality recordings of terminal sessions that can be replayed in the terminal, or shared on the web. I’m defining high quality as recordings with zero typos, and relatively controlled timing between commands.&lt;/p&gt;
&lt;p&gt;to see an example of the type of output I’m talking about.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;
Videos and gifs take up a lot of disk space, don’t age well as display technology improves, and are problematic for folks low vision requirements.&lt;/p&gt;
&lt;p&gt;With the techniques below you can not only share examples of usage on your web pages, but within your tools themselves.&lt;/p&gt;
&lt;h2 id=&quot;goal--s&quot;&gt;Goal(s)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;record terminal session for demonstrating functionality&lt;/li&gt;
&lt;li&gt;replay said recordings locally on a terminal&lt;/li&gt;
&lt;li&gt;share said recordings online&lt;/li&gt;
&lt;li&gt;have that recording look good&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bonus points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;editability&lt;/li&gt;
&lt;li&gt;same file for terminal and web sharing&lt;/li&gt;
&lt;li&gt;not having to do get everything perfect &lt;em&gt;again&lt;/em&gt; when you need to record and updated version.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;/h2&gt;
&lt;h3 id=&quot;its-a-live--itsalive&quot;&gt;Its a live (itsalive)&lt;/h3&gt;
&lt;p&gt;same core idea as “doitlive” BUT with some additional functionality like being able to spit out a whole line, and drive interactive things like vim.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://gitlab.com/stavros/itsalive&quot;&gt;source code (GitLab)&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-it-does&quot;&gt;What It Does&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;create a file of commands to be executed&lt;/li&gt;
&lt;li&gt;have doitlive execute each of those commands as you type keys&lt;/li&gt;
&lt;li&gt;always perfectly, and quickly typed&lt;/li&gt;
&lt;li&gt;easy to control timing&lt;/li&gt;
&lt;li&gt;allows you to pause and take control
&lt;ul&gt;
&lt;li&gt;thus &lt;em&gt;actually&lt;/em&gt; doing it live in the middle of your script&lt;/li&gt;
&lt;li&gt;can pause with the &lt;code&gt;##@pause&lt;/code&gt; comment which is useful immediately after a script that needs you to interact with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;skip forward / back&lt;/li&gt;
&lt;li&gt;allows you to spew out the rest of a line with &lt;code&gt;CTRL+e&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;supports comments!
&lt;ul&gt;
&lt;li&gt;both comments for the viewer (start with #) &amp;amp; comments for the presenter (start with &lt;code&gt;##&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;allows you to have scripted newlines with no input&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Presenter View!!!&lt;/em&gt;
you can see how you’re progressing through your script, what came before, and what’s coming up next. All in a separate terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;problems&quot;&gt;problems&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;it’s &lt;em&gt;actually&lt;/em&gt; executing the commands.&lt;/li&gt;
&lt;li&gt;if you’re in the wrong dir, don’t have the commands the script needs installed, etc. it’ll blow up&lt;/li&gt;
&lt;li&gt;doesn’t support comments, so you can’t inline commentary for recordings&lt;/li&gt;
&lt;li&gt;not shareable because others would need the same things installed, sometimes in the same places, and what you’re doing may be specific to data on your system.&lt;/li&gt;
&lt;li&gt;it doesn’t directly handle, or record, interactive stuff
So, for example, you can have it execute a script, but if you have to navigate around the resulting output with arrow keys, it won’t record that. However, during playback it won’t interfere with you doing that. Until the interactive script exits you are &lt;em&gt;actually&lt;/em&gt; doing it live, not just pretending.&lt;/li&gt;
&lt;li&gt;during playback you’re literally just mashing keys. one keystroke per character output to the screen. So, if you’re recording the playback of your recording (see below) you’ll actually be recording gibberish. However, unless people are viewing the source code to your recording they won’t be able to tell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;notes&quot;&gt;Notes&lt;/h4&gt;
&lt;p&gt;It will start playback in the default shell. If you want to specify a particular shell to playback with set the shell environment variable to the executable for that shell. E.g. &lt;code&gt;SHELL=/opt/homebrew/opt/bash/bin/bash itsalive recording.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I keep my bash shell nice and minimal for recordings, but my day-to-day stuff is in fish.&lt;/p&gt;
&lt;h3 id=&quot;doitlive&quot;&gt;doitlive&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://doitlive.readthedocs.io/en/stable/&quot;&gt;docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/sloria/doitlive&quot;&gt;source code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;what-it-does&quot;&gt;What it does&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;create a file of commands to be executed&lt;/li&gt;
&lt;li&gt;have doitlive execute each of those commands as you type keys&lt;/li&gt;
&lt;li&gt;always perfectly, and quickly typed&lt;/li&gt;
&lt;li&gt;easy to control timing&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;problems&quot;&gt;Problems&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Same as &lt;code&gt;itsalive&lt;/code&gt;’s problems.&lt;/li&gt;
&lt;li&gt;because you’re just mashing keys things that you may have pasted in real life are typed in character by character. this makes you look like an &lt;em&gt;amazing&lt;/em&gt; typist, but it does take longer, because unlike &lt;code&gt;itsalive&lt;/code&gt; there’s no key combo to finish off the line in one stroke.&lt;/li&gt;
&lt;li&gt;because of its lack of ability to pause &amp;amp; resume playback interactive things can be a little problematic.&lt;/li&gt;
&lt;li&gt;because of its lack of presenter mode it is harder to time things well during recording.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;notes&quot;&gt;Notes&lt;/h4&gt;
&lt;p&gt;It will start playback in the default shell. If you want to specify a particular shell to playback with set the shell environment variable to the executable for that shell. E.g. &lt;code&gt;SHELL=/opt/homebrew/opt/bash/bin/bash doitlive recording.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I keep my bash shell nice and minimal for recordings, but my day-to-day stuff is in fish.&lt;/p&gt;
&lt;h3 id=&quot;script--unix-command&quot;&gt;script (unix command)&lt;/h3&gt;
&lt;p&gt;old unix command
BSD version (macOS) and Linux version are different.
Linux needs &lt;code&gt;scriptreplay&lt;/code&gt;. macOS version you can just point the same tool at a file and say &lt;code&gt;-p&lt;/code&gt; to “play” it back.&lt;/p&gt;
&lt;h4 id=&quot;what-it-does&quot;&gt;What it does&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;records what you type and what came out&lt;/li&gt;
&lt;li&gt;records the timings (or not)&lt;/li&gt;
&lt;li&gt;the file could be run on the command line by others for downloadable examples.
&lt;ul&gt;
&lt;li&gt;I believe the format is the same on BSD and Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;problems&quot;&gt;Problems&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;no way to convert these files directly to SVG or GIF or asciinema files (AFAIK)&lt;/li&gt;
&lt;li&gt;it’s nigh-impossible to get the timing right, and not show off bad  / slow typing&lt;/li&gt;
&lt;li&gt;editing of content or timing is not really possible
&lt;ul&gt;
&lt;li&gt;technically you can do it with &lt;a rel=&quot;external&quot; href=&quot;https://savannah.gnu.org/projects/teseq&quot;&gt;teseq&lt;/a&gt; which is … not a joy
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://asciinema.org/a/7445&quot;&gt;Recording of How to edit here (9 min)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;script -&amp;gt; file -&amp;gt; teseq -&amp;gt; new file -&amp;gt; editor -&amp;gt; reseq&lt;/li&gt;
&lt;li&gt;editing with teseq is doable, but the file format is &lt;em&gt;not&lt;/em&gt; very easy to work with.&lt;/li&gt;
&lt;li&gt;one thing it &lt;em&gt;can&lt;/em&gt; do that’s useful is edit timings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;asciinema&quot;&gt;Asciinema&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://asciinema.org&quot;&gt;asciinema.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/asciinema&quot;&gt;GitHub repo&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/asciinema/asciinema-player&quot;&gt;Player (js + css)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://github.com/asciinema/asciinema&quot;&gt;terminal session recorder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can self-host (just needs the &lt;code&gt;.js&lt;/code&gt; and &lt;code&gt;.css&lt;/code&gt; files), or upload your recordings to Asciinema.org. Who knows how long Asciinema.org will continue to exist though.&lt;/p&gt;
&lt;h4 id=&quot;what-it-does&quot;&gt;What it does&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;records what you type and what came out&lt;/li&gt;
&lt;li&gt;records the timings&lt;/li&gt;
&lt;li&gt;stores a format that can be shared via a web page&lt;/li&gt;
&lt;li&gt;stores in a format that can be replayed in a terminal&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;problems&quot;&gt;Problems&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;editing is not possible.
&lt;ul&gt;
&lt;li&gt;content or timing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;power-up-combo&quot;&gt;Power-up Combo&lt;/h2&gt;
&lt;p&gt;how to make sweet looking recordings without typos or weird pauses.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;figure out exactly what commands you want to execute&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;create a file &lt;code&gt;itsalive&lt;/code&gt; (or &lt;code&gt;doitlive&lt;/code&gt;) with those commands
My recommendation is to use &lt;code&gt;itsalive&lt;/code&gt; though because of the ability to record comments to yourself and the viewer.&lt;/p&gt;
&lt;p&gt;Note that it’s not going to be recording timings, or edits or anything like that. It just records the commands you enter, and the file is &lt;em&gt;only&lt;/em&gt; those commands, so it’s really simple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;add &lt;code&gt;asciinema rec &amp;lt;filename&amp;gt;&lt;/code&gt; to the start of it so that it starts &lt;code&gt;asciinema&lt;/code&gt; recording&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;add a  &lt;code&gt;##@pause&lt;/code&gt; comment in your script and then type &lt;code&gt;^d&lt;/code&gt; to exit &lt;code&gt;asciinema&lt;/code&gt; without seeing the word &lt;code&gt;exit&lt;/code&gt; typed out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;launch &lt;code&gt;itsalive myfile.sh&lt;/code&gt; or &lt;code&gt;SHELL=/path/to/shell itsalive myfile.sh&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;launch the presenter view in a separate terminal &lt;code&gt;itsalive presenter_view&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;click back into your original terminal but keep presenter view visible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Watch the presenter view&lt;/em&gt; not the real terminal. As you mash keys it’ll show you your progress against the characters in the line. This makes it trivial to hit &lt;code&gt;CTRL+e&lt;/code&gt; at the right point to make it look like you pasted, or to quickly finish off long lines for any other reason.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mash keys / hit return at appropriate times to move through the steps of the script&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Party.&lt;/p&gt;
&lt;p&gt;Now you’ve got a shell script for itsalive and an asciinema file to do with as you want. You probably don’t need the doitlive anymore, as it’ll likely produce different results when run months, or years, in the future, but maybe it’ll be useful to use as a starting point when you need to make a new recording for an updated version of the tool.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;real-world-example&quot;&gt;Real World Example&lt;/h2&gt;
&lt;p&gt;Here are the things I used to make some documentation for &lt;a rel=&quot;external&quot; href=&quot;https://github.com/masukomi/masuconfigs/blob/master/bin/git-scripts/git-link-to-commit&quot;&gt;my git link-to-commit script&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What follows is the bash file that I ran with &lt;code&gt;itsalive&lt;/code&gt;. Things of note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lines starting with &lt;code&gt;##&lt;/code&gt; are notes to myself because I’m watching the &lt;code&gt;presenter_view&lt;/code&gt; as I run it.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;#&lt;/code&gt; lines are comments that will be included in the output.&lt;/li&gt;
&lt;li&gt;The blank lines are significant, in that they actually cause a return to be emitted as if you hit return on the terminal.&lt;/li&gt;
&lt;li&gt;I’m kicking off the &lt;code&gt;asciinema&lt;/code&gt; recording from &lt;em&gt;within&lt;/em&gt; the &lt;code&gt;itsalive&lt;/code&gt; script so that the recording does not include me kicking off the &lt;code&gt;itsalive&lt;/code&gt; playback.&lt;/li&gt;
&lt;li&gt;The first &lt;code&gt;##@pause&lt;/code&gt; line is because the first invocation of &lt;code&gt;git link-to-commit&lt;/code&gt; is going to require me to interact with a pull-down, so I need to pause the playback.&lt;/li&gt;
&lt;li&gt;The second one is because I haven’t figured out how to make it emit a &lt;code&gt;CTRL+d&lt;/code&gt; to stop &lt;code&gt;asciinema&lt;/code&gt;’s recording. So I need to have interactive control over the terminal. I could have had it type &lt;code&gt;exit&lt;/code&gt; but that would have been ugly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Getting the timing right is still a bit of an art. The &lt;code&gt;presenter_view&lt;/code&gt; really helped, but I needed to re-record a few times to get all the interactions and timings smooth enough. So, I just started the script off by having it delete any prior recordings (if present).&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;rm&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; git-link-to-commit.asciinema&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;  /dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;# MOVE FAST AFTER THIS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;asciinema&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; rec&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; git-link-to-commit.asciinema&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;n1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; generate a link&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;# remember to mash then ^e when you get to the hash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; link-to-commit&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; 2a15b8dea0ae606dedb8335e1c3106342e2d79ed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#@pause&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#  ^r to RESUME playback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; skip the &amp;quot;choose a repo&amp;quot; step&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;# remember to mash then ^e when you get to the hash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; link-to-commit&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; origin&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; 2a15b8dea0ae606dedb8335e1c3106342e2d79ed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;# EXIT ASCIINEMA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#@pause&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;# HIT ^d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;# EXIT itsalive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;exit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;demo&quot;&gt;Demo&lt;/h2&gt;
&lt;p&gt;The final result.&lt;/p&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;https://weblog.masukomi.org/asciinema-player/asciinema-player.css&quot; /&gt;
&lt;script src=&quot;https://weblog.masukomi.org/asciinema-player/asciinema-player.min.js&quot;&gt;&lt;/script&gt;
&lt;div id=&quot;asciinema-git-link-to-commit-asciinema&quot; class=&quot;asciinema-player&quot;&gt;&lt;/div&gt;
&lt;script&gt;
	AsciinemaPlayer.create(
		&quot;https://weblog.masukomi.org/asciinema/git-link-to-commit.asciinema&quot;,
		document.getElementById(&quot;asciinema-git-link-to-commit-asciinema&quot;),
		// terminalLineHeight: 2 because at larger font sizes the lines start to overlap.
		{ terminalLineHeight: 2 }
	);
&lt;/script&gt;
</content>
        
    </entry>
</feed>
