<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Kuba Martin</title>
    <link>https://kubamartin.com/posts/</link>
    <description>Recent content in Posts on Kuba Martin</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Fri, 31 Jan 2025 00:00:01 +0100</lastBuildDate><atom:link href="https://kubamartin.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Jujutsu VCS Introduction and Patterns</title>
      <link>https://kubamartin.com/posts/introduction-to-the-jujutsu-vcs/</link>
      <pubDate>Fri, 31 Jan 2025 00:00:01 +0100</pubDate>
      
      <guid>https://kubamartin.com/posts/introduction-to-the-jujutsu-vcs/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/jj-vcs/jj&#34;&gt;Jujutsu&lt;/a&gt; (jj), a new version control system written in Rust, has popped up on my radar a few times over the past year. Looked interesting based on a cursory look, but being actually pretty satisfied with Git, and not having major problems with it, I haven&amp;rsquo;t checked it out.&lt;/p&gt;
&lt;p&gt;That is, until last week, when I finally decided to give it a go! I dived into a couple blog posts for a few of hours, and surprisingly (noting that we&amp;rsquo;re talking about a VCS) I found myself enjoying it a lot, seeing the consistent design, and overall simplicity it managed to achieve. This post is meant to give you a feel for what&amp;rsquo;s special about jj, and also describe a few patterns that have been working well for me, and which really are the reason I&amp;rsquo;m enjoying it.&lt;/p&gt;
&lt;p&gt;Before we dive in, one last thing you should take note of, is that most people use jj with its Git backend. You can use jj with your existing Git repos and reap its benefits in a way that is completely transparent to others you&amp;rsquo;re collaborating with. Effectively, you can treat it like a Git frontend.&lt;/p&gt;
&lt;h2 id=&#34;undo&#34;&gt;Undo&lt;/h2&gt;
&lt;p&gt;Before I get to the meat, something that will surely be very useful for any of your experimentation with jj, and something I would&amp;rsquo;ve loved to have had in Git when I was learning it - you can undo any jj operation using &lt;code&gt;jj undo&lt;/code&gt;, and view an operation log using &lt;code&gt;jj operation log&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;changes&#34;&gt;Changes&lt;/h2&gt;
&lt;p&gt;Changes are the core primitive you&amp;rsquo;ll be working with in jj. In Git you had commits, in jj you have changes. A jj change is, however, &lt;em&gt;mutable&lt;/em&gt;. A change can be modified. It&amp;rsquo;s ID, however, is immutable and randomly generated - it stays constant while you iterate on the change. A change refers to a &lt;em&gt;revision&lt;/em&gt; (otherwise called a snapshot) which for our purposes is always a Git commit. As you keep working on and modifying a change, the commit SHA it refers to will change.&lt;/p&gt;
&lt;p&gt;So to recap - immutable change IDs, mutable changes, mutable revision IDs (Git SHAs), immutable underlying revisions (snapshots - commits). Changes may eventually be marked as immutable - by default this happens (more or less) when they become part of the main branch or a Git tag.&lt;/p&gt;
&lt;p&gt;While in Git you generally organize your commits in branches, and a commit that&amp;rsquo;s not part of a branch is scarily called a &amp;ldquo;detached HEAD&amp;rdquo;, in jj it&amp;rsquo;s completely normal to work on changes that are not on branches. &lt;code&gt;jj log&lt;/code&gt; is the main command to view the history and tree of changes, and will default to showing you a very reasonable set of changes that should be relevant to you right now - that is (more or less) any local mutable changes, as well as some additional changes for context (like the tip of your main branch).&lt;/p&gt;
&lt;p&gt;Changes in jj &lt;em&gt;can&lt;/em&gt; be marked with bookmarks (what jj calls branches), but you&amp;rsquo;d generally do that only for the purpose of pushing to a remote Git server, like GitHub, not local organization.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see a sample of a &lt;code&gt;jj log&lt;/code&gt; invocation:&lt;/p&gt;

&lt;pre class=&#34;terminal-snippet&#34;&gt;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:green;&#34;&gt;@&lt;/span&gt;  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:purple;&#34;&gt;w&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;twtpovp&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;2025-01-29 23:46:57&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:blue;&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;dae3649&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;
│  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:green;&#34;&gt;(empty)&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:green;&#34;&gt;(no description set)&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;◆&lt;/span&gt;  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;n&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;zvlmkly&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-29 23:33:23&lt;/span&gt; &lt;span style=&#34;color:purple;&#34;&gt;main&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;e&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;04f25b9&lt;/span&gt;
│  add &#39;0000&#39;
│ ○    &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;u&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;knznrnn&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-29 23:43:20&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;70fa7f9&lt;/span&gt;
│ ├─╮  &lt;span style=&#34;color:green;&#34;&gt;(empty)&lt;/span&gt; a merge
│ │ ○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;sosyttm&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-29 23:37:52&lt;/span&gt; &lt;span style=&#34;color:purple;&#34;&gt;branch-2&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;35&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;8031f0&lt;/span&gt;
│ │ │  add &#39;1111&#39;
│ ○ │  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;plvonvm&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-29 23:37:10&lt;/span&gt; &lt;span style=&#34;color:purple;&#34;&gt;branch-1&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;608854&lt;/span&gt;
│ │ │  add &#39;dddd&#39;
│ ○ │  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;m&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;oquvotw&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-29 23:36:43&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;49e6156&lt;/span&gt;
├─╯ │  add &#39;cccc&#39;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;◆&lt;/span&gt;   │  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;lnpvmqs&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-29 23:30:48&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;3f&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;373f8e&lt;/span&gt;
├───╯  add &#39;bbbb&#39;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;◆&lt;/span&gt;  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;l&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;ummnokp&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-29 23:30:32&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;604a80&lt;/span&gt;
│  add &#39;aaaa&#39;
~
&lt;/pre&gt;


&lt;div style=&#34;font-size: 0.9em; color: #666; margin-top: -10px; margin-bottom: 15px; font-style: italic;&#34;&gt;
Quick tip: you can use &lt;a href=&#34;https://github.com/theZiz/aha&#34; style=&#34;color: #0366d6;&#34;&gt;aha&lt;/a&gt; to convert colorized shell output to HTML.
&lt;/div&gt;

&lt;p&gt;The IDs on the left side are change IDs, while on the right size you have revisions (commit SHAs). Unique prefixes of those IDs are marked in color, and you can use those prefixes instead of the full form when referring to changes. A change can be reffered to in jj commands by its ID, the underlying commit SHA, or any bookmark referring to it.&lt;/p&gt;
&lt;p&gt;There is one more, slightly crazy, thing about jj changes. Git has a special feature called the Git index to hold any as of yet uncommitted changes (where you &lt;code&gt;git add&lt;/code&gt;, and then &lt;code&gt;git commit&lt;/code&gt; them). In jj any files you modify are always in the scope of a change. Any modifications you make automatically become part of the current change, which is called the working copy. In the &lt;code&gt;jj log&lt;/code&gt; output, this working copy is indicated by the &lt;code&gt;@&lt;/code&gt; symbol. You create a new working change using &lt;code&gt;jj new&lt;/code&gt; (by default as a child of the current change), and give it a description using &lt;code&gt;jj describe&lt;/code&gt; (it starts out having an empty message). You can use &lt;code&gt;jj status&lt;/code&gt; to get the metadata of the current change.&lt;/p&gt;
&lt;p&gt;This much said, here&amp;rsquo;s a quick demo of changing a file as part of a new change.&lt;/p&gt;

&lt;script src=&#34;https://asciinema.org/a/XpE2I2f0bYp7EYudt1hH9lWlN.js&#34; id=&#34;asciicast-XpE2I2f0bYp7EYudt1hH9lWlN&#34; async=&#34;true&#34;&gt;&lt;/script&gt;
&lt;div class=&#34;asciinema-caption&#34;&gt;Editing a file in a jj repo&lt;/div&gt;

&lt;p&gt;&lt;code&gt;jj&lt;/code&gt; on its own is an alias for &lt;code&gt;jj log&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;info-box&#34;&gt;
    &lt;div class=&#34;info-box-icon&#34;&gt;
        &lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
            &lt;circle cx=&#34;12&#34; cy=&#34;12&#34; r=&#34;10&#34;&gt;&lt;/circle&gt;
            &lt;line x1=&#34;12&#34; y1=&#34;16&#34; x2=&#34;12&#34; y2=&#34;12&#34;&gt;&lt;/line&gt;
            &lt;line x1=&#34;12&#34; y1=&#34;8&#34; x2=&#34;12.01&#34; y2=&#34;8&#34;&gt;&lt;/line&gt;
        &lt;/svg&gt;
    &lt;/div&gt;
    &lt;div class=&#34;info-box-content&#34;&gt;
        Most jj commands default to operating on the current working change, but let you operate on an arbitrary change (or set of changes!) via the &lt;code&gt;--revision / -r&lt;/code&gt; flag.
    &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id=&#34;pattern-git-stash&#34;&gt;Pattern: git stash&lt;/h3&gt;
&lt;p&gt;This whole thing about the working copy being a Change may sound weird, but it brings with it an important feature - you can operate on the working copy like on any other change. Personally, I&amp;rsquo;m a frequent user of &lt;code&gt;git stash&lt;/code&gt;. When I&amp;rsquo;m working on something, I often want to pause for a moment and work on / try something else, only to later come back to what I was working on (while leaving that other experiment as yet another stash).&lt;/p&gt;
&lt;p&gt;In jj, I can just &lt;code&gt;jj new @-&lt;/code&gt;, which will start a new change from the parent of my current working copy - leaving my working copy as a normal change with all its file modifications &amp;ldquo;committed&amp;rdquo;, so I can later come back to it via &lt;code&gt;jj edit&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&#34;info-box&#34;&gt;
    &lt;div class=&#34;info-box-icon&#34;&gt;
        &lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;&gt;
            &lt;circle cx=&#34;12&#34; cy=&#34;12&#34; r=&#34;10&#34;&gt;&lt;/circle&gt;
            &lt;line x1=&#34;12&#34; y1=&#34;16&#34; x2=&#34;12&#34; y2=&#34;12&#34;&gt;&lt;/line&gt;
            &lt;line x1=&#34;12&#34; y1=&#34;8&#34; x2=&#34;12.01&#34; y2=&#34;8&#34;&gt;&lt;/line&gt;
        &lt;/svg&gt;
    &lt;/div&gt;
    &lt;div class=&#34;info-box-content&#34;&gt;
        The &lt;code&gt;-&lt;/code&gt; after the &lt;code&gt;@&lt;/code&gt; means &#34;go one level up&#34;. It&#39;s basically &#34;take the working copy change, and go to its parent&#34;. We&#39;ll come back to this briefly later, but suffice it to say that there&#39;s a whole sensible expression language here, and &lt;code&gt;@--&lt;/code&gt; is similarly valid to refer to your grandparent change.
    &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id=&#34;editing-changes-in-weird-places&#34;&gt;Editing Changes in Weird Places&lt;/h2&gt;
&lt;p&gt;Another cool thing about changes is that you can freely edit any mutable change. &lt;code&gt;jj edit &amp;lt;id&amp;gt;&lt;/code&gt; lets you &amp;ldquo;check out&amp;rdquo; and edit a given change. You can also squish a new change right after another (between it and its children). You can then keep modifying files in the context of that change, and any descendants will automatically be rebased on top of it (with their underlying commit SHAs likely changing, but change IDs staying the same). That sounds a bit scary if you&amp;rsquo;re used to Git (and dealing with conflicts in the middle of a rebase) but fear not, it&amp;rsquo;s actually pretty seamless, and we&amp;rsquo;ll come back to it later.&lt;/p&gt;
&lt;p&gt;You can pass &lt;code&gt;-A&lt;/code&gt; and &lt;code&gt;-B&lt;/code&gt; to &lt;code&gt;jj new&lt;/code&gt; to indicate that you want to squish a new change after, or before, another change.&lt;/p&gt;
&lt;p&gt;With this, when I notice a mistake in a change 3 levels back, I can just &lt;code&gt;jj edit &amp;lt;that-change-id&amp;gt;&lt;/code&gt; (with my working copy remaining there for me to come back to), make a fix, which will auto-rebase all following changes (including my original working change), and then &lt;code&gt;jj edit&lt;/code&gt; to go back to my original working change.&lt;/p&gt;

&lt;script src=&#34;https://asciinema.org/a/sGxxrDzQJPVbsgraq1HiYbj1j.js&#34; id=&#34;asciicast-sGxxrDzQJPVbsgraq1HiYbj1j&#34; async=&#34;true&#34;&gt;&lt;/script&gt;
&lt;div class=&#34;asciinema-caption&#34;&gt;Editing previous changes with automatic rebase&lt;/div&gt;

&lt;p&gt;Occasionally you also need to rebase (move) a set of changes onto some change x, you can do that by using &lt;code&gt;jj rebase -s &amp;lt;change-id-to-rebase&amp;gt; -d &amp;lt;destination-change&amp;gt;&lt;/code&gt;. The &lt;code&gt;-s&lt;/code&gt; will bring all descendants along with the rebased change, and there are other variations of this command for different scenarios. E.g. &lt;code&gt;jj rebase -b &amp;lt;branch&amp;gt; -d &amp;lt;destination-change&amp;gt;&lt;/code&gt; will rebase the entire given branch onto a change, and with no arguments it just defaults to &lt;code&gt;-b @&lt;/code&gt;, so the current branch. In other words, to rebase the current branch onto main, it&amp;rsquo;s enough to run &lt;code&gt;jj rebase -d main&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;pattern-squishing-a-fix-before-the-current-change&#34;&gt;Pattern: Squishing a Fix Before the Current Change&lt;/h3&gt;
&lt;p&gt;You noticed a mistake in your last change, don’t want to fix it as part of this one, and instead want to squish a fix right before it, but you have already done some &amp;ldquo;uncommitted&amp;rdquo; work? Just do &lt;code&gt;jj new -B @&lt;/code&gt;. The &lt;code&gt;-B&lt;/code&gt; means it’s squished before the current working change (referred to via &lt;code&gt;@&lt;/code&gt;), and after the previous one (its parent). After you make the fix, you can go back to the original working change via &lt;code&gt;jj edit @+&lt;/code&gt; (&lt;code&gt;+&lt;/code&gt; is the opposite of &lt;code&gt;-&lt;/code&gt;). You could also make the fix in the original working change and run &lt;code&gt;jj split --interactive&lt;/code&gt; to use your favorite diff ui to select what to push down to a separate change placed right before the current one.&lt;/p&gt;
&lt;h2 id=&#34;bookmarks&#34;&gt;Bookmarks&lt;/h2&gt;
&lt;p&gt;In jj, instead of branches we have bookmarks. You create them using &lt;code&gt;jj bookmark create &amp;lt;name&amp;gt;&lt;/code&gt; (abbreviated to &lt;code&gt;jj b c &amp;lt;name&amp;gt;&lt;/code&gt;). You update a bookmark to point the current change using &lt;code&gt;jj bookmark set &amp;lt;name&amp;gt;&lt;/code&gt;. You track remote bookmarks (which will create local corresponding bookmarks that update on &lt;code&gt;jj git fetch&lt;/code&gt;) by doing &lt;code&gt;jj bookmark track &amp;lt;name&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When you add changes on top of a change that a bookmark is attached to, the bookmark won&amp;rsquo;t automatically move to your new change (like it would with a branch in Git), you have to &lt;code&gt;jj bookmark set&lt;/code&gt; it manually. You can push bookmarks attached to the current change via &lt;code&gt;jj git push&lt;/code&gt;. &lt;code&gt;jj git fetch&lt;/code&gt; will fetch updates to bookmarks from your remote (so generally updates to branches).&lt;/p&gt;
&lt;h3 id=&#34;pattern-stacked-prs&#34;&gt;Pattern: Stacked PRs&lt;/h3&gt;
&lt;p&gt;A common use case with services like GitHub is to split up a big change into multiple PRs, let&amp;rsquo;s say Multipart 1, Multipart 2 and Multipart 3 (from branches multipart-1, multipart-2, and multipart-3 respectively). Each of them is based on the previous one, so you effectively have the following graph, with bookmark pointers on the way:&lt;/p&gt;

&lt;pre class=&#34;terminal-snippet&#34;&gt;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:green;&#34;&gt;@&lt;/span&gt;  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:purple;&#34;&gt;vq&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;noywln&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;2025-01-30 18:57:23&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:blue;&#34;&gt;50&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;e48038&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;
│  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:green;&#34;&gt;(empty)&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:green;&#34;&gt;(no description set)&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;◆&lt;/span&gt;  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;sz&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;myonyt&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 18:47:38&lt;/span&gt; &lt;span style=&#34;color:purple;&#34;&gt;main&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;a7&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;9e03bf&lt;/span&gt;
│  another change on main
│ ○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;y&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;otmyvom&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 18:57:16&lt;/span&gt; &lt;span style=&#34;color:purple;&#34;&gt;multipart-3&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;58&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;11d6f6&lt;/span&gt;
│ │  add &#39;hhhh&#39;
│ ○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;z&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;zxlmyqq&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 18:57:16&lt;/span&gt; &lt;span style=&#34;color:purple;&#34;&gt;multipart-2&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;ca0376a&lt;/span&gt;
│ │  add &#39;gggg&#39;
│ ○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;sk&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;noxoxv&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 18:57:16&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;7&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;9356f49&lt;/span&gt;
│ │  add &#39;eeee&#39; and &#39;ffff&#39;
│ ○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;vt&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;rtywkl&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 18:51:08&lt;/span&gt; &lt;span style=&#34;color:purple;&#34;&gt;multipart-1&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;5e&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;dec115&lt;/span&gt;
│ │  add &#39;cccc&#39; and &#39;dddd&#39; (broken)
│ ○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;ss&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;vuqlmr&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 18:27:29&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;a5&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;9123a7&lt;/span&gt;
├─╯  add &#39;aaaa&#39; and &#39;bbbb&#39;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;◆&lt;/span&gt;  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;n&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;nlnvpml&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 18:27:03&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;ee7ba99&lt;/span&gt;
│  initial
~
&lt;/pre&gt;

&lt;p&gt;Now let&amp;rsquo;s say Multipart 1 got reviewed and you need to fix something. In Git, once you add a commit to it (or modify an existing one), you would have to manually rebase all the other branches. Annoying!&lt;/p&gt;
&lt;p&gt;How does jj help us here? We can just run &lt;code&gt;jj edit vt&lt;/code&gt; (&lt;code&gt;vt&lt;/code&gt; is a unique prefix of the broken change id), or &lt;code&gt;jj new -A vt&lt;/code&gt;, make the fix, and run &lt;code&gt;jj git push -b &amp;quot;glob:multipart-*&amp;quot;&lt;/code&gt;. Everything will be automatically rebased, and all the bookmarks will be updated and pushed. Effortless!&lt;/p&gt;

&lt;script src=&#34;https://asciinema.org/a/UcUKhLlIyiAaE6iRXu4OdL1E7.js&#34; id=&#34;asciicast-UcUKhLlIyiAaE6iRXu4OdL1E7&#34; async=&#34;true&#34;&gt;&lt;/script&gt;
&lt;div class=&#34;asciinema-caption&#34;&gt;Making fixes in stacked PRs&lt;/div&gt;

&lt;h2 id=&#34;merges&#34;&gt;Merges&lt;/h2&gt;
&lt;p&gt;Merges in jj are pretty boring - in a good way. You just create a change with multiple parents. E.g. &lt;code&gt;jj new x y z&lt;/code&gt; will create a change with three parents.&lt;/p&gt;
&lt;h2 id=&#34;conflicts&#34;&gt;Conflicts&lt;/h2&gt;
&lt;p&gt;One topic I haven&amp;rsquo;t mentioned yet, and is surely by now giving you an unsettling feeling deep inside about all I&amp;rsquo;ve said before, are conflicts. With all this rebasing, that&amp;rsquo;s &lt;strong&gt;got&lt;/strong&gt; to become a pain, right? Well, it doesn&amp;rsquo;t!&lt;/p&gt;
&lt;p&gt;As opposed to Git, where conflicts kind of break your workflow, in the sense that you have to resolve them prior to doing anything else, jj handles conflicts in a first-class manner. A change can just &amp;ldquo;be conflicted&amp;rdquo;. You can switch away from a conflicted change, you can create a new change on top of an existing conflicted change (and that will in turn also start out conflicted), you can edit a conflicted change, you can do anything. &lt;code&gt;jj status&lt;/code&gt; and &lt;code&gt;jj log&lt;/code&gt; will mention the conflict, but it won&amp;rsquo;t block you.&lt;/p&gt;

&lt;pre class=&#34;terminal-snippet&#34;&gt;
&lt;span style=&#34;color:green;&#34;&gt;~&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#005fd7;&#34;&gt;jj&lt;/span&gt;&lt;span style=&#34;color:dimgray;&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#00afff;&#34;&gt;log&lt;/span&gt;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:red;&#34;&gt;@&lt;/span&gt;    &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:purple;&#34;&gt;u&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;uxrrmuw&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;2025-01-30 19:54:21&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:blue;&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;7f2700a&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:red;&#34;&gt;conflict&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;
├─╮  &lt;span style=&#34;font-weight:bold;&#34;&gt;merge&lt;/span&gt;
│ ○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;q&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;lrwtlny&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 19:44:09&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;ae28ccf&lt;/span&gt;
│ │  add &#39;cccc&#39;
○ │  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;qtrswmw&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 19:43:59&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;6d6ab4a&lt;/span&gt;
├─╯  add &#39;bbbb&#39;
○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;k&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;nklsqnp&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 19:43:59&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;0b01706&lt;/span&gt;
│  add &#39;aaaa&#39;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;◆&lt;/span&gt;  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;z&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;zzzzzzz&lt;/span&gt; &lt;span style=&#34;color:green;&#34;&gt;root()&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;0000000&lt;/span&gt;
&lt;span style=&#34;color:green;&#34;&gt;~&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#005fd7;&#34;&gt;jj&lt;/span&gt;&lt;span style=&#34;color:dimgray;&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#00afff;&#34;&gt;status&lt;/span&gt;
Working copy changes:
&lt;span style=&#34;color:green;&#34;&gt;A typescript&lt;/span&gt;
&lt;span style=&#34;color:red;&#34;&gt;There are unresolved conflicts at these paths:&lt;/span&gt;
file.txt    &lt;span style=&#34;color:olive;&#34;&gt;2-sided conflict&lt;/span&gt;
Working copy : &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:purple;&#34;&gt;u&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;uxrrmuw&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:blue;&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;7f2700a&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:red;&#34;&gt;(conflict)&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; merge&lt;/span&gt;
Parent commit: &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;qtrswmw&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;6d6ab4a&lt;/span&gt; add &#39;bbbb&#39;
Parent commit: &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;q&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;lrwtlny&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;ae28ccf&lt;/span&gt; add &#39;cccc&#39;
&lt;/pre&gt;

&lt;p&gt;The conflict will be represented in the code via conflict markers:&lt;/p&gt;

&lt;pre class=&#34;terminal-snippet&#34;&gt;
aaaa
&lt;&lt;&lt;&lt;&lt;&lt;&lt; Conflict 1 of 1
%%%%%%% Changes from base to side #1
+bbbb
+++++++ Contents of side #2
cccc
&gt;&gt;&gt;&gt;&gt;&gt;&gt; Conflict 1 of 1 ends
&lt;/pre&gt;

&lt;p&gt;and you can either manually resolve this conflict by editing the code itself, or use &lt;code&gt;jj resolve&lt;/code&gt; to bring up your favorite three-way-merge tool (e.g. I&amp;rsquo;ve configured my jj to bring up a visual conflict resolver in Goland) and resolve it there.&lt;/p&gt;
&lt;p&gt;Once you fix the conflict in a change, all descendants of this change will also cease being conflicted. You could leave a change conflicted and only resolve the conflict in a follow-up child change - that is a completely valid and supported approach.&lt;/p&gt;

&lt;script src=&#34;https://asciinema.org/a/xwJxb5ue1pRJt6Iw1JZZhAHyN.js&#34; id=&#34;asciicast-xwJxb5ue1pRJt6Iw1JZZhAHyN&#34; async=&#34;true&#34;&gt;&lt;/script&gt;
&lt;div class=&#34;asciinema-caption&#34;&gt;Merge conflict resolution&lt;/div&gt;

&lt;h3 id=&#34;pattern-working-on-two-things-at-the-same-time&#34;&gt;Pattern: Working on Two Things at the Same Time&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve mentioned stacked PRs, but another situation you might have is working on two independent things in parallel. Let&amp;rsquo;s say on bookmarks &lt;code&gt;thing-1&lt;/code&gt; and &lt;code&gt;thing-2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In order to have both things simultaneosuly active in your codebase, you can create a development change via &lt;code&gt;jj new thing-1 thing-2 -m &amp;quot;dev&amp;quot;&lt;/code&gt;, that will be a merge between both of them, but will stay local and you&amp;rsquo;ll never push it (&lt;code&gt;-m&lt;/code&gt; just lets you give a description to a change when creating it, without a separate &lt;code&gt;jj describe&lt;/code&gt; invocation). You will however &lt;code&gt;jj edit&lt;/code&gt; this development change to do your work.&lt;/p&gt;

&lt;pre class=&#34;terminal-snippet&#34;&gt;
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:green;&#34;&gt;@&lt;/span&gt;    &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:purple;&#34;&gt;zv&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;tqnnxv&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;2025-01-30 22:42:29&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt; &lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:blue;&#34;&gt;5&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;28d6811&lt;/span&gt;&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;
├─╮  &lt;span style=&#34;font-weight:bold;&#34;&gt;dev&lt;/span&gt;
│ ○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;zm&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;smpynx&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 22:36:26&lt;/span&gt; &lt;span style=&#34;color:purple;&#34;&gt;thing-2&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;55cea26&lt;/span&gt;
│ │  changes to file2
○ │  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;v&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;nxwrykm&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 22:35:43&lt;/span&gt; &lt;span style=&#34;color:purple;&#34;&gt;thing-1&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;bcec585&lt;/span&gt;
├─╯  changes to file1
○  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;uxnvzsm&lt;/span&gt; &lt;span style=&#34;color:olive;&#34;&gt;me@kubamartin.com&lt;/span&gt; &lt;span style=&#34;color:teal;&#34;&gt;2025-01-30 22:34:43&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;0b&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;98fe5b&lt;/span&gt;
│  initial
&lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;filter: contrast(70%) brightness(190%);color:teal;&#34;&gt;◆&lt;/span&gt;  &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:purple;&#34;&gt;zz&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;zzzzzz&lt;/span&gt; &lt;span style=&#34;color:green;&#34;&gt;root()&lt;/span&gt; &lt;span style=&#34;font-weight:bold;&#34;&gt;&lt;/span&gt;&lt;span style=&#34;font-weight:bold;color:blue;&#34;&gt;00&lt;/span&gt;&lt;span style=&#34;filter: contrast(70%) brightness(190%);color:dimgray;&#34;&gt;000000&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Then, whenever you want to move some modifications into one of the branches, you can use &lt;code&gt;jj squash --into &amp;lt;target-change-id&amp;gt; &amp;lt;files&amp;gt;&lt;/code&gt; to move all modifications to a set of files down into one of the branches. There&amp;rsquo;s also &lt;code&gt;--interactive&lt;/code&gt; where you can use a diff tool to choose modifications to squash into another change, and finally there&amp;rsquo;s a &lt;a href=&#34;https://jj-vcs.github.io/jj/latest/cli-reference/#jj-absorb&#34;&gt;newer &lt;code&gt;jj absorb&lt;/code&gt; command&lt;/a&gt; which can automate this process in certain scenarios.&lt;/p&gt;

&lt;script src=&#34;https://asciinema.org/a/VAW2jZSzY3Z5qKYvhvBNLfjEf.js&#34; id=&#34;asciicast-VAW2jZSzY3Z5qKYvhvBNLfjEf&#34; async=&#34;true&#34;&gt;&lt;/script&gt;
&lt;div class=&#34;asciinema-caption&#34;&gt;Editing files in a merged dev-change and&lt;br&gt; selectively squashing the changes into branches&lt;/div&gt;

&lt;p&gt;In conclusion, you can keep working in a local-only merge-change of your branches, and selectively push down any modifications to the relevant branch (This setup would&amp;rsquo;ve seemed pretty scary before jj, right? I hope it&amp;rsquo;s a bit less scary now.), and then push just those branches themselves to the remote.&lt;/p&gt;
&lt;h2 id=&#34;revset-expressions&#34;&gt;Revset Expressions&lt;/h2&gt;
&lt;p&gt;jj commands operate on revisions or sets of revisions (revsets). You can refer to those directly, or use a special expression language to describe them. You&amp;rsquo;ve seen me refer to a change previously via &lt;code&gt;@-&lt;/code&gt;. That was a very simple expression that evaluated to the parent.&lt;/p&gt;
&lt;p&gt;There is, however, much more. There are functions - like &lt;code&gt;parents(x)&lt;/code&gt; to get the parents of a change - and operators - like &lt;code&gt;x+&lt;/code&gt; to refer to the child of x, or &lt;code&gt;x::&lt;/code&gt; for all descendants of x including x.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;jj log&lt;/code&gt; accepts a revset expression, so you can use it to experiment with them. The default revset it displays is also configurable. Overall, the expression language is powerful and consistent, with simple things being generally easy, and harder things being (presumably, I&amp;rsquo;ve honestly spent too little time with it) possible.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;https://v5.chriskrycho.com/essays/jj-init/#revisions-and-revsets&#34;&gt;this article&lt;/a&gt; for a much more extensive exploration of the jj expression language, and the &lt;a href=&#34;https://jj-vcs.github.io/jj/latest/revsets/&#34;&gt;jj docs&lt;/a&gt; themselves.&lt;/p&gt;
&lt;h3 id=&#34;pattern-partial-stashes&#34;&gt;Pattern: Partial Stashes&lt;/h3&gt;
&lt;p&gt;Another kind of stash I occasionally like to do is partial, where I temporarily roll back changes to a set of files to verify the before-after (e.g. confirm that a passing test was failing before).&lt;/p&gt;
&lt;p&gt;In jj the split command works well for this. Just &lt;code&gt;jj split --parallel modifiedFile.txt&lt;/code&gt; will move the file into a parallel change. You can do whatever you want to do, and later run &lt;code&gt;jj squash --from parallel_change_id&lt;/code&gt; to get the file modifications back into the current change.&lt;/p&gt;

&lt;script src=&#34;https://asciinema.org/a/SYe9MBwShu7uWuZJb2vJDffrk.js&#34; id=&#34;asciicast-SYe9MBwShu7uWuZJb2vJDffrk&#34; async=&#34;true&#34;&gt;&lt;/script&gt;
&lt;div class=&#34;asciinema-caption&#34;&gt;Partial stash using &lt;code&gt;jj split --parallel&lt;/code&gt;&lt;/div&gt;

&lt;h2 id=&#34;setting-up-jj-with-an-existing-git-repo&#34;&gt;Setting Up jj with an Existing Git Repo&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s trivial to start using jj with an existing git repo, though I&amp;rsquo;d advise cloning it fresh into a new directory.&lt;/p&gt;
&lt;p&gt;In a directory where you already have a git repo, you can just run &lt;code&gt;jj git init --colocate&lt;/code&gt;. Your &lt;code&gt;.git&lt;/code&gt; directory will stay in place, and jj will keep it updated, so e.g. your editor won&amp;rsquo;t be confused what&amp;rsquo;s happening. It integrates fairly well, with e.g. the working change - even though it&amp;rsquo;s backed by a commit - being presented as the git index, so your editor can still show files &amp;ldquo;modified in this change&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;should-you-switch&#34;&gt;Should You Switch?&lt;/h2&gt;
&lt;p&gt;The cost of switching is low, as it integrates seamlessly with your existing workflow. It frankly also takes a day tops to get used to, and there’s something to be said for using &lt;em&gt;nice&lt;/em&gt; things. Sure, you can make excellent tea in any food-safe kettle, but if you have a nice tea kettle, you’ll enjoy it every time you make tea. I use my vcs quite a lot, so why not make that pleasant too?&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope the above gave you an intuition for what Jujutsu, the VCS, is all about, and ideally even encouraged you to take a look at it.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to do some more readings about jj, I&amp;rsquo;ve used the below articles and guides when learning it, and a lot of what I wrote above is inspired by parts of them. Check them out!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://v5.chriskrycho.com/essays/jj-init&#34;&gt;https://v5.chriskrycho.com/essays/jj-init&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://neugierig.org/software/blog/2024/12/jujutsu.html&#34;&gt;https://neugierig.org/software/blog/2024/12/jujutsu.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tonyfinn.com/blog/jj/&#34;&gt;https://tonyfinn.com/blog/jj/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://steveklabnik.github.io/jujutsu-tutorial/&#34;&gt;https://steveklabnik.github.io/jujutsu-tutorial/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://v5.chriskrycho.com/journal/jujutsu-megamerges-and-jj-absorb/&#34;&gt;https://v5.chriskrycho.com/journal/jujutsu-megamerges-and-jj-absorb/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, I of course recommend just reading the docs: &lt;a href=&#34;https://jj-vcs.github.io/jj/latest/&#34;&gt;https://jj-vcs.github.io/jj/latest/&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How I Used DALL·E 2 to Generate The Logo for OctoSQL</title>
      <link>https://kubamartin.com/posts/how-i-used-dalle2-to-generate-the-logo-for-octosql/</link>
      <pubDate>Tue, 02 Aug 2022 13:19:19 +0000</pubDate>
      
      <guid>https://kubamartin.com/posts/how-i-used-dalle2-to-generate-the-logo-for-octosql/</guid>
      <description>&lt;p&gt;Everybody has heard about the &lt;em&gt;latest cool thing™&lt;/em&gt;, which is DALL·E 2 (henceforth called Dall-e). A few months ago, when the first previews started, it was basically &lt;strong&gt;everywhere&lt;/strong&gt;. Now, a few weeks ago, the floodgates have been opened and lots of people on the waitlist got access - that group included me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve spent a day playing around with it, learned &lt;a href=&#34;http://dallery.gallery/wp-content/uploads/2022/07/The-DALL%C2%B7E-2-prompt-book-v1.02.pdf&#34;&gt;some basics&lt;/a&gt; (like the fact that adding &amp;ldquo;artstation&amp;rdquo; to the end of your phrase automatically makes the output much better&amp;hellip;), and generated a bunch of (even a few nice-looking) images. In other words, I was already a bit warmed up.&lt;/p&gt;
&lt;p&gt;To add some more background, &lt;a href=&#34;https://github.com/cube2222/octosql&#34;&gt;OctoSQL&lt;/a&gt; - an open source project I&amp;rsquo;m developing - is a CLI query tool that let&amp;rsquo;s you query multiple databases and file formats in a single SQL query. I knew for a while already that its logo should be updated, and with Dall-e arriving, I could combine the fun with the practical.&lt;/p&gt;
&lt;p&gt;In practice, you&amp;rsquo;ll see that the process looks a bit like the Westworld depiction of writers creating storylines in season 4 (no worries, this is not a spoiler, but I do recommend the series if you haven&amp;rsquo;t watched it).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So TLDR, here&amp;rsquo;s the logo I finally ended up with:&lt;/strong&gt;


&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/logo.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;In the rest of this post you&amp;rsquo;ll see where I started, what I went through, what I learned along the way, and how it slowly evolved into the finally chosen image. I will only show the mostly happy path here. I will also only show images that were fairly ok (discarding the other 70+% that were terrible).&lt;/p&gt;
&lt;p&gt;But first, let&amp;rsquo;s quickly describe how DALL·E 2 works. You get a bunch of free credits and you can buy more. A single credit enables you to do one of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generate: Generate 4 images for a given phrase.&lt;/li&gt;
&lt;li&gt;Edit: Generate 3 images for a given phrase and original image with regions marked as transparent (either using image editing software, or using a built-in transparency drawing tool).&lt;/li&gt;
&lt;li&gt;Variations: Generate 3 variations based on the given image, &lt;strong&gt;but without providing a phrase&lt;/strong&gt;. This means you unfortunately can&amp;rsquo;t do stuff like &amp;ldquo;give me the same entity as on the picture, but doing xyz&amp;rdquo;, unless it can be achieved by marking a region as transparent for point 2.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;generating-the-logo&#34;&gt;Generating the Logo&lt;/h2&gt;
&lt;p&gt;I had a fairly specific (I thought. I was wrong though, or at least I couldn&amp;rsquo;t describe it in words well enough) idea for the logo. The name OctoSQL stems from octopus and SQL, with the idea being that an octopus has many arms and can manipulate many entities at the same time, like &lt;a href=&#34;https://github.com/cube2222/octosql&#34;&gt;OctoSQL&lt;/a&gt; can operate on many datasources simultaneously.&lt;/p&gt;
&lt;p&gt;So what I originally wanted to achieve was a cartoonish cute octopus juggling a bunch of databases (or entities representing databases, I decided not to use actual logos of databases).&lt;/p&gt;
&lt;p&gt;Well then, let&amp;rsquo;s start with a fairly straightforward phrase. You can see I&amp;rsquo;m using some &amp;ldquo;direction-setting&amp;rdquo; suffix keywords right away.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A baby octopus juggling diagrams of databases, digital art, cartoon, drawing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.38.20 - A baby octopus juggling diagrams of databases, digital art, cartoon, drawing.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.38.25 - A baby octopus juggling diagrams of databases, digital art, cartoon, drawing.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;That first one actually looks quite cool. Let&amp;rsquo;s do a few variations around it.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.41.44.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.41.49.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.41.52.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Nice! It does look cartoonish, even if I would prefer them to have a bit more depth. However, the main issue is that these octopi (the quite beautiful plural form of &amp;ldquo;octopus&amp;rdquo;) are holding charts. OctoSQL doesn&amp;rsquo;t deal with charts, it deals with data. This could give a false promise about what is possible with OctoSQL.&lt;/p&gt;
&lt;p&gt;Back to the drawing - or shall I say, phrasing - board, then. Let&amp;rsquo;s add some abstract shapes for the octopus to hold.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A baby octopus juggling diagrams of databases, arm wrapped around one cube, digital art, cartoon, drawing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.49.16 - A baby octopus juggling diagrams of databases, arm wrapped around one cube, digital art, cartoon, drawing.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;That looks quite cool, not what I want really, but quite cool nonetheless. But maybe we can experiment with drawing styles?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A baby octopus juggling 3d shapes representing databases, arm wrapped around one cube, streams of data passing through the cubes, digital art, cartoon, drawing, logo, simple shapes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.49.43 - A baby octopus juggling 3d shapes representing databases, arm wrapped around one cube, streams of data passing through the cubes, digital art, cartoon.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Simple shapes disqualified.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s try a few more.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.53.06 - A baby octopus juggling diagrams of databases, digital art, cartoon, drawing, watercolor.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;watercolor&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.53.09 - A baby octopus juggling diagrams of databases, digital art, cartoon, drawing, vector art.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;vector art&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.53.15 - A baby octopus juggling diagrams of databases, digital art, cartoon, drawing, detailed.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;detailed&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.53.31 - A baby octopus juggling 3d shapes like cubes and spheres, digital art, cartoon, drawing, pencil sketch.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;pencil sketch&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 15.53.39 - A baby octopus juggling 3d shapes like cubes and spheres, digital art, cartoon, drawing, pencil sketch, watercolor.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;pencil sketch + watercolor&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Ok, maybe we can go back to the original approach, but simplify? Let&amp;rsquo;s use shapes instead of databases and maybe add some quality-improving tags.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A baby octopus juggling 3d shapes like cubes and spheres, digital art, cartoon, artstation&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.01.05 - A baby octopus juggling 3d shapes like cubes and spheres, digital art, cartoon, artstation.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.01.11 - A baby octopus juggling 3d shapes like cubes and spheres, digital art, cartoon, drawing, artstation.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Quality-wise? Not bad. As a logo? Not really.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s try pencil sketches one more time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A baby octopus playing with diagrams of databases, data records, and 3d shapes like cubes and spheres, digital art, cartoon, drawing, pencil sketch&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.02.36 - A baby octopus playing with diagrams of databases, data records, and 3d shapes like cubes and spheres, digital art, cartoon, drawing, pencil sketch.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.03.18 - A baby octopus playing with diagrams of databases, data records, and 3d shapes like cubes and spheres, digital art, cartoon, drawing, pencil sketch.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.03.40 - A baby octopus playing with diagrams of databases, data records, and 3d shapes like cubes and spheres, digital art, cartoon, drawing, pencil sketch.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;That looks nice! But variations didn&amp;rsquo;t yield anything breathtaking.&lt;/p&gt;
&lt;p&gt;How about we try to use something even more abstract? Like streams of data? And add &amp;ldquo;logo&amp;rdquo;?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Baby octopus playing with streams of data, logo, digital art, drawing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.06.20 - Baby octopus playing with streams of data, logo, digital art, drawing.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.06.24 - Baby octopus playing with streams of data, logo, digital art, drawing.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;That was worth it just for the fun of it. But it&amp;rsquo;s not really usable. Maybe I&amp;rsquo;m asking for too much? Let&amp;rsquo;s do a simple octopus, without the data bit.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Baby octopus, logo, digital art, drawing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.05.06 - Baby octopus, logo, digital art, drawing.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.05.11 - Baby octopus, logo, digital art, drawing.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Those do have their charm! Let&amp;rsquo;s try to edit them and add some stuff into their arms! Like data streams, data records, 3d shapes, and - the name of which I just learned, but which we&amp;rsquo;ve all seen in all kinds of diagrams - blue data storage cylinders.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.09.52 - Baby octopus playing with streams of data, logo, digital art, drawing.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;streams of data&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.10.09 - Baby octopus playing with 3d shapes like cubes and spheres, logo, digital art, drawing.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;&#34;3d shapes like cubes and spheres&#34;&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.10.12 - Baby octopus playing with multiple blue data storage cylinders, logo, digital art, drawing.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;blue data storage cylinders&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.10.43 - Baby octopus playing with multiple blue data storage cylinders and wearing pilot goggles, logo, digital art, drawing.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;... and wearing pilot googles as a final touch&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Each time I&amp;rsquo;ve marked a part of the image to be replaced and let Dall-e do its thing.&lt;/p&gt;
&lt;p&gt;Those were fine, but I decided to do another try without the bells and whistles, but with the &amp;ldquo;logo&amp;rdquo; tag.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Baby octopus, logo, digital art, drawing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.29.16 - Baby octopus, logo, digital art, drawing.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;And this one actually led to an epiphany! Logos will often have a background. This dark background circle was what I needed. It will also force Dall-e to mostly stay in the confines of it (and not draw on the whole available space).&lt;/p&gt;
&lt;p&gt;Trying a basic phrase we already get some nice logos!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Baby octopus, logo, digital art, drawing, in a dark circle as the background&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.32.00 - Baby octopus, logo, digital art, drawing, in a dark circle as the background.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.32.04 - Baby octopus, logo, digital art, drawing, in a dark circle as the background.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;&amp;hellip; and they&amp;rsquo;re nicely confined to a space in the center, which is very useful for a logo.&lt;/p&gt;
&lt;p&gt;Now maybe we can try to add some entities for the octopus to play with.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.33.34 - Baby octopus playing with data records, logo, digital art, drawing, in a dark circle as the background.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;data records&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.33.40 - Baby octopus playing with cubes, logo, digital art, drawing, in a dark circle as the background.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;cubes&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.34.05 - Baby octopus playing with cubes, logo, digital art, drawing, in a dark circle as the background.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;... cubes again&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;But those are a bunch of dangerously-looking octopi. I used &amp;ldquo;baby&amp;rdquo; to get something a tad more adorable.&lt;/p&gt;
&lt;p&gt;So lets try to turn up the cuteness factor:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cute baby octopus playing with cubes, logo, digital art, drawing, in a dark circle as the background&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.38.03 - Cute baby octopus playing with cubes, logo, digital art, drawing, in a dark circle as the background.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.38.10 - Cute baby octopus playing with cubes, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.38.18 - Baby octopus playing with cubes, logo, digital art, drawing, in a dark circle as the background.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Much better! Could we add even more of it? Why, yes!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cute baby octopus playing with cubes, logo, digital art, drawing, in a dark circle as the background, &lt;strong&gt;vibrant, cheerful, bubbles&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.40.03 - Cute baby octopus playing with cubes, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Doing a chain of variations based on it, I got one nice octopus, one psycho, and a bunch of app icons.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.43.04.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.43.10.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.43.13.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.43.16.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 16.44.06.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Not really a great direction. Maybe we can edit the original to fit our needs. Right now its very playful. However, OctoSQL is meant for some serious data munching and the logo should reflect that. And really, I can&amp;rsquo;t think of anything that would inspire more confidence than a yellow safety helmet (obviously; honestly, I can, but a helmet looks good on a logo), so let&amp;rsquo;s try to add that!&lt;/p&gt;
&lt;p&gt;Dragging the transparency brush over the top of its head, and providing the following phrase:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cute baby octopus playing with cubes wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;we get some nice results!&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.00.15 - Cute baby octopus playing with cubes wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.00.25 - Cute baby octopus playing with cubes wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Those are actually really good.&lt;/p&gt;
&lt;p&gt;Then I went on a slight detour, trying to generate octopi with helmets right away (and variations based on them). Even though it didn&amp;rsquo;t lead to anything useful, the cuteness of the resulting octopi is just heartwarming, so I&amp;rsquo;m leaving them here for you to enjoy. Also, there&amp;rsquo;s one more plain octopus playing with cubes which I didn&amp;rsquo;t use but looked very nice.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.04.13 - Cute baby octopus playing with cubes wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.04.18.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.04.21.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.04.26 - Cute baby octopus playing with cubes wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.04.34 - baby octopus playing with cubes wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bub.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.10.51 - Cute baby octopus playing with cubes, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;And then I thought, maybe cubes, data records, databases and blue data storage cylinders just aren&amp;rsquo;t something that octopi are used to playing with? How about something more natural, like mussels?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cute baby octopus playing with mussels, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.12.09 - Cute baby octopus playing with mussels, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;This one really got me. Good size, quite cute, actually mostly correct (not too many artifacts) and the mussels look nice.&lt;/p&gt;
&lt;p&gt;So then I edited in a helmet, and then edited a side of the helmet to fix an artifact.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cute baby octopus playing with mussels wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.14.09 - Cute baby octopus playing with mussels wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerf.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;helmet with artifact&lt;/figcaption&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.14.16 - Cute baby octopus playing with mussels wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerf.jpg&#34;&gt;&lt;/img&gt;
        &lt;figcaption style=&#34;text-align: center&#34;&gt;artifact fixed&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Its left eye is also broken. We can fix that by brushing over it and keeping the same phrase. This way Dall-e will regenerate just the eye.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.16.38 - Cute baby octopus playing with mussels wearing a yellow safety helmet, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerf.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Fixed! Coming back to those mussels. They look cute, but seen from far away they are just too many, too small. Moreover, it doesn&amp;rsquo;t really get the original message across. Let&amp;rsquo;s try to replace them with some &amp;ldquo;3d shapes&amp;rdquo; by drawing over the tentacles and adding back &amp;ldquo;playing with 3d shapes&amp;rdquo;.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.18.55 - Cute baby octopus playing with 3d shapes like cubes and spheres, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bu.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.19.03 - Cute baby octopus playing with 3d shapes like cubes, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.19.06 - Cute baby octopus playing with 3d shapes like cubes, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;I really liked the first one, but the rightermost sphere is just way too big. And maybe we could add a different shape than a sphere? Anyhow, let&amp;rsquo;s just paint over it and see if &amp;ldquo;3d shapes like cubes and spheres&amp;rdquo; gets us something nice.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.21.38 - Cute baby octopus playing with 3d shapes like cubes and spheres, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bu.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.21.40 - Cute baby octopus playing with 3d shapes like cubes and spheres, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bu.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.21.51 - Cute baby octopus playing with 3d shapes like cubes, logo, digital art, drawing, in a dark circle as the background, vibrant, cheerful, bubbles.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;And as you saw in the beginning, the middle one won. That sphere in a cube looks intriguing, the octopus is manipulting a few objects, it&amp;rsquo;s very logo-shaped, it&amp;rsquo;s fairly cute, it inspires (some) confidence, and doesn&amp;rsquo;t have any tiny elements, so looks good at a distance.&lt;/p&gt;
&lt;p&gt;Having generated this, I used Procreate to make the background transparent, resize the image to be slightly smaller and make the bubble with the octopus occupy the whole image, leading to this - previously shown - result.&lt;/p&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/logo.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Finally, I did a bunch of Google reverse image searches for it. You know, just to be sure.&lt;/p&gt;
&lt;p&gt;To be completely honest, I would prefer something slightly simpler with less complex shapes, but I failed to persuade Dall-e into generating that for me. Moreover, I really am content with this logo.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;All in all, it was a fun journey. The end result isn&amp;rsquo;t ideal, but I&amp;rsquo;m very happy with it. As far as Dall-e goes, I think right now it&amp;rsquo;s still very much in a &amp;ldquo;first iteration&amp;rdquo; phase for most bits and purposes (the main exception being pencil sketches, those are mind-blowingly good). Artists don&amp;rsquo;t have anything to worry about for now in my opinion (quite similarly to how it is with Copilot) - stock photo websites on the other hand&amp;hellip;&lt;/p&gt;
&lt;p&gt;To prove my point regarding pencil sketches, look at this&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A mouse teaching other mice data visualization on a whiteboard, digital art, pencil sketch, cute&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div style=&#34;display: flex;flex-direction: row;width: 100%;align-items: center;justify-content: center;flex-wrap: wrap;&#34;&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.27.44 - A mouse teaching other mice data visualization on a whiteboard, digital art, pencil sketch, cute.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
    &lt;figure style=&#34;display:inline-block;width: 30%;height: auto;padding: 4px;border-radius: 10px;&#34;&gt;
        &lt;img src=&#34;https://kubamartin.com/images/dalle2/DALL·E 2022-08-02 17.27.50 - A mouse teaching other mice data visualization on a whiteboard, digital art, pencil sketch, cute.jpg&#34;&gt;&lt;/img&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;That&amp;rsquo;s just the ideal kind of content for illustrating presentations, articles or books, and the results have been much more consistent than with other tags.&lt;/p&gt;
&lt;p&gt;From a monetary perspective, I&amp;rsquo;ve spent 30 bucks for the whole thing (in the end I was generating 2-3 edits/variations per minute). In other words, not too much.&lt;/p&gt;
&lt;p&gt;Though I think the real breakthrough will come when Dall-e gets 10-100x cheaper (and faster). I would then envision the following process of working with it (which is really just an optimization on top of what I&amp;rsquo;ve been doing now):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You write a phrase.&lt;/li&gt;
&lt;li&gt;You are shown a hundred pictures for that phrase, preferably from very different regions of the latent space.&lt;/li&gt;
&lt;li&gt;You select the ones best matching what you want.&lt;/li&gt;
&lt;li&gt;Go back to 2, 4-5 times, getting better results every time.&lt;/li&gt;
&lt;li&gt;Now you can write a phrase for what you would like to change (edit) and the original image would be used as the baseline. Go back to 2 until happy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
