<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[ContextKeeper]]></title><description><![CDATA[Everything about deep work for devs]]></description><link>http://contextkeeper.io/</link><image><url>http://contextkeeper.io/favicon.png</url><title>ContextKeeper</title><link>http://contextkeeper.io/</link></image><generator>Ghost 2.8</generator><lastBuildDate>Fri, 30 Jan 2026 12:15:50 GMT</lastBuildDate><atom:link href="http://contextkeeper.io/blog/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Session Manager for Visual Studio: ContextKeeper compared to Task Canvas, Favorite Documents and Workspace Manager]]></title><description><![CDATA[<p>Below, you'll find <a href="https://contextkeeper.io">ContextKeeper</a>, a session manager for Visual Studio, compared to alternatives.</p>
<p>All extensions included in the comparison work with Visual Studio 2022. I've included free extensions, with the exception of Task Canvas, which is a paid one. I've invested several hours testing Favorite Documents, Workspace Manager, and Task</p>]]></description><link>http://contextkeeper.io/blog/session-manager-for-visual-studio-contextkeeper-compated-to-alernatives/</link><guid isPermaLink="false">668ab1e77414a50007f74e14</guid><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Wed, 10 Jul 2024 12:07:52 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2024/07/Session-Manger---ContextKeeper.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2024/07/Session-Manger---ContextKeeper.jpg" alt="Session Manager for Visual Studio: ContextKeeper compared to Task Canvas, Favorite Documents and Workspace Manager"><p>Below, you'll find <a href="https://contextkeeper.io">ContextKeeper</a>, a session manager for Visual Studio, compared to alternatives.</p>
<p>All extensions included in the comparison work with Visual Studio 2022. I've included free extensions, with the exception of Task Canvas, which is a paid one. I've invested several hours testing Favorite Documents, Workspace Manager, and Task Canvas to get a clearer picture of how they all stack up against ContextKeeper</p>
<table>
<thead>
<tr>
<th>Features supported</th>
<th style="text-align:center">ContextKeeper</th>
<th style="text-align:center">Task Canvas</th>
<th style="text-align:center">Favorite Documents</th>
<th style="text-align:center">Workspace Manager</th>
</tr>
</thead>
<tbody>
<tr>
<td>Automatic session switching when changing Git branches</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Restores full Visual Studio's original documents state</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Tabs order</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>Tab groups (including horizontal/vertical orientation)</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>Document windows positions &amp; size (including floating windows)</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>Breakpoints</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Bookmarks</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Last selected tab for every window</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>Last active tab among all opened</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>Visual Studio independent restore engine</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">partially</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Multiple document windows</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>Multiple monitors support</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>Relative path (portable sessions between environments)</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">limited</td>
<td style="text-align:center">limited</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Maximized/Normal state for document windows</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Source control ready sessions files (diffable JSON format)</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Continuous session auto-save for branch snapshots</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>One-click append files</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Pinned files</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>One-click session update</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌(only adding)</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>One-click restore</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Shareable session's file between teammates</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌(one file for all sessions)</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Last opened files</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>Line &amp; column for every file</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">unreliable</td>
</tr>
<tr>
<td>Non-solution (external) files</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Not based on the (broken) IVsUIShellDocumentWindowMgr</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Still in an active development (updates in 2023)</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Price</td>
<td style="text-align:center">Free during Beta</td>
<td style="text-align:center">$49</td>
<td style="text-align:center">Free</td>
<td style="text-align:center">Free</td>
</tr>
</tbody>
</table>
<h2 id="taskcanvas">Task Canvas</h2>
<p>I must say, I'm a bit surprised by how Task Canvas, the only paid competitor, performed in the comparison. It was built with a different workflow in mind, which is why it lacks in certain areas. However, it's still quite powerful and presents an interesting concept with its independent task canvas (separate, physical tab). Kudos to Sergey for trying something different. I'll take a closer look to see if there are any elements from this concept that could add additional value to ContextKeeper. What are your thoughts on this?</p>
<h2 id="favoritedocuments">Favorite Documents</h2>
<p>It appears that the most popular extension is based on the simple VS API - <code>VsShellUtilities.OpenDocument()</code>. Unfortunately, it lacks more sophisticated use cases. Nonetheless, it's still better than relying solely on Visual Studio's default state engine and the inherently flawed <code>.suo</code> file.</p>
<h2 id="workspacemanager">Workspace Manager</h2>
<p>The spiritual successor to the (broken) approach of Save All the Tabs, utilizing the <code>IVsUIShellDocumentWindowMgr.ReopenDocumentWindows()</code> API. Unfortunately it is nothing more than wrapper for the default Visual Studio state engine, which which has had persistent, unresolved issues for years. It's unreliable, sometimes functioning properly but often failing. My experience with it has been similar to Save All the Tabs, which I tried  using with mixed success in the past.</p>
<p><strong>The fail of the Save All the Tabs extension</strong>, to <strong>deliver a stable</strong> and <strong>reliable</strong> restore mechanism, <strong>really push me</strong> to work on the a <strong>truly independent session restore engine</strong>. I distinctly recall my thought process during that time -</p>
<blockquote>
<p>If it doesn't work, I'll at least give it a shot and try to build it. There's nothing wrong with failing, but if I succeed, it will be a big deal one day! I will try to make it the state-of-the-art session manager that Visual Studio has never had but always deserved.</p>
</blockquote>
<p>Later, the context engine has become the heart of ContextKeeper. It was entirely written from scratch, and it is fully independent from Visual Studio session restore API. It is rock solid, and works in VS 2022, including olders versions VS 2019/2017/2015. It has taken thousands of hours and years of work to bring it to a state where it is a true pleasure and an enjoyable experience to use, and to have the session manager that Visual Studio has always deserved. 🚀 Cause there ain't room for more than one King 👑 in this town.</p>
]]></content:encoded></item><item><title><![CDATA[Downloads]]></title><description><![CDATA[<p><a href="https://marketplace.visualstudio.com/items?itemName=ContextKeeper.ContextKeeperVsix">VS 2022 installer</a> </p><p><a href="https://contextkeeper.io/public/ContextKeeper_Beta_v1.98.34_VS2022_ARM.vsix">Experimental ARM-compatible build for VS 2022</a></p><p><a href="https://contextkeeper.io/public/ContextKeeper_Beta_v1.98.22.vsix">VS 2019 (and 2017/2015) installer</a></p><p><strong>Subscribe to our newsletter</strong> 📰</p><script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/2457395/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="2457395" data-uid="2a928aad60" data-format="inline" data-version="5" data-options="{&quot;settings&quot;:{&quot;after_subscribe&quot;:{&quot;action&quot;:&quot;message&quot;,&quot;success_message&quot;:&quot;Success! Now check your email to confirm your subscription.&quot;,&quot;redirect_url&quot;:&quot;&quot;},&quot;analytics&quot;:{&quot;google&quot;:null,&quot;facebook&quot;:null,&quot;segment&quot;:null,&quot;pinterest&quot;:null,&quot;sparkloop&quot;:null,&quot;googletagmanager&quot;:null},&quot;modal&quot;:{&quot;trigger&quot;:&quot;timer&quot;,&quot;scroll_percentage&quot;:null,&quot;timer&quot;:5,&quot;devices&quot;:&quot;all&quot;,&quot;show_once_every&quot;:15},&quot;powered_by&quot;:{&quot;show&quot;:true,&quot;url&quot;:&quot;https://convertkit.com?utm_campaign=poweredby&amp;utm_content=form&amp;utm_medium=referral&amp;utm_source=dynamic&quot;},&quot;recaptcha&quot;:{&quot;enabled&quot;:false},&quot;return_visitor&quot;:{&quot;action&quot;:&quot;show&quot;,&quot;custom_content&quot;:&quot;&quot;},&quot;slide_in&quot;:{&quot;display_in&quot;:&quot;bottom_right&quot;,&quot;trigger&quot;:&quot;timer&quot;,&quot;scroll_percentage&quot;:null,&quot;timer&quot;:5,&quot;devices&quot;:&quot;all&quot;,&quot;show_once_every&quot;:15},&quot;sticky_bar&quot;:{&quot;display_in&quot;:&quot;top&quot;,&quot;trigger&quot;:&quot;timer&quot;,&quot;scroll_percentage&quot;:null,&quot;timer&quot;:5,&quot;devices&quot;:&quot;all&quot;,&quot;show_once_every&quot;:15}},&quot;version&quot;:&quot;5&quot;}" min-width="400 500 600 700 800">
    <div data-style="clean"><ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul><div data-element="fields" data-stacked="false" class="seva-fields formkit-fields"><div class="formkit-field"><input class="formkit-input" name="email_address" style="color: rgb(0, 0, 0); border-color: rgb(227, 227, 227); border-radius: 4px; font-weight: 400;" aria-label="Email Address" placeholder="Email Address" required type="email"></div><button data-element="submit" class="formkit-submit formkit-submit" style="color: rgb(255, 255, 255); background-color: rgb(22, 119, 190); border-radius: 4px; font-weight: 400;"><div class="formkit-spinner"><div></div><div></div><div></div></div><span class="">Subscribe</span></button></div></div>
    <style>
        .formkit-form[data-uid="2a928aad60"] * {
            box-sizing: border-box;
        }

        .formkit-form[data-uid="2a928aad60"] {
            -webkit-font-smoothing: antialiased;
            -moz-osx-font-smoothing: grayscale;
        }

            .formkit-form[data-uid="2a928aad60"] legend {
                border: none;
                font-size: inherit;
                margin-bottom: 10px;
                padding: 0;
                position: relative;
                display: table;
            }

            .formkit-form[data-uid=</style></form>]]></description><link>http://contextkeeper.io/blog/downloads/</link><guid isPermaLink="false">61b2327940b86c00074f184f</guid><category><![CDATA[release]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Mon, 15 Jan 2024 10:00:00 GMT</pubDate><content:encoded><![CDATA[<p><a href="https://marketplace.visualstudio.com/items?itemName=ContextKeeper.ContextKeeperVsix">VS 2022 installer</a> </p><p><a href="https://contextkeeper.io/public/ContextKeeper_Beta_v1.98.34_VS2022_ARM.vsix">Experimental ARM-compatible build for VS 2022</a></p><p><a href="https://contextkeeper.io/public/ContextKeeper_Beta_v1.98.22.vsix">VS 2019 (and 2017/2015) installer</a></p><p><strong>Subscribe to our newsletter</strong> 📰</p><script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/2457395/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="2457395" data-uid="2a928aad60" data-format="inline" data-version="5" data-options="{&quot;settings&quot;:{&quot;after_subscribe&quot;:{&quot;action&quot;:&quot;message&quot;,&quot;success_message&quot;:&quot;Success! Now check your email to confirm your subscription.&quot;,&quot;redirect_url&quot;:&quot;&quot;},&quot;analytics&quot;:{&quot;google&quot;:null,&quot;facebook&quot;:null,&quot;segment&quot;:null,&quot;pinterest&quot;:null,&quot;sparkloop&quot;:null,&quot;googletagmanager&quot;:null},&quot;modal&quot;:{&quot;trigger&quot;:&quot;timer&quot;,&quot;scroll_percentage&quot;:null,&quot;timer&quot;:5,&quot;devices&quot;:&quot;all&quot;,&quot;show_once_every&quot;:15},&quot;powered_by&quot;:{&quot;show&quot;:true,&quot;url&quot;:&quot;https://convertkit.com?utm_campaign=poweredby&amp;utm_content=form&amp;utm_medium=referral&amp;utm_source=dynamic&quot;},&quot;recaptcha&quot;:{&quot;enabled&quot;:false},&quot;return_visitor&quot;:{&quot;action&quot;:&quot;show&quot;,&quot;custom_content&quot;:&quot;&quot;},&quot;slide_in&quot;:{&quot;display_in&quot;:&quot;bottom_right&quot;,&quot;trigger&quot;:&quot;timer&quot;,&quot;scroll_percentage&quot;:null,&quot;timer&quot;:5,&quot;devices&quot;:&quot;all&quot;,&quot;show_once_every&quot;:15},&quot;sticky_bar&quot;:{&quot;display_in&quot;:&quot;top&quot;,&quot;trigger&quot;:&quot;timer&quot;,&quot;scroll_percentage&quot;:null,&quot;timer&quot;:5,&quot;devices&quot;:&quot;all&quot;,&quot;show_once_every&quot;:15}},&quot;version&quot;:&quot;5&quot;}" min-width="400 500 600 700 800">
    <div data-style="clean"><ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul><div data-element="fields" data-stacked="false" class="seva-fields formkit-fields"><div class="formkit-field"><input class="formkit-input" name="email_address" style="color: rgb(0, 0, 0); border-color: rgb(227, 227, 227); border-radius: 4px; font-weight: 400;" aria-label="Email Address" placeholder="Email Address" required type="email"></div><button data-element="submit" class="formkit-submit formkit-submit" style="color: rgb(255, 255, 255); background-color: rgb(22, 119, 190); border-radius: 4px; font-weight: 400;"><div class="formkit-spinner"><div></div><div></div><div></div></div><span class="">Subscribe</span></button></div></div>
    <style>
        .formkit-form[data-uid="2a928aad60"] * {
            box-sizing: border-box;
        }

        .formkit-form[data-uid="2a928aad60"] {
            -webkit-font-smoothing: antialiased;
            -moz-osx-font-smoothing: grayscale;
        }

            .formkit-form[data-uid="2a928aad60"] legend {
                border: none;
                font-size: inherit;
                margin-bottom: 10px;
                padding: 0;
                position: relative;
                display: table;
            }

            .formkit-form[data-uid="2a928aad60"] fieldset {
                border: 0;
                padding: 0.01em 0 0 0;
                margin: 0;
                min-width: 0;
            }

            .formkit-form[data-uid="2a928aad60"] body:not(:-moz-handler-blocked) fieldset {
                display: table-cell;
            }

            .formkit-form[data-uid="2a928aad60"] h1, .formkit-form[data-uid="2a928aad60"] h2, .formkit-form[data-uid="2a928aad60"] h3, .formkit-form[data-uid="2a928aad60"] h4, .formkit-form[data-uid="2a928aad60"] h5, .formkit-form[data-uid="2a928aad60"] h6 {
                color: inherit;
                font-size: inherit;
                font-weight: inherit;
            }

            .formkit-form[data-uid="2a928aad60"] p {
                color: inherit;
                font-size: inherit;
                font-weight: inherit;
            }

            .formkit-form[data-uid="2a928aad60"] ol:not([template-default]), .formkit-form[data-uid="2a928aad60"] ul:not([template-default]), .formkit-form[data-uid="2a928aad60"] blockquote:not([template-default]) {
                text-align: left;
            }

            .formkit-form[data-uid="2a928aad60"] p:not([template-default]), .formkit-form[data-uid="2a928aad60"] hr:not([template-default]), .formkit-form[data-uid="2a928aad60"] blockquote:not([template-default]), .formkit-form[data-uid="2a928aad60"] ol:not([template-default]), .formkit-form[data-uid="2a928aad60"] ul:not([template-default]) {
                color: inherit;
                font-style: initial;
            }

            .formkit-form[data-uid="2a928aad60"] .ordered-list, .formkit-form[data-uid="2a928aad60"] .unordered-list {
                list-style-position: outside !important;
                padding-left: 1em;
            }

            .formkit-form[data-uid="2a928aad60"] .list-item {
                padding-left: 0;
            }

            .formkit-form[data-uid="2a928aad60"][data-format="modal"] {
                display: none;
            }

            .formkit-form[data-uid="2a928aad60"][data-format="slide in"] {
                display: none;
            }

            .formkit-form[data-uid="2a928aad60"][data-format="sticky bar"] {
                display: none;
            }

        .formkit-sticky-bar .formkit-form[data-uid="2a928aad60"][data-format="sticky bar"] {
            display: block;
        }

        .formkit-form[data-uid="2a928aad60"] .formkit-input, .formkit-form[data-uid="2a928aad60"] .formkit-select, .formkit-form[data-uid="2a928aad60"] .formkit-checkboxes {
            width: 100%;
        }

        .formkit-form[data-uid="2a928aad60"] .formkit-button, .formkit-form[data-uid="2a928aad60"] .formkit-submit {
            border: 0;
            border-radius: 5px;
            color: #ffffff;
            cursor: pointer;
            display: inline-block;
            text-align: center;
            font-size: 15px;
            font-weight: 500;
            cursor: pointer;
            margin-bottom: 15px;
            overflow: hidden;
            padding: 0;
            position: relative;
            vertical-align: middle;
        }

            .formkit-form[data-uid="2a928aad60"] .formkit-button:hover, .formkit-form[data-uid="2a928aad60"] .formkit-submit:hover, .formkit-form[data-uid="2a928aad60"] .formkit-button:focus, .formkit-form[data-uid="2a928aad60"] .formkit-submit:focus {
                outline: none;
            }

                .formkit-form[data-uid="2a928aad60"] .formkit-button:hover > span, .formkit-form[data-uid="2a928aad60"] .formkit-submit:hover > span, .formkit-form[data-uid="2a928aad60"] .formkit-button:focus > span, .formkit-form[data-uid="2a928aad60"] .formkit-submit:focus > span {
                    background-color: rgba(0,0,0,0.1);
                }

            .formkit-form[data-uid="2a928aad60"] .formkit-button > span, .formkit-form[data-uid="2a928aad60"] .formkit-submit > span {
                /*display: block;*/
                -webkit-transition: all 300ms ease-in-out;
                transition: all 300ms ease-in-out;
                padding: 12px 24px;
            }

        .formkit-form[data-uid="2a928aad60"] .formkit-input {
            background: #ffffff;
            font-size: 15px;
            padding: 12px;
            border: 1px solid #e3e3e3;
            -webkit-flex: 1 0 auto;
            -ms-flex: 1 0 auto;
            flex: 1 0 auto;
            line-height: 1.4;
            margin: 0;
            -webkit-transition: border-color ease-out 300ms;
            transition: border-color ease-out 300ms;
        }

            .formkit-form[data-uid="2a928aad60"] .formkit-input:focus {
                outline: none;
                border-color: #1677be;
                -webkit-transition: border-color ease 300ms;
                transition: border-color ease 300ms;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-input::-webkit-input-placeholder {
                color: inherit;
                opacity: 0.8;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-input::-moz-placeholder {
                color: inherit;
                opacity: 0.8;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-input:-ms-input-placeholder {
                color: inherit;
                opacity: 0.8;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-input::placeholder {
                color: inherit;
                opacity: 0.8;
            }

        .formkit-form[data-uid="2a928aad60"] [data-group="dropdown"] {
            position: relative;
            display: inline-block;
            width: 100%;
        }

            .formkit-form[data-uid="2a928aad60"] [data-group="dropdown"]::before {
                content: "";
                top: calc(50% - 2.5px);
                right: 10px;
                position: absolute;
                pointer-events: none;
                border-color: #4f4f4f transparent transparent transparent;
                border-style: solid;
                border-width: 6px 6px 0 6px;
                height: 0;
                width: 0;
                z-index: 999;
            }

            .formkit-form[data-uid="2a928aad60"] [data-group="dropdown"] select {
                height: auto;
                width: 100%;
                cursor: pointer;
                color: #333333;
                line-height: 1.4;
                margin-bottom: 0;
                padding: 0 6px;
                -webkit-appearance: none;
                -moz-appearance: none;
                appearance: none;
                font-size: 15px;
                padding: 12px;
                padding-right: 25px;
                border: 1px solid #e3e3e3;
                background: #ffffff;
            }

                .formkit-form[data-uid="2a928aad60"] [data-group="dropdown"] select:focus {
                    outline: none;
                }

        .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] {
            text-align: left;
            margin: 0;
        }

            .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] {
                margin-bottom: 10px;
            }

                .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] * {
                    cursor: pointer;
                }

                .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"]:last-of-type {
                    margin-bottom: 0;
                }

                .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"] {
                    display: none;
                }

                    .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"] + label::after {
                        content: none;
                    }

                    .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]:checked + label::after {
                        border-color: #ffffff;
                        content: "";
                    }

                    .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]:checked + label::before {
                        background: #10bf7a;
                        border-color: #10bf7a;
                    }

                .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] label {
                    position: relative;
                    display: inline-block;
                    padding-left: 28px;
                }

                    .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] label::before, .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] label::after {
                        position: absolute;
                        content: "";
                        display: inline-block;
                    }

                    .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] label::before {
                        height: 16px;
                        width: 16px;
                        border: 1px solid #e3e3e3;
                        background: #ffffff;
                        left: 0px;
                        top: 3px;
                    }

                    .formkit-form[data-uid="2a928aad60"] [data-group="checkboxes"] [data-group="checkbox"] label::after {
                        height: 4px;
                        width: 8px;
                        border-left: 2px solid #4d4d4d;
                        border-bottom: 2px solid #4d4d4d;
                        -webkit-transform: rotate(-45deg);
                        -ms-transform: rotate(-45deg);
                        transform: rotate(-45deg);
                        left: 4px;
                        top: 8px;
                    }

        .formkit-form[data-uid="2a928aad60"] .formkit-alert {
            background: #f9fafb;
            border: 1px solid #e3e3e3;
            border-radius: 5px;
            -webkit-flex: 1 0 auto;
            -ms-flex: 1 0 auto;
            flex: 1 0 auto;
            list-style: none;
            margin: 25px auto;
            padding: 12px;
            text-align: center;
            width: 100%;
        }

            .formkit-form[data-uid="2a928aad60"] .formkit-alert:empty {
                display: none;
            }

        .formkit-form[data-uid="2a928aad60"] .formkit-alert-success {
            background: #d3fbeb;
            border-color: #10bf7a;
            color: #0c905c;
        }

        .formkit-form[data-uid="2a928aad60"] .formkit-alert-error {
            background: #fde8e2;
            border-color: #f2643b;
            color: #ea4110;
        }

        .formkit-form[data-uid="2a928aad60"] .formkit-spinner {
            display: -webkit-box;
            display: -webkit-flex;
            display: -ms-flexbox;
            display: flex;
            height: 0px;
            width: 0px;
            margin: 0 auto;
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            width: 0px;
            overflow: hidden;
            text-align: center;
            -webkit-transition: all 300ms ease-in-out;
            transition: all 300ms ease-in-out;
        }

            .formkit-form[data-uid="2a928aad60"] .formkit-spinner > div {
                margin: auto;
                width: 12px;
                height: 12px;
                background-color: #fff;
                opacity: 0.3;
                border-radius: 100%;
                display: inline-block;
                -webkit-animation: formkit-bouncedelay-formkit-form-data-uid-2a928aad60- 1.4s infinite ease-in-out both;
                animation: formkit-bouncedelay-formkit-form-data-uid-2a928aad60- 1.4s infinite ease-in-out both;
            }

                .formkit-form[data-uid="2a928aad60"] .formkit-spinner > div:nth-child(1) {
                    -webkit-animation-delay: -0.32s;
                    animation-delay: -0.32s;
                }

                .formkit-form[data-uid="2a928aad60"] .formkit-spinner > div:nth-child(2) {
                    -webkit-animation-delay: -0.16s;
                    animation-delay: -0.16s;
                }

        .formkit-form[data-uid="2a928aad60"] .formkit-submit[data-active] .formkit-spinner {
            opacity: 1;
            height: 100%;
            width: 50px;
        }

            .formkit-form[data-uid="2a928aad60"] .formkit-submit[data-active] .formkit-spinner ~ span {
                opacity: 0;
            }

        .formkit-form[data-uid="2a928aad60"] .formkit-powered-by[data-active="false"] {
            opacity: 0.35;
        }

        .formkit-form[data-uid="2a928aad60"] .formkit-powered-by-convertkit-container {
            display: -webkit-box;
            display: -webkit-flex;
            display: -ms-flexbox;
            display: flex;
            width: 100%;
            z-index: 5;
            margin: 10px 0;
            position: relative;
        }

            .formkit-form[data-uid="2a928aad60"] .formkit-powered-by-convertkit-container[data-active="false"] {
                opacity: 0.35;
            }

        .formkit-form[data-uid="2a928aad60"] .formkit-powered-by-convertkit {
            -webkit-align-items: center;
            -webkit-box-align: center;
            -ms-flex-align: center;
            align-items: center;
            background-color: #ffffff;
            border: 1px solid #dce1e5;
            border-radius: 4px;
            color: #373f45;
            cursor: pointer;
            display: block;
            height: 36px;
            margin: 0 auto;
            opacity: 0.95;
            padding: 0;
            -webkit-text-decoration: none;
            text-decoration: none;
            text-indent: 100%;
            -webkit-transition: ease-in-out all 200ms;
            transition: ease-in-out all 200ms;
            white-space: nowrap;
            overflow: hidden;
            -webkit-user-select: none;
            -moz-user-select: none;
            -ms-user-select: none;
            user-select: none;
            width: 190px;
            background-repeat: no-repeat;
            background-position: center;
            background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='%23373F45'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='%23373F45'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='%23373F45'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='%23373F45'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='%23373F45'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='%23373F45'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='%23373F45'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='%23373F45'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='%23373F45'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='%23373F45'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='%23373F45'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='%23373F45'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='%23373F45'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='%23373F45'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='%23373F45'/%3E%3C/svg%3E");
        }

            .formkit-form[data-uid="2a928aad60"] .formkit-powered-by-convertkit:hover, .formkit-form[data-uid="2a928aad60"] .formkit-powered-by-convertkit:focus {
                background-color: #ffffff;
                -webkit-transform: scale(1.025) perspective(1px);
                -ms-transform: scale(1.025) perspective(1px);
                transform: scale(1.025) perspective(1px);
                opacity: 1;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-powered-by-convertkit[data-variant="dark"], .formkit-form[data-uid="2a928aad60"] .formkit-powered-by-convertkit[data-variant="light"] {
                background-color: transparent;
                border-color: transparent;
                width: 166px;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-powered-by-convertkit[data-variant="light"] {
                color: #ffffff;
                background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='white'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='white'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='white'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='white'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='white'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='white'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='white'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='white'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='white'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='white'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='white'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='white'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='white'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='white'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='white'/%3E%3C/svg%3E");
            }

        @-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-2a928aad60- {
            0%,80%,100% {
                -webkit-transform: scale(0);
                -ms-transform: scale(0);
                transform: scale(0);
            }

            40% {
                -webkit-transform: scale(1);
                -ms-transform: scale(1);
                transform: scale(1);
            }
        }

        @keyframes formkit-bouncedelay-formkit-form-data-uid-2a928aad60- {
            0%,80%,100% {
                -webkit-transform: scale(0);
                -ms-transform: scale(0);
                transform: scale(0);
            }

            40% {
                -webkit-transform: scale(1);
                -ms-transform: scale(1);
                transform: scale(1);
            }
        }

        .formkit-form[data-uid="2a928aad60"] blockquote {
            padding: 10px 20px;
            margin: 0 0 20px;
            border-left: 5px solid #e1e1e1;
        }

        .formkit-form[data-uid="2a928aad60"] .seva-custom-content {
            padding: 15px;
            font-size: 16px;
            color: #fff;
            mix-blend-mode: difference;
        }

        .formkit-form[data-uid="2a928aad60"] {
            max-width: 700px;
        }

            .formkit-form[data-uid="2a928aad60"] [data-style="clean"] {
                width: 100%;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-fields {
                display: -webkit-box;
                display: -webkit-flex;
                display: -ms-flexbox;
                display: flex;
                -webkit-flex-wrap: wrap;
                -ms-flex-wrap: wrap;
                flex-wrap: wrap;
                margin: 0 auto;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-field, .formkit-form[data-uid="2a928aad60"] .formkit-submit {
                margin: 0 0 15px 0;
                -webkit-flex: 1 0 100%;
                -ms-flex: 1 0 100%;
                flex: 1 0 100%;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-powered-by-convertkit-container {
                margin: 0;
            }

            .formkit-form[data-uid="2a928aad60"] .formkit-submit {
                position: static;
            }

            .formkit-form[data-uid="2a928aad60"][min-width~="700"] [data-style="clean"], .formkit-form[data-uid="2a928aad60"][min-width~="800"] [data-style="clean"] {
                padding: 10px;
            }

            .formkit-form[data-uid="2a928aad60"][min-width~="700"] .formkit-fields[data-stacked="false"], .formkit-form[data-uid="2a928aad60"][min-width~="800"] .formkit-fields[data-stacked="false"] {
                margin-left: -5px;
                margin-right: -5px;
            }

                .formkit-form[data-uid="2a928aad60"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-field, .formkit-form[data-uid="2a928aad60"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-field, .formkit-form[data-uid="2a928aad60"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-submit, .formkit-form[data-uid="2a928aad60"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-submit {
                    margin: 0 5px 15px 5px;
                }

                .formkit-form[data-uid="2a928aad60"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-field, .formkit-form[data-uid="2a928aad60"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-field {
                    -webkit-flex: 100 1 auto;
                    -ms-flex: 100 1 auto;
                    flex: 100 1 auto;
                }

                .formkit-form[data-uid="2a928aad60"][min-width~="700"] .formkit-fields[data-stacked="false"] .formkit-submit, .formkit-form[data-uid="2a928aad60"][min-width~="800"] .formkit-fields[data-stacked="false"] .formkit-submit {
                    -webkit-flex: 1 1 auto;
                    -ms-flex: 1 1 auto;
                    flex: 1 1 auto;
                }
    </style>
</form><h1 id="changelog">Changelog</h1>
<div id="v1.98.12">
<h2 id="version1981215012024"><a href="#v1.98.12">Version 1.98.12</a> (15/01/2024)</h2>
<ul>
<li>
<p>[Minor changes]🤏</p>
<ul>
<li>Maintenance release.</li>
</ul>
</li>
<li>
<p>[Current Roadmap] 🚧</p>
<ul>
<li>Active snapshot feature,</li>
<li>License activation infrastructure.</li>
</ul>
</li>
</ul>
<div id="v1.98.11">
<h2 id="version1981101122023"><a href="#v1.98.11">Version 1.98.11</a> (01/12/2023)</h2>
<ul>
<li>
<p>[Minor changes]🤏</p>
<ul>
<li>Maintenance release.</li>
</ul>
</li>
<li>
<p>[Current Roadmap]🚧</p>
<ul>
<li>Active snapshot feature,</li>
<li>License activation infrastructure.</li>
</ul>
</li>
</ul>
<div id="v1.98.10">
<h2 id="version1981023112023"><a href="#v1.98.10">Version 1.98.10</a> (23/11/2023)</h2>
<ul>
<li>
<p>[Minor changes]🤏</p>
<ul>
<li>Tool Window renamed to &quot;ContextKeeper Mental Snapshots&quot;.</li>
</ul>
</li>
<li>
<p>[Current Roadmap] 🚧</p>
<ul>
<li>Active snapshot feature,</li>
<li>License activation infrastructure.</li>
</ul>
</li>
</ul>
<div id="v1.98.9">
<h2 id="version198903112023"><a href="#v1.98.9">Version 1.98.9</a> (03/11/2023)</h2>
<ul>
<li>[Minor changes]🤏
<ul>
<li>Improved continuous auto-save when debugging,</li>
</ul>
</li>
<li>[Bug fixes]💔
<ul>
<li>When continuous auto-save was delayed at solution load it could be immediately triggered by View.Branch or View.Repository commands.</li>
</ul>
</li>
</ul>
<div id="v1.98.8">
<h2 id="version198804102023"><a href="#v1.98.8">Version 1.98.8</a> (04/10/2023)</h2>
<ul>
<li>[Minor changes]🤏
<ul>
<li>Improved continuous auto-save for branch snapshots rigth after solution load, by introducing a 30-second pause. Previously, every time a solution was loaded, a branch snapshot was auto-saved just seconds later (triggered by events like OnWindowMoved, without any user input). This quickly updated the current branch snapshot, and there was no way to recover the &quot;lost snapshot&quot;.</li>
</ul>
</li>
</ul>
<div id="v1.98.7">
<h2 id="version198711092023"><a href="#v1.98.7">Version 1.98.7</a> (11/09/2023)</h2>
<ul>
<li>[Minor changes]🤏
<ul>
<li>The &quot;License expired&quot; modal dialog, that reminded to update to the latest Beta version, has been removed. There is no need for it any longer, because VS's built-in auto-update delivers and installs the latest version in the background.</li>
</ul>
</li>
<li>[Bug fixes]💔
<ul>
<li>Extended fix for <a href="https://github.com/ContextKeeper/ContextKeeper.VisualStudio/issues/9">&quot;The data necessary to complete this operation is not yet available&quot;  exception</a> in VS v17.8 Preview 1 which had slightly different behavior than similar fix for VS v17.7.</li>
</ul>
</li>
</ul>
<div id="v1.98.6">
<h2 id="version198621082023"><a href="#v1.98.6">Version 1.98.6</a> (21/08/2023)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>Fixed <a href="https://github.com/ContextKeeper/ContextKeeper.VisualStudio/issues/9">&quot;The data necessary to complete this operation is not yet available&quot;  exception</a> in VS v17.7 when creating a new snapshot - the last Visual Studio 2022 version 17.7 introduced a new bug to the VS API, which was first appeared in the 17.7 Preview 2, but has never been fixed since. This bug, in certain situations, has prevented a snapshot be created or updated.</li>
</ul>
</li>
</ul>
<div id="v1.98.5">
<h2 id="version198509082023"><a href="#v1.98.5">Version 1.98.5</a> (09/08/2023)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>Fixed split size for tab groups that weren't restored properly.</li>
</ul>
</li>
</ul>
<div id="v1.98.4">
<h2 id="version198418072023"><a href="#v1.98.4">Version 1.98.4</a> (18/07/2023)</h2>
<ul>
<li>[New]🆕
<ul>
<li>[UX] Instant search as you type.</li>
</ul>
</li>
</ul>
<div id="v1.98.2">
<h2 id="version1982305072023"><a href="#v1.98.2">Version 1.98.2(3)</a> (05/07/2023)</h2>
<ul>
<li>[Minor changes]🤏
<ul>
<li>Continuous auto-save improvements after switching git branches.</li>
</ul>
</li>
</ul>
<div id="v1.98.1">
<h2 id="version198102072023"><a href="#v1.98.1">Version 1.98.1</a> (02/07/2023)</h2>
<ul>
<li>[New]🆕
<ul>
<li>🤖ARM support (experimental),</li>
<li>[UX] Introduced file's icons when a snapshot file list is expanded.</li>
</ul>
</li>
</ul>
<div id="v1.98">
<h2 id="version19807062023"><a href="#v1.98">Version 1.98</a> (07/06/2023)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>In rare situations, a snapshot auto-save for the current branch can be triggered when switching from branch A to B. In such cases, the snapshot of branch B will be overridden with files from branch A, as the snapshot was taken with A's files just before the branch switch.</li>
</ul>
</li>
</ul>
<div id="v1.97">
<h2 id="version19725052023"><a href="#v1.97">Version 1.97</a> (25/05/2023)</h2>
<ul>
<li>[New]🆕
<ul>
<li>Double-clicking on a snapshot's file will restore not only the line and column position but also all metadata associated with the document, including <a href="https://contextkeeper.io/blog/launching-breakpoints-bookmarks-support/">breakpoints &amp; bookmarks</a>,</li>
</ul>
</li>
<li>[Bug fixes]💔
<ul>
<li>Breakpoints and bookmarks were not always saved for git branch snapshots - improved <a href="https://contextkeeper.io/blog/continuous-auto-saving-branch-snapshots-and-git-worktree-support/">continuous auto-save detection</a>,</li>
<li>Ensure correct branch setting for a new snapshot (GitBranch property) when switching to a new Git branch for the first time, especially if the branch does not yet have a branch snapshot,</li>
<li>Prevent unnecessary restoration of a branch snapshot when performing multiple <code>git checkout same_branch</code> operations.</li>
</ul>
</li>
</ul>
<div id="v1.96">
<h2 id="version19626042023"><a href="#v1.96">Version 1.96</a> (26/04/2023)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>Bookmarks and breakpoints correctly sorted by line in the JSON file.</li>
</ul>
</li>
</ul>
<div id="v1.95">
<h2 id="version19509032023"><a href="#v1.95">Version 1.95</a> (09/03/2023)</h2>
<ul>
<li>[New]🆕
<ul>
<li>Introducing <a href="https://contextkeeper.io/blog/launching-breakpoints-bookmarks-support/?utm_campaign=release-1.95-breakpoints-bookmarks&amp;utm_medium=post&amp;utm_source=blog">breakpoints &amp; bookmarks support</a> 🎉🍾</li>
</ul>
</li>
<li>[Bug fixes]💔
<ul>
<li>Document tab's metadata not restored properly when lower case path was used,</li>
<li>Breakpoints were restored only when there were bookmarks in a snapshot.</li>
</ul>
</li>
</ul>
<div id="v1.94">
<h2 id="version19408032023"><a href="#v1.94">Version 1.94</a> (08/03/2023)</h2>
<ul>
<li>[New]🆕
<ul>
<li>Introducing bookmarks preview support</li>
</ul>
</li>
</ul>
<div id="v1.93">
<h2 id="version19318012023"><a href="#v1.93">Version 1.93</a> (18/01/2023)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>Pinned tab's order was in reversed,</li>
<li>Fixed rare edge case when a file marked as [Read Only] cannot be restored from a snapshot.</li>
</ul>
</li>
</ul>
<div id="v1.92">
<h2 id="version19228112022"><a href="#v1.92">Version 1.92</a> (28/11/2022)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>Fixed serialization error for DockedHeight/DockedWidth JSON properties when a default culture is using comma ',' for decimal places.</li>
</ul>
</li>
</ul>
<div id="v1.91">
<h2 id="version19125112022"><a href="#v1.91">Version 1.91</a> (25/11/2022)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>GitBranch property related bug causing that a full branch name weren't reloaded properly from a snapshot file after Visual Studio was restarted.</li>
</ul>
</li>
</ul>
<div id="v1.9">
<h2 id="version1916112022"><a href="#v1.9">Version 1.9</a> (16/11/2022)</h2>
<ul>
<li>[New]🆕
<ul>
<li><a href="https://contextkeeper.io/blog/improved-git-integration-and-upcoming-bookmarks-support/"><strong>Git integration improvements</strong></a>:
<ul>
<li>[UX] The full name for auto-generated git branch snapshots in the Mental Snapshots window. The previous simplified implementation did not display <a href="https://stackoverflow.com/a/3651867/13022906">git special characters</a> in the branch name,</li>
<li>[UX] New git icon for a branch snapshot instead of &lt;Git Branch&gt; prefix,</li>
<li>New <code>GitBranch</code> JSON property created for every auto-generated branch snapshot. It allows to store full name of a git branch, and later use it on the UI. The previous implementation did not git special characters to be stored because a git branch name was based on a filename which has its own naming constraints.</li>
</ul>
</li>
<li>More detailed context by storing <code>IsSelected</code> and <code>IsActive</code> for every opened document tab that is selected and/or active. In every tab group different document can be selected at a time. Those additional properties allow to restore a tab's state in a more granular fashion.</li>
</ul>
</li>
<li>[Minor changes]🤏
<ul>
<li>[UX] Dedicated icon for a stashed snapshot instead of &lt;stashed&gt; placeholder,</li>
<li>[UX] A snapshot's tooltip with the full path.</li>
</ul>
</li>
<li>[Bug fixes]💔
<ul>
<li>The last opened document in a tab group did not have a line &amp; column set,</li>
<li>Some project's properties page using the <a href="https://github.com/dotnet/project-system/blob/main/docs/feature-comparison.md">legacy project format</a>, and <code>ProjectGuid</code> property, were not saved in a snapshot. Added an additional fallback strategy to support them,</li>
<li>An attempt to change invalid absolute path to relative broke the snapshot saving process,</li>
<li>Small change in the release process to prevent line &amp; column not being saved for a document tab.</li>
</ul>
</li>
</ul>
<h2 id="version1859102022"><a href="#v1.85">Version 1.85</a> (9/10/2022)</h2>
<h2 id="version18411092022"><a href="#v1.84">Version 1.84</a> (11/09/2022)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>Rarely pinned tabs weren't restored properly.</li>
</ul>
</li>
</ul>
<h2 id="version1837082022"><a href="#v1.83">Version 1.83</a> (7/08/2022)</h2>
<ul>
<li>[Minor changes]🤏
<ul>
<li>Removed more not relevant, repeated warnings from the output window.</li>
</ul>
</li>
</ul>
<h2 id="version1827072022"><a href="#v1.82">Version 1.82</a> (7/07/2022)</h2>
<ul>
<li>[Minor changes]🤏
<ul>
<li>Simplified serialization for DockedHeight and DockedWidth properties, only 3 significant digits after the decimal point are used,</li>
<li>Removed not relevant, <a href="https://github.com/ContextKeeper/ContextKeeper.VisualStudio/issues/2">repeated warnings from the output window</a>.</li>
</ul>
</li>
</ul>
<h2 id="version1815062022"><a href="#v1.81">Version 1.81</a> (5/06/2022)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>Fixed VS UI freeze (&quot;Preparing Solution...&quot; dialog running infinitely) when switching branches in VS 17.2.3 and 17.3.0 Preview 1.1</li>
</ul>
</li>
</ul>
<h2 id="version1818052022"><a href="#v1.8">Version 1.8</a> (18/05/2022)</h2>
<ul>
<li>[New]🆕
<ul>
<li>Support for relative paths 🚀 (<a href="https://contextkeeper.io/blog/roadmap-for-2022/">part of the 2022 Roadmap</a>)</li>
</ul>
</li>
</ul>
<h2 id="version17317052022"><a href="#v1.73">Version 1.73</a> (17/05/2022)</h2>
<ul>
<li>[Bug fixes]💔
<ul>
<li>Unexpected tabs added to a snapshot that weren't previously opened during snapshot creation</li>
</ul>
</li>
</ul>
<h2 id="version17208052022"><a href="#v1.72">Version 1.72</a> (08/05/2022)</h2>
<h2 id="version17114042022"><a href="#v1.71">Version 1.71</a> (14/04/2022)</h2>
<ul>
<li>[New]🆕
<ul>
<li>Search dialog (for all versions including VS 2022/2019/2017/2015 and VS 2013)</li>
</ul>
</li>
</ul>
<h2 id="version1710042022"><a href="#v1.7">Version 1.7</a> (10/04/2022)</h2>
<ul>
<li>[New]🆕
<ul>
<li>Search dialog (temporarily only for VS 2022). Coming soon for VS 2019/2017/2015/2013.</li>
</ul>
</li>
</ul>
<h2 id="version161042022"><a href="#v1.6">Version 1.6</a> (1/04/2022)</h2>
<ul>
<li>[New]🆕
<ul>
<li>Snapshot stashing and unstashing which improves workflow for switching quicker to an urgent tasks.</li>
</ul>
</li>
<li>[Bug fixes]💔
<ul>
<li>Maximized (full screen) windows are restored and saved correctly in a snapshot using additional JSON property &quot;WindowState: Maximized&quot;,</li>
<li><a href="https://github.com/ContextKeeper/ContextKeeper.VisualStudio/issues/1">Unnamed snapshot</a> won't show up anymore when there is no git (branch) detected.</li>
</ul>
</li>
<li>[Minor changes]🤏
<ul>
<li>Better checks to not overwrite branch snapshot with an empty snapshot (no windows opened),</li>
<li>The snapshots list is focused after a snapshot is created or renamed.</li>
</ul>
</li>
</ul>
<h2 id="version1512032022"><a href="#v1.5">Version 1.5</a> (12/03/2022)</h2>
<ul>
<li>[New]🆕
<ul>
<li>Refocusing the snapshots list after restore which allows to quickly restore  different snapshots using keyboard only - Up/Down + Enter keys support,</li>
<li>Deleting snapshot via keyboard (using &quot;Delete&quot; key). Added support for &quot;Escape&quot; key for the confirmation modal dialog,</li>
<li>Ability to update branch snapshot manually via context menu.</li>
</ul>
</li>
<li>[Bug fixes]💔
<ul>
<li>Branch snapshot is updated on the UI list when auto-save is triggered,</li>
<li>Branch snapshot is not overwritten with empty snapshots (no windows with code).</li>
</ul>
</li>
<li>[Minor changes]🤏
<ul>
<li>Changed windows pane (name) in the Output Window to &quot;ContextKeeper&quot; for consistency.</li>
</ul>
</li>
</ul>
<h2 id="version1411022022">Version 1.4 (11/02/2022)</h2>
<ul>
<li>Beta license expiration reminder (shows &quot;Mental Snapshots&quot; tool window) if  branch snapshot auto-save is triggered to prevent losing snapshot state (not more than every 2 hours).</li>
</ul>
<h2 id="version1312012022">Version 1.3 (12/01/2022)</h2>
<ul>
<li><a href="https://contextkeeper.io/blog/continuous-auto-saving-branch-snapshots-and-git-worktree-support/">Git worktree support</a>.</li>
</ul>
<h2 id="version1215122021">Version 1.2 (15/12/2021)</h2>
<ul>
<li>fix for rebase issue when switching between branches.</li>
</ul>
<h2 id="version1113122021">Version 1.1 (13/12/2021)</h2>
<ul>
<li>fix for rebase issue when multiple &quot;intermediate&quot; git snapshots where created during rebase process.</li>
</ul>
<h2 id="version1009122021">Version 1.0 (09/12/2021)</h2>
<ul>
<li>fixes around <a href="https://contextkeeper.io/blog/automatic-snapshot-switching-when-changing-branches-v1/">automatic snapshot switching for branches</a> - more reliable when working with multiple files that doesn't exists across different branches. There was a common problem when some files were &quot;missing&quot; in snapshots after changing branches.</li>
</ul>
</div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>]]></content:encoded></item><item><title><![CDATA[Dopamine detox for programmers]]></title><description><![CDATA[<blockquote>
<p>This article is part of C# Advent 2023. For more articles in the series by other authors, visit <a href="https://www.csadvent.christmas/">https://www.csadvent.christmas/</a></p>
</blockquote>
<p>Everyone has struggled with procrastination at some point in their lives. If they say otherwise, they are just lying. We are not robots and we have biological, physical</p>]]></description><link>http://contextkeeper.io/blog/dopamine-detox-for-programmers/</link><guid isPermaLink="false">656e72d5a6b838000775a602</guid><category><![CDATA[productivity]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Tue, 05 Dec 2023 01:34:02 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2023/12/Dopamine-detox-for-programmers.jpg" medium="image"/><content:encoded><![CDATA[<blockquote>
<img src="http://contextkeeper.io/content/images/2023/12/Dopamine-detox-for-programmers.jpg" alt="Dopamine detox for programmers"><p>This article is part of C# Advent 2023. For more articles in the series by other authors, visit <a href="https://www.csadvent.christmas/">https://www.csadvent.christmas/</a></p>
</blockquote>
<p>Everyone has struggled with procrastination at some point in their lives. If they say otherwise, they are just lying. We are not robots and we have biological, physical and mental limitations. If you are not aware of them, you will often have problems with procrastination without realizing what is the root cause.</p>
<p><strong>&quot;No pain, no gains&quot;</strong>. It is the simplest, most powerful tip possible. Works every time - just follow your pain. <strong>&quot;Just fucking do it, now&quot;</strong> - let it be your mantra from now on. It hurts the most at the beginning, the first 10-15 minutes is crucial for any activity which your brain recognize as &quot;unpleasant&quot; (no instant dopamine rush). Just start working on a &quot;hard task&quot; despite the (mental) pain and it will fade away.</p>
<p>Your brain is lazy and likes nice things (dopamine). The trick is to &quot;hack&quot; dopamine feedback loop. If you're starting an activity, and you feel mental pain, you're on the right track. The &quot;mental pain&quot; is yours brain trick to force you to conserve as much energy as possible if it doesn't bring immediate reward (dopamine), or if the outcomes are uncertain (any long-term activities).</p>
<p>Because your limbic system has two main modes: <strong>fight or flight</strong>. <strong>Due date</strong> is a <strong>trigger to fight</strong>. <strong>Hard task</strong> is a <strong>trigger to flight</strong>. This is why &quot;due date&quot; is working. &quot;Hard task&quot; is the trigger for procrastination.</p>
<h2 id="howtohackyourbrain">How to &quot;hack&quot; your brain</h2>
<ol>
<li>&quot;Dopamine detoxing&quot; - <a href="https://www.youtube.com/watch?v=6KhHNWFhwPc">watch this</a> video by Leon Hendrix and you will know how to do it. It's really good. Probably the best introduction so far and I have watched a lot of them. Or if you like more <a href="https://www.youtube.com/watch?v=i1fXAmApPrA">scientific approach by Andrew Huberman</a>.
<ul>
<li>Block social media, <strong>block any media that allows infinite scrolling with immediate reward (dopamine rush)</strong>: Twitter, TikTok, Facebook etc. (<a href="https://duckduckgo.com/?q=News+Feed+Eradicator&amp;t=newext&amp;atb=v398-1&amp;ia=web">News Feed Eradicator plugin for Chrome/Firefox does the job</a>)</li>
<li>No music, no games, no podcasts, nothing,</li>
<li>Books are allowed. But be careful, reading too much can be another form of procrastination.</li>
</ul>
</li>
<li>Internal &quot;due dates&quot; made by you. Check them weekly.</li>
<li>Doing the most important thing (&quot;hard task&quot;) as the first thing in the morning, or when you start you work. That means no reading, no social media before. Just starts working.</li>
<li>Measure you daily activates. I personally use <a href="https://toggl.com/track/">Toggl Track</a> (free). If you don't measure, you just guessing how you perform.</li>
</ol>
<p>This is a good starting point. Later you could develop your own custom system based on different resources. My personal recommendations: book &quot;The War of Art&quot; by Steven Pressfield, and videos by Alex Becker - <a href="https://youtu.be/eBPsWni-3Fs?t=139">dopamine detox</a> and <a href="https://www.youtube.com/watch?v=UPpnXuVZWIE">treating life as a game</a> .</p>
<h2 id="youarenotyourbrain">You are not your brain</h2>
<p>I also want to share with you two amazing videos that had a huge impact on my (not only) developer productivity many years ago and taught me how to balance my life energy better throughout the day. They gave a better understanding of how our brain and mind work, especially under heavy stress (e.g., deadlines), and provided great tools for everyday challenges.</p>
<p>Short form, packed with value (only 29 and 23 minutes). Those are little gems 💎 from my private “diamonds” list:</p>
<ul>
<li><a href="https://youtu.be/qcrGlUHlu4M?t=70">You are not your brain, Dr Jeffrey M Schwartz (2011)</a></li>
<li><a href="https://youtu.be/FKTxC9pl-WM?t=8">Making Badass Developers, Kathy Sierra (2015)</a></li>
</ul>
<p>After watching them, you won’t ever again fall for your brain's tricks that easily. Dude's smart, but you'll be prepared. Your brain is just a tool for your consciousness and mind. And remember, “You are not your brain”.</p>
]]></content:encoded></item><item><title><![CDATA[Launching Breakpoints & Bookmarks support. ContextKeeper V2 is getting closer.]]></title><description><![CDATA[<p>I’m really happy and excited that finally the two biggest features, <strong>breakpoints and bookmarks</strong>, have finally been implemented and are now available the <a href="https://contextkeeper.io/?utm_campaign=release-1.95-breakpoints-bookmarks&amp;utm_medium=post&amp;utm_source=blog"><strong>ContextKeeper version 1.95!</strong></a> 🎉🍾</p>
<p><strong>Bookmarks</strong>, <strong>breakpoints</strong>, and <a href="https://contextkeeper.io/blog/relative-paths-support-in-v1-8-and-contextkeeper-mentioned-on-the-jesse-libertys-podcast/"><strong>relative paths</strong></a> (implemented in May 2022) were the big missing pieces from the <a href="https://contextkeeper.io/blog/roadmap-for-2022/">2022 roadmap</a> that I always wanted</p>]]></description><link>http://contextkeeper.io/blog/launching-breakpoints-bookmarks-support/</link><guid isPermaLink="false">6411d026c9c496233ca3869d</guid><category><![CDATA[release]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Wed, 15 Mar 2023 18:02:55 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2023/03/Title_Breakpoints-Bookmarks.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2023/03/Title_Breakpoints-Bookmarks.jpg" alt="Launching Breakpoints & Bookmarks support. ContextKeeper V2 is getting closer."><p>I’m really happy and excited that finally the two biggest features, <strong>breakpoints and bookmarks</strong>, have finally been implemented and are now available the <a href="https://contextkeeper.io/?utm_campaign=release-1.95-breakpoints-bookmarks&amp;utm_medium=post&amp;utm_source=blog"><strong>ContextKeeper version 1.95!</strong></a> 🎉🍾</p>
<p><strong>Bookmarks</strong>, <strong>breakpoints</strong>, and <a href="https://contextkeeper.io/blog/relative-paths-support-in-v1-8-and-contextkeeper-mentioned-on-the-jesse-libertys-podcast/"><strong>relative paths</strong></a> (implemented in May 2022) were the big missing pieces from the <a href="https://contextkeeper.io/blog/roadmap-for-2022/">2022 roadmap</a> that I always wanted to include as ContextKeeper’s cornerstones.</p>
<p>Not only are open files remembered, but so are their order, pinned and selected state, line and column position, document groups, window position, breakpoints, and bookmarks. And last but not least, you can seamlessly open them across different development environments (thanks to relative paths).</p>
<video width="830" height="" muted controls autoplay loop>
    
    <source src="http://contextkeeper.io/content/images/2023/03/Breakpoints & Bookmarks.mp4" type="video/mp4">

    Sorry, your browser doesn't support embedded videos.
</video><p>From the early days of <a href="https://contextkeeper.io/?utm_campaign=release-1.95-breakpoints-bookmarks&amp;utm_medium=post&amp;utm_source=blog">ContextKeeper</a>, I wanted to be sure that every  released feature was of top quality and production-ready, despite the  fact that we are still in the Private Beta 😄. Therefore, the polishing  phase for breakpoints and bookmarks support has taken a lot longer than I had originally expected. Surprisingly, the bookmarks support was a lot  more complex than I had initially thought based on the early December  prototype.</p>
<p>Generally, when a snapshot is created, <strong>breakpoints</strong> and <strong>bookmarks</strong> are <strong>saved only for the currently open files</strong>. This behavior differs from that of Visual Studio, which remembers all  breakpoints and bookmarks across different sessions for all files.  However, I believe that saving them only for open files is more  practical. I remember countless examples of finding old breakpoints from days before that were no longer relevant because I was working on a  different task.</p>
<p>The second important thing is that <strong>when they are restored for a file</strong>, all <strong>old breakpoints or/and bookmarks are removed if there were any</strong>, but only for that file and nothing else.</p>
<h2 id="breakpoints">Breakpoints</h2>
<p>Standard and conditional breakpoints are currently supported. When breakpoint is disabled it will be still saved to a snapshot with <code>IsEnabled</code> property set to <code>false</code> and restored in a disabled state later in the Visual Studio. A single conditional expression is supported with two modes <code>Is true</code> and <code>When changed</code></p>
<p><img src="http://contextkeeper.io/content/images/2023/03/Breakpoints_JSON.png" alt="Launching Breakpoints & Bookmarks support. ContextKeeper V2 is getting closer."></p>
<p>Although the <strong>supported area is probably enough for about 90-95% of use cases</strong>, there are <strong>some limitations</strong>:</p>
<ul>
<li>only a single conditional expression,</li>
<li>no support for Hit Count or Filter expressions,</li>
<li>no support for Actions, “Remove breakpoint once” hit or “Only enable when the following breakpoint is hit” options.</li>
</ul>
<p>I will be looking for ways to support excluded areas, starting from “Hit  Count” and combined conditions (e. g. Conditional Expression with Hit  Count). Unfortunately not every breakpoint’s detail is easily exposed  via API but I will be extensively digging in Visual Studio’s internals  to cover more use cases.</p>
<h2 id="bookmarks">Bookmarks</h2>
<p>Bookmarks are stored using line numbers in a similar way to breakpoints.</p>
<p><img src="http://contextkeeper.io/content/images/2023/03/Bookmarks.png" alt="Launching Breakpoints & Bookmarks support. ContextKeeper V2 is getting closer."></p>
<p>Visual Studio API for bookmarks is really limited; therefore, currently there is no support for:</p>
<ul>
<li>named bookmarks - only the line number is stored but not the bookmark name,</li>
<li>folders - bookmarks folder structure is not restored.</li>
</ul>
<p>I hope you will enjoy using new breakpoints &amp; bookmarks support!</p>
]]></content:encoded></item><item><title><![CDATA[Visual Studio Tips and Tricks Advent Calendar for 2022]]></title><description><![CDATA[<h1 id="day4peekimplementationonsteroidswithresharper">🎅 Day 4 - Peek Implementation on steroids with Resharper</h1>
<p>Peek implementation, <code>Ctrl + Alt + Q</code></p>
<p>Navigate using arrows <code>⬆</code> <code>⬇</code> + <code>Enter</code> to select</p>
<video width="830" height="" muted controls autoplay loop>
    
    <source src="http://contextkeeper.io/content/images/2022/12/Day 4 - Peek Implementation.mp4" type="video/mp4">

    Sorry, your browser doesn't support embedded videos.
</video><h1 id="day3gotolineanddisplayinglinenumbers">🎅 Day 3 - Go To Line and Displaying Line Numbers</h1>
<p>Go To Line, <code>Ctrl + G</code></p>
<p>To display line numbers go to Tools-&gt;</p>]]></description><link>http://contextkeeper.io/blog/visual-studio-tips-advent-calendar-for-2022/</link><guid isPermaLink="false">6388e3e5f424102f08364e44</guid><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Thu, 01 Dec 2022 20:37:43 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1605199034999-05b3e829a2f6?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDl8fGNhbGVuZGFyJTIwZGVjZW1iZXJ8ZW58MHx8fHwxNjY5OTE2MTE3&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" medium="image"/><content:encoded><![CDATA[<h1 id="day4peekimplementationonsteroidswithresharper">🎅 Day 4 - Peek Implementation on steroids with Resharper</h1>
<img src="https://images.unsplash.com/photo-1605199034999-05b3e829a2f6?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDl8fGNhbGVuZGFyJTIwZGVjZW1iZXJ8ZW58MHx8fHwxNjY5OTE2MTE3&ixlib=rb-4.0.3&q=80&w=1080" alt="Visual Studio Tips and Tricks Advent Calendar for 2022"><p>Peek implementation, <code>Ctrl + Alt + Q</code></p>
<p>Navigate using arrows <code>⬆</code> <code>⬇</code> + <code>Enter</code> to select</p>
<video width="830" height="" muted controls autoplay loop>
    
    <source src="http://contextkeeper.io/content/images/2022/12/Day 4 - Peek Implementation.mp4" type="video/mp4">

    Sorry, your browser doesn't support embedded videos.
</video><h1 id="day3gotolineanddisplayinglinenumbers">🎅 Day 3 - Go To Line and Displaying Line Numbers</h1>
<p>Go To Line, <code>Ctrl + G</code></p>
<p>To display line numbers go to Tools-&gt;Options&gt;Text Editor-&gt;All Languages</p>
<video width="830" height="" muted controls autoplay loop>
    
    <source src="http://contextkeeper.io/content/images/2022/12/Day 3 - Go To Line And Line Numbers.mp4" type="video/mp4">

    Sorry, your browser doesn't support embedded videos.
</video><h1 id="day2gotodefinitionandpeekdefinition">🎅 Day 2 - Go To Definition and Peek Definition</h1>
<p>To navigate to implementation details (Go To Definition), press <code>F12</code> or<br>
<code>Ctrl + mouse click</code>.</p>
<p>To only peek on a definition, press <code>Alt + F12</code>, which will open small panel below your cursor allowing you to edit the code without losing current context.</p>
<p>Pressing <code>Alt + F12</code> multiple times will recursively open Peek Definition panel. You can navigate back (<code>Ctrl + Alt + -</code>) and forth (<code>Ctrl + Alt + =</code>) between different fragments using breadcrumbs.</p>
<p>You can close the Peek Definition view by pressing <code>Esc</code> and switch between the editor and the definition window by pressing <code>Shift+Esc</code>.</p>
<video width="830" height="" muted controls autoplay loop>
    
    <source src="http://contextkeeper.io/content/images/2022/12/Day 2 - Go To Definition and Peek Definition.mp4" type="video/mp4">

    Sorry, your browser doesn't support embedded videos.
</video><h1 id="day1navigatetorecentcursorpositions">🎅 Day 1 - Navigate to Recent Cursor Positions</h1>
<p>To navigate to recently visited/edited code in the current session, press <code>Ctrl + -</code>. You can do this multiple times.</p>
<p>To navigate forward, press <code>Ctrl + Shift + -</code>. The forward and backward mouse buttons also work in the same way.</p>
<video width="830" height="" muted controls autoplay loop>
    
    <source src="http://contextkeeper.io/content/images/2022/12/Navigate_to_Recent_Cursor Positions.mp4" type="video/mp4">

    Sorry, your browser doesn't support embedded videos.
</video><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/clo7R9GuMwQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen title="Navigate to Recent Cursor Positions  - Visual Studio Tips and Tricks Advent Calendar for 2022"></iframe></figure>]]></content:encoded></item><item><title><![CDATA[Improved Git integration and upcoming bookmarks support]]></title><description><![CDATA[<p><a href="https://contextkeeper.io/blog/downloads/?utm_campaign=new-release-1.9&amp;utm_medium=postl&amp;utm_source=blog"><strong>Release v1.9 is here!</strong></a> 🎉 Grab it if you haven't updated already. <strong><a href="https://contextkeeper.io">ContextKeeper</a> 1.9</strong> is mainly <strong>feature release</strong> packed with cool new features that will make switching contexts even  more smoother than before. There are some UX upgrades and git  integration improvements. Also, a lot of small annoying bugs</p>]]></description><link>http://contextkeeper.io/blog/improved-git-integration-and-upcoming-bookmarks-support/</link><guid isPermaLink="false">63877373d9655678b09d9095</guid><category><![CDATA[release]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Wed, 30 Nov 2022 18:26:11 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1550439062-609e1531270e?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwxMTc3M3wwfDF8c2VhcmNofDIyfHxjb21wdXRlciUyMGNvZGV8ZW58MHx8fHwxNjY5ODkzNjMy&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1550439062-609e1531270e?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxMTc3M3wwfDF8c2VhcmNofDIyfHxjb21wdXRlciUyMGNvZGV8ZW58MHx8fHwxNjY5ODkzNjMy&ixlib=rb-4.0.3&q=80&w=1080" alt="Improved Git integration and upcoming bookmarks support"><p><a href="https://contextkeeper.io/blog/downloads/?utm_campaign=new-release-1.9&amp;utm_medium=postl&amp;utm_source=blog"><strong>Release v1.9 is here!</strong></a> 🎉 Grab it if you haven't updated already. <strong><a href="https://contextkeeper.io">ContextKeeper</a> 1.9</strong> is mainly <strong>feature release</strong> packed with cool new features that will make switching contexts even  more smoother than before. There are some UX upgrades and git  integration improvements. Also, a lot of small annoying bugs 🐛 were  squashed during the process (<a href="https://contextkeeper.io/blog/downloads/?utm_campaign=new-release-1.9&amp;utm_medium=post&amp;utm_source=blog">changelog</a>).</p>
<p>This year, will bring at least one additional feature release, making your  every snapshot more dense and filled with new contextual metadata. Did I say we're just getting started? Hell yes!💪 The gas pedal is pressed to the floor. If you already enjoy using <a href="https://contextkeeper.io/">ContextKeeper</a>, you will shortly  fall in love with it in the coming months. I can guarantee that!</p>
<h2 id="gitintegrationimprovements">Git integration improvements</h2>
<figure class="kg-card kg-image-card"><img src="http://contextkeeper.io/content/images/2022/11/New-git-and-stash-icons.jpg" class="kg-image" alt="Improved Git integration and upcoming bookmarks support"><figcaption>New icons and full git's branch name support</figcaption></figure><p>Finally, a full branch name is displayed for auto-generated git snapshots. A new GitBranch property was introduced to the snapshot JSON format. Now it stores the actual full branch name for a given snapshot:</p>
<figure class="kg-card kg-image-card"><img src="http://contextkeeper.io/content/images/2022/11/GitBranch-property.png" class="kg-image" alt="Improved Git integration and upcoming bookmarks support"><figcaption>New GitBranch property in the JSON snapshot format</figcaption></figure><p>There are also nice new icons for a git branch and a stashed snapshot,  instead of the temporary text placeholders that were before - <code>&lt;Git Branch&gt;</code> and <code>&lt;Stashed&gt;</code>.</p>
<p>The previous implementation did not display <a href="https://stackoverflow.com/a/3651867/13022906">git special characters</a> in the branch name. The special characters were always removed because  the output string should be a valid filename to save a branch snapshot.</p>
<p>The implementation is still not perfect because it does not support naming  collisions. There are still rare situations when they can occur.  Improved support will appear in the future releases. If you will notice  any problems where a context is not restored properly <a href="https://github.com/ContextKeeper/ContextKeeper.VisualStudio/issues">please report an issue here</a>.</p>
<figure class="kg-card kg-image-card"><img src="http://contextkeeper.io/content/images/2022/11/Snapshot-tooltip.jpg" class="kg-image" alt="Improved Git integration and upcoming bookmarks support"><figcaption>Snapshot's full path name</figcaption></figure><p>Small finishing touches are important for a good UX which is why a tool tip was added to display the actual type of a snapshot (<em>standard, git branch or stash</em>) with a full path name. Now it's now easier to recognize where a given snapshot is stored.</p>
<h2 id="selectedandactivedocumentsintabgroups"><strong>Selected and active documents in tab groups</strong></h2>
<p>There can be multiple tab groups opened at once and single document <strong>selected</strong> in each:</p>
<figure class="kg-card kg-image-card"><img src="http://contextkeeper.io/content/images/2022/11/Selected-tabs-in-groups.jpg" class="kg-image" alt="Improved Git integration and upcoming bookmarks support"><figcaption>Selected documents</figcaption></figure><p>The state of both selected documents is now preserved using <code>IsSelected</code> JSON property.</p>
<p>Additionally, support for the <strong>active</strong> tab was added. When a document has focus while generating the snapshot, it will be tagged internally using <code>IsActive</code> property.</p>
<figure class="kg-card kg-image-card"><img src="http://contextkeeper.io/content/images/2022/11/IsActive--property.png" class="kg-image" alt="Improved Git integration and upcoming bookmarks support"><figcaption>Active document</figcaption></figure><p>If you have noticed that sometimes document's line and column position wasn't restored properly - there is a good news! At least two line&amp;column bugs were fixed in the v1.9 (<a href="https://contextkeeper.io/blog/downloads/?utm_campaign=new-release-1.9&amp;utm_medium=post&amp;utm_source=blog">changelog</a>).</p>
<h2 id="bookmarks-support-is-coming-soon">Bookmarks support is coming soon</h2><p>Bookmarks support is part of <a href="https://contextkeeper.io/blog/roadmap-for-2022/?utm_campaign=new-release-1.9&amp;utm_medium=post&amp;utm_source=blog">the 2022 Roadmap</a> and I'm happy to annouce it is almost ready🔥:</p>
<video width="1000" height="" muted controls autoplay loop>
    

    <source src="http://contextkeeper.io/content/images/2022/11/Bookmarks_preview.mp4" type="video/mp4">

    Sorry, your browser doesn't support embedded videos.
</video>]]></content:encoded></item><item><title><![CDATA[Maintaining high productivity for developers - working in the morning.]]></title><description><![CDATA[<p>I want to share with you the best methods to maintain high productivity. These are carefully selected practices that work. I've tried every method I heard about in the last 17 years. Some do work but some definitely don't. Let's focus this time on the ones that work:</p>
<ul>
<li><strong>Working in</strong></li></ul>]]></description><link>http://contextkeeper.io/blog/maintaining-high-productivity-for-developers-working-in-the-morning/</link><guid isPermaLink="false">62fb76ab0dcae400076f1572</guid><category><![CDATA[productivity]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Tue, 16 Aug 2022 11:19:29 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2022/08/Working-in-the-morning.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2022/08/Working-in-the-morning.jpg" alt="Maintaining high productivity for developers - working in the morning."><p>I want to share with you the best methods to maintain high productivity. These are carefully selected practices that work. I've tried every method I heard about in the last 17 years. Some do work but some definitely don't. Let's focus this time on the ones that work:</p>
<ul>
<li><strong>Working in the morning</strong></li>
<li>Fasting and razor-sharp focus</li>
<li>Focus (time) blocks</li>
<li>Tracking working hours, you don't know when you don't measure</li>
<li>Good night sleep, at least 7+ hours</li>
<li>Low stress level</li>
</ul>
<h3 id="workinginthemorning">Working in the morning</h3>
<p>Your mental energy tank is refilled after good night sleep. Don't waste it in the morning on the non-essential activities like emails, meetings, reading news or even gym/physical activity. Try to do as much creative work and coding as possible. And take a break. Remember that the <a href="http://paulgraham.com/makersschedule.html">maker's schedule</a> is different and not compatible with the manager's schedule. You will be amazed how much you can do in 3-4 hours in the morning when you're really focus in the distraction free environment.</p>
<p>Mental energy is finite and it's draining through the day. Those hard limitations are put in place by the human brain. There is no magic hack or pill that will extend your ability to concentrate. After sometime you will finally hit &quot;the wall&quot; and more coffee, quick naps or meditation won't help. Remember to use your mental energy wisely through the day. To turbo-charge your ability to focus I recommend reading <a href="https://davidrock.net/portfolio-items/your-brain-at-work/">&quot;Your Brain at Work&quot;</a> by David Rock.</p>
<p>Kathy Sierra has really good explanation why mental energy is finite and <a href="https://www.youtube.com/watch?v=FKTxC9pl-WM&amp;t=385s">how to protect yourself from losing it</a>.</p>
<p>You can be surprised why I'm against gym in the morning? It will exhaust your body nervous system and you will have hard time to concentrate. A pump you feel in your muscles is nice when training, but it gets in the way of your creative work. Also, physical exhaustion doesn't help to maintain high level of mental focus. I've been weight training and powerlifting for more than 25 years (with longer breaks) and I recommend training in the afternoon or evening, but not too late because it may cause problems with falling asleep.</p>
<p>... to be continued. Subscribe to the part 2, &quot;Fasting and razor-sharp focus&quot;, below.</p>
]]></content:encoded></item><item><title><![CDATA[Programmer Interrupted: The Real Cost of Interruption and Context Switching]]></title><description><![CDATA[<p>Interruptions and context switching are the two most costly factors that directly impact a programmer's daily productivity. Although there is no permanent way to avoid them, there are some interesting strategies to minimize their impact.</p>
<h2 id="thecostofaninterruption">The Cost of an Interruption</h2>
<p>Based on various scientific studies, it takes at least 10-15</p>]]></description><link>http://contextkeeper.io/blog/the-real-cost-of-an-interruption-and-context-switching/</link><guid isPermaLink="false">62c6c3294a579300073cdb81</guid><category><![CDATA[productivity]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Sun, 17 Jul 2022 21:31:37 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2022/08/The-Real-Cost-of-Interruption-and-Context-Switching_o.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2022/08/The-Real-Cost-of-Interruption-and-Context-Switching_o.jpg" alt="Programmer Interrupted: The Real Cost of Interruption and Context Switching"><p>Interruptions and context switching are the two most costly factors that directly impact a programmer's daily productivity. Although there is no permanent way to avoid them, there are some interesting strategies to minimize their impact.</p>
<h2 id="thecostofaninterruption">The Cost of an Interruption</h2>
<p>Based on various scientific studies, it takes at least 10-15 minutes to get back into the &quot;zone&quot; after an interruption (<a href="http://www.chrisparnin.me/pdf/parnin-sqj11.pdf">Parnin:10</a>, <a href="https://www.researchgate.net/publication/220093595_Interrupts_Just_a_Minute_Never_Is">vanSolingen:98</a>). Depending on the complexity of the task and your mental energy, it can definitely take more than just 15 minutes:</p>
<div style="text-align: center;"> 
    <a href="https://heeris.id.au/2013/this-is-why-you-shouldnt-interrupt-a-programmer/">
<img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/wSrVBwzBiivGtC7vxxFkXK/email" alt="Programmer Interrupted: The Real Cost of Interruption and Context Switching"> 
        </a>
</div><p>If an interruption occurs when you have a lot of balls in the air -  multiple pieces of unfinished code fitting together in a complex way -  then returning to the flow state can be more challenging. This concept  is well-known to every programmer, but probably only a few have heard  about <a href="http://en.citizendium.org/wiki/Parable_of_the_two_watchmakers"><em>The Parable of the Two Watchmakers</em></a>, which perfectly captures all those details in a comprehensible form, even for non-programmers:</p>
<blockquote>
<p>There once were two watchmakers, named Hora and Tempus, who made very fine watches. The phones in their workshops rang frequently and new customers were constantly calling them. However, Hora prospered while Tempus became poorer and poorer. In the end, Tempus lost his shop. What was the reason behind this?</p>
<p>The watches consisted of about 1000 parts each. The watches that Tempus made were designed such that, when he had to put down a partly assembled watch, it immediately fell into pieces and had to be reassembled from the basic elements. Hora had designed his watches so that he could put together sub-assemblies of about ten components each, and each sub-assembly could be put down without falling apart. Ten of these sub-assemblies could be put together to make a larger sub-assembly, and ten of the larger sub-assemblies constituted the whole watch.</p>
</blockquote>
<h2 id="thecostofcontextswitching">The Cost of Context Switching</h2>
<p>When switching between complex programming tasks, it is typically more mentally challenging to return to the flow state than it is from a &quot;simple&quot; interruption. Fully switching to something else requires flushing the cache (short-term memory) and loading an entirely new context. This process takes time, effort, and mental energy, which is <a href="https://youtu.be/FKTxC9pl-WM?t=385">finite and depletes throughout the day</a>. These hard limitations are imposed by the human brain.</p>
<p>There is an exceptional book written by David Rock, called <a href="https://davidrock.net/portfolio-items/your-brain-at-work/">Your Brain at Work</a>, that I highly recommend if you are interested in improving how you spend your mental energy throughout the day. The gist is to treat your brain, during a deep work session, as a stage. As a session starts, you slowly introduce essential actors (objects, tasks, and pieces of  information) into a scene (short-term memory aka cache). To properly light up a scene, you need to use some energy - mental energy.</p>
<div style="text-align: center;"> 
<figure>
<img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/6DjR9Q9mjXMH9acNE1ijm2/email" alt="Programmer Interrupted: The Real Cost of Interruption and Context Switching"> 
        <figcaption>Mind as a stage, during a long deep work session</figcaption>
</figure>

</div><p>When you get distracted, the entire stage collapses, and it takes effort to rebuild it from the ground up. However, there are some handy techniques to rebuild it faster.</p>
<h2 id="rebuildingthecontext">Rebuilding The Context</h2>
<p>For programmers, rebuilding the context after a task switch usually involves going back to old code that was previously edited or debugged. Before editing starts, programmers navigate to several locations to rebuild the context (<a href="http://www.chrisparnin.me/pdf/parnin-sqj11.pdf">Parnin:10</a>). However, task resumption can become much more painful if an IDE doesn't remember the previous working state. This usually means:</p>
<ul>
<li>last opened files,</li>
<li>cursor position (line &amp; column) for every opened file,</li>
<li>breakpoints, watch variables and expressions,</li>
<li>bookmarks,</li>
<li>windows positions with the same layout (including tab's splits).</li>
</ul>
<p>Rebuilding the last working state in an IDE <strong>manually</strong> is usually <a href="https://developercommunity.visualstudio.com/t/vs2017-1552-does-not-restore-open-documents/175923#T-N177842-N178047">a real pain and mentally challenging</a>:</p>
<blockquote>
<p>Losing this functionality interrupts my workflow beyond imagination. The opened documents represent a &quot;bookmark&quot; for me and I'm barely able to pick up work again without them.</p>
<p>Every time this happens (...) I am willing to put hours into finding a solution, because <strong>the thought of losing my opened document state once more</strong> after a work session <strong>is terrifying</strong>. But this time around (...) nothing of the usual remedies helps (...) This has added another 20 minutes and counting to my <strong>two hours</strong> put into solving this.</p>
</blockquote>
<p>and programmers are perfectly aware of the problem:</p>
<blockquote>
<p>This is a <strong>much bigger problem than it sounds</strong> as you then need to use other ways to remember what you were working on. <strong>This causes A LOT of lost time</strong> - <a href="https://developercommunity.visualstudio.com/t/visual-studio-reopens-with-no-windows-open/196306"><em>source</em></a>.</p>
</blockquote>
<blockquote>
<p>It’s so <strong>frustrating</strong> to have to keep pinning the same tabs over &amp; over &amp; over &amp; over &amp; over &amp; over (I think you get the point). (...) My <strong>productivity goes down</strong>, and <strong>my stress level goes up!</strong> - <em><a href="https://developercommunity.visualstudio.com/t/vs-2019-constantly-forgets-pinned-tabs-after-exiti/517954">source</a></em>.</p>
</blockquote>
<p>Which is why, the ability to save working state is now considered a fundamental feature of every good IDE nowadays. However, this was not always the case. Vim introduced <a href="http://vimdoc.sourceforge.net/htmldoc/starting.html#views-sessions"><code>:mksession</code></a> command in the v5.2 around <a href="https://github.com/vim/vim-history/commit/2b6ade85b98b1018fcb120b1b9c982b6917a8c49#diff-e87cb37ae2c2735925ec5c4eaf80928058595bfef42f10ddc4690fa0cae13a83">1998</a>:</p>
<blockquote>
<p>A Session keeps the Views for all windows, plus the global settings. You can save a Session and when you restore it later the window layout looks the same. You can use a Session to quickly switch between different projects, automatically loading the files you were last working on in that project.</p>
</blockquote>
<p>The 640 x 480 resolution was <a href="https://en.wikipedia.org/wiki/Display_resolution">the standard from 1990 to around 1996</a>, but it was possible to get more screen real estate back then. There is a famous photo of John Carmack working on Quake using a 28-inch 1080p monitor in 1995.</p>
<div style="text-align: center;"> 
<figure>
    <img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/x5HeHRppTqpkVBzjUPgPA6/email" alt="Programmer Interrupted: The Real Cost of Interruption and Context Switching"> 
        <figcaption>John Carmack and 28-inch 1080p monitor<figcaption>
</figcaption></figcaption></figure>
</div><p>Why did he choose <a href="https://web.archive.org/web/20111010222154/https://geek.com/articles/games/john-carmack-coded-quake-on-a-28-inch-169-1080p-monitor-in-1995-20110920/">45 kg monitor</a> for about $10k in 1995? The higher screen real estate allowed for more code to be visible at once, resulting in a more dense context. Productivity greatly increases when you have the ability to store and access more detailed context. It's like having a larger desk to hold documents when studying for an exam or doing any task that requires the use of multiple sources of information from a common domain, such as solving puzzles.</p>
<p>I still remember working on my Amiga 1200 in the early 90s, using <a href="https://amiga.lychesis.net/knowledge/ScreenModes.html">HiRes resolution (640x256)</a> and coding in C using <a href="https://www.youtube.com/watch?v=L41oIvre9K0">CygnusED editor</a>.</p>
<div style="text-align: center;"> 
<figure>
    <img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/nVu53wQfVVbLwg8SnQ6McK/email" alt="Programmer Interrupted: The Real Cost of Interruption and Context Switching"> 
        <figcaption>CygnusED on Amiga 2000<figcaption>
</figcaption></figcaption></figure>
</div><p>Only one file can be opened at a time on this screen, and it does not offer as much real estate as my primary 4K monitor does these days. From a developer's standpoint, the effect and advancements of <a href="https://en.wikipedia.org/wiki/Display_resolution">display resolutions</a> on daily productivity are immense. Let us attempt to define this observation.</p>
<h4 id="thelawofcontextdensity">The Law of Context Density</h4>
<blockquote>
<p>A larger context naturally emerges with a bigger screen real estate.</p>
</blockquote>
<h2 id="theroleofprospectivememory">The Role of Prospective Memory</h2>
<p>Why is it so important for programmers to have access to their last working context? Let's start with the definition of <a href="https://en.wikipedia.org/wiki/Prospective_memory"><em>prospective memory</em></a> by John A. Meacham:</p>
<blockquote>
<p><em>Prospective Memory</em> - information with implications for actions to be performed in the future.</p>
</blockquote>
<p>Prospective memory is akin to a sticky note posted on a fridge with a reminder to buy milk after work, or an important document placed near an exit door so that you won't forget it when leaving the next morning.</p>
<p>A last working context is a form of prospective memory task, so a resumption failure is also a prospective memory failure (<a href="https://hsi.arc.nasa.gov/flightcognition/Publications/Dodhia_SARMAC'05.pdf">Dodhia:05</a>). Have you ever tried to remember a shopping list by only memorizing it? It can be a nightmare, unless you know how to do it properly (e.g., through visualization techniques). Even a short list is hard to remember. That's why we constantly help our prospective memory by storing bits of information here and there, acting like anchors. When you enter your (remote) office in the morning, there are visual anchors that automatically trigger certain areas of your prospective memory, such as flowers that need to be watered or a document lying on the desk that needs to be processed today. Opening an IDE allows another set of anchors to fire up prospective memory-related tasks.</p>
<p>While modern IDEs can be fairly good at remembering the last working state, they usually lack the ability to switch between them easily. There are few exceptions. Vim with <a href="http://vimdoc.sourceforge.net/htmldoc/starting.html#views-sessions"><code>:mksession</code></a>, Emacs with support for <a href="https://www.emacswiki.org/emacs/EmacsSession">sessions via different packages</a>, Qt Creator with <a href="https://doc.qt.io/qtcreator/creator-project-managing-sessions.html">similar functionality</a>, and IntelliJ-based IDEs with <a href="https://www.jetbrains.com/help/idea/managing-tasks-and-context.html">task and contexts support</a>.</p>
<blockquote>
<p>Looking for a way to <strong>save working state</strong> in <strong>Visual Studio</strong>? Check out my <a href="https://contextkeeper.io/"><strong>ContextKeeper</strong></a> <strong>plugin</strong> with <a href="https://contextkeeper.io/blog/automatic-snapshot-switching-when-changing-branches-v1/"><em>automatic working state switching when changing branches</em></a>.</p>
</blockquote>
<blockquote>
<p>💬 There’s a great discussion about this post going on on Hacker News. <a href="https://news.ycombinator.com/item?id=35459333">Join the conversation!</a></p>
</blockquote>
<h2 id="references">References</h2>
<ul>
<li>
<p><a href="http://www.chrisparnin.me/pdf/parnin-sqj11.pdf">Parnin:10</a> Resumption strategies for interrupted programming tasks</p>
<ul>
<li>also highly recommend reading <a href="http://blog.ninlabs.com/2013/01/programmer-interrupted/">Programmer Interrupted</a> which summarizes various research papers</li>
</ul>
</li>
<li>
<p><a href="https://www.researchgate.net/publication/220093595_Interrupts_Just_a_Minute_Never_Is">vanSolingen:98</a> Interrupts: Just a Minute Never Is</p>
</li>
<li>
<p><a href="https://hsi.arc.nasa.gov/flightcognition/Publications/Dodhia_SARMAC'05.pdf">Dodhia:05</a> A Task Interrupted Becomes a Prospective Memory Task</p>
</li>
<li>
<p><a href="https://heeris.id.au/2013/this-is-why-you-shouldnt-interrupt-a-programmer/">This Is Why You Shouldn't Interrupt a Programmer</a></p>
</li>
<li>
<p><a href="http://en.citizendium.org/wiki/Parable_of_the_two_watchmakers">Parable of The Two Watchmakers</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=FKTxC9pl-WM&amp;t=385s">Making Badass Developers - Kathy Sierra</a></p>
</li>
<li>
<p><a href="https://web.archive.org/web/20111010222154/https://geek.com/articles/games/john-carmack-coded-quake-on-a-28-inch-169-1080p-monitor-in-1995-20110920/">John Carmack coded Quake on a 28-inch 16:9 1080p monitor in 1995</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=L41oIvre9K0">CygnusEd Professional in Action on an Amiga 2000</a> with exceptional fluent scrolling, video by <a href="https://caseymuratori.com/about">Casey Muratori</a></p>
</li>
<li>
<p><a href="https://amiga.lychesis.net/knowledge/ScreenModes.html">Amiga screen modes</a></p>
</li>
<li>
<p><a href="https://en.wikipedia.org/wiki/Prospective_memory">Prospective Memory</a></p>
</li>
<li>
<p><a href="http://vimdoc.sourceforge.net/htmldoc/starting.html#views-sessions">Vim and <code>:mksession</code></a></p>
</li>
<li>
<p><a href="https://www.emacswiki.org/emacs/EmacsSession">Emacs session management</a></p>
</li>
<li>
<p><a href="https://doc.qt.io/qtcreator/creator-project-managing-sessions.html">Qt Creator and managing sessions</a></p>
</li>
<li>
<p><a href="https://www.jetbrains.com/help/idea/managing-tasks-and-context.html">IntelliJ IDEA</a></p>
</li>
<li>
<p><a href="https://contextkeeper.io/">ContextKeeper</a> with <a href="https://contextkeeper.io/blog/automatic-snapshot-switching-when-changing-branches-v1/">automatic snapshot switching when changing branches</a> and <a href="https://contextkeeper.io/blog/relative-paths-support-in-v1-8-and-contextkeeper-mentioned-on-the-jesse-libertys-podcast/">relative paths support</a></p>
</li>
</ul>
<script async data-uid="cbc4e3eb45" src="https://motivated-architect-9138.ck.page/cbc4e3eb45/index.js"></script>]]></content:encoded></item><item><title><![CDATA[My Top 7 Visual Studio plugins supporting deep work]]></title><description><![CDATA[<p>I want to share a couple of useful Visual Studio plugins that I'm using daily when working on the <a href="https://contextkeeper.io">ContextKeeper</a>. Those are mainly fitting in the &quot;deep work&quot; category and help to move a little faster when you're in the zone. There is noticeable compound effect when you</p>]]></description><link>http://contextkeeper.io/blog/my-top-7-visual-studio-plugins-supporting-deep-work/</link><guid isPermaLink="false">62ac77881ccaef80fc43b699</guid><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Fri, 17 Jun 2022 12:48:43 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2022/06/My-Top-6-Visual-Studio-plugins-supporting-deep-work-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2022/06/My-Top-6-Visual-Studio-plugins-supporting-deep-work-1.jpg" alt="My Top 7 Visual Studio plugins supporting deep work"><p>I want to share a couple of useful Visual Studio plugins that I'm using daily when working on the <a href="https://contextkeeper.io">ContextKeeper</a>. Those are mainly fitting in the &quot;deep work&quot; category and help to move a little faster when you're in the zone. There is noticeable compound effect when you start using them.</p>
<h2 id="bettervisualcuesduringcodingsession">Better visual cues during coding session</h2>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=K1tty.RockMargin"><strong>RockMargin</strong></a> - replaces VS vertical scrollbar with current text overview that works as scrollbar at the same time. Where the magic happens: in source files of up to a few thousand lines, it's really easy to navigate through the code using the file's thumbnail view, and it's super compact compared to the default VS map mode scroll bar which takes up way too much space. If you are using or have ever tried to use the default map mode but you have given up, just try using RockMargin and you will be pleasantly surprised:
<ul>
<li>unfortunately, there is no official build for VS 2022 but someone <a href="https://github.com/K1tty/RockMargin/pull/1">prepared PR</a>. If you don't want to compile it yourself you could use my <a href="https://contextkeeper.io/public/DeepWorkPlugins/RockMargin2022.vsix"><strong>VS 2022 build</strong></a> which already includes this PR. To get RockMargin looking better when using VS Dark theme, I recommend changing colors, Tools-&gt;Options-&gt;RockMargin,</li>
</ul>
</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=LaurentKempe.GitDiffMargin"><strong>Git Diff Margin</strong></a> - displays live Git changes of the currently edited file on Visual Studio margin and scroll bar,</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=TomasRestrepo.Viasfora"><strong>Viasfora</strong></a> - adds rainbow braces, keyword highlighting and some XML improvements. For VS Dark mode I recommend using <a href="https://github.com/tomasr/viasfora/blob/master/themes/dark-light-braces.json">Viasfora's dark light theme</a> (Tools-&gt;Options-&gt;Viasfora-&gt;Export/Import-&gt;Load Theme). <a href="https://github.com/tomasr/viasfora/releases/tag/v4.3">VS 2019 version is available here</a>,</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=OlegTarasov.Iconizer2022"><strong>Iconizer</strong></a> - shows icons on tool windows tabs (if possible) which greatly improves tabs discoverability. It's faster to recognize familiar icon than to read text.</li>
</ul>
<h2 id="moredensecodingplayground">More dense coding playground</h2>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.SyntacticLineCompression2022"><strong>Shrink Empty Lines</strong></a> - more visible code shrinking lines that contain neither letters nor numbers by 25% vertically, allowing more lines to be displayed in the editor. The <a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.SyntacticLineCompression">VS 2019 version is here</a>,</li>
<li>not a plugin but useful trick: set smaller font size: 8 px and use <a href="https://www.jetbrains.com/lp/mono/">JetBrains Mono font</a>.</li>
</ul>
<h2 id="timesaving">Time-saving</h2>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=EinarEgilsson.StopOnFirstBuildError"><strong>StopOnFirstBuildError</strong></a> - stops a solution build immediately if one project fails to build. Build for VS 2022 could be compiled from sources or use my <a href="https://contextkeeper.io/public/DeepWorkPlugins/StopOnFirstBuildError2022.vsix">build for VS 2022</a>,</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.Farticus"><strong>Farticus</strong></a> - A broken build you didn't notice? Not anymore, thanks to random fart sound (22 different options!). It will not only save you time but also put a smile on your face, practically everyday. Just try it 😁.</li>
</ul>
<h2 id="makingcontextswitchingpainless">Making context switching painless</h2>
<ul>
<li><a href="https://contextkeeper.io"><strong>ContextKeeper</strong></a> (my own plugin) - remembers last opened files, pinned tabs, documents state (line&amp;number) and position. It <strong>automatically saves</strong> and <strong>restores</strong> context when <a href="https://contextkeeper.io/blog/automatic-snapshot-switching-when-changing-branches-v1/"><strong>switching between Git branches</strong></a> and has <a href="https://contextkeeper.io/blog/relative-paths-support-in-v1-8-and-contextkeeper-mentioned-on-the-jesse-libertys-podcast/"><strong>relative paths</strong></a> support.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Relative paths support in v1.8 and ContextKeeper was mentioned on the Jesse Liberty's podcast!]]></title><description><![CDATA[<h2 id="whatiscontextkeeper"><strong>What is ContextKeeper?</strong></h2>
<p><a href="https://contextkeeper.io">ContextKeeper</a> is <strong>Visual Studio plugins</strong> that lets you switch between <strong>last opened files</strong> (<strong>documents sets</strong>). Everything is saved to <strong>simple JSON</strong> files aka <strong>snapshots</strong>.</p>
<p><strong>Every snapshot saves:</strong></p>
<ul>
<li>logical state
<ul>
<li>your <strong>favorites files</strong> (non-solution files are also supported)</li>
<li>last <strong>opened files</strong>, <strong>order</strong> and <strong>state</strong>, including last <strong>selected line</strong></li></ul></li></ul>]]></description><link>http://contextkeeper.io/blog/relative-paths-support-in-v1-8-and-contextkeeper-mentioned-on-the-jesse-libertys-podcast/</link><guid isPermaLink="false">629763b17087330007ba003b</guid><category><![CDATA[release]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Wed, 01 Jun 2022 13:18:09 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2022/06/Version-1.8-and-Relative-paths.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="whatiscontextkeeper"><strong>What is ContextKeeper?</strong></h2>
<img src="http://contextkeeper.io/content/images/2022/06/Version-1.8-and-Relative-paths.jpg" alt="Relative paths support in v1.8 and ContextKeeper was mentioned on the Jesse Liberty's podcast!"><p><a href="https://contextkeeper.io">ContextKeeper</a> is <strong>Visual Studio plugins</strong> that lets you switch between <strong>last opened files</strong> (<strong>documents sets</strong>). Everything is saved to <strong>simple JSON</strong> files aka <strong>snapshots</strong>.</p>
<p><strong>Every snapshot saves:</strong></p>
<ul>
<li>logical state
<ul>
<li>your <strong>favorites files</strong> (non-solution files are also supported)</li>
<li>last <strong>opened files</strong>, <strong>order</strong> and <strong>state</strong>, including last <strong>selected line &amp; column</strong></li>
<li><strong>pinned tabs</strong></li>
</ul>
</li>
<li>visual state
<ul>
<li>main <strong>IDE</strong> <strong>window position</strong> and <strong>size</strong></li>
<li><strong>floating windows</strong> <strong>position</strong> and <strong>size</strong></li>
<li><strong>docked state</strong> and <strong>horizontal/vertical orientation</strong></li>
</ul>
</li>
</ul>
<p>The plugin has <a href="https://contextkeeper.io/blog/automatic-snapshot-switching-when-changing-branches-v1/"><strong>powerful git integration</strong></a> with <strong>automatically restored context when changing branches</strong>.</p>
<p><a href="https://www.youtube.com/watch?v=BlxAoJpBrZ0"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/5YYSqMkrHsJEEcp5W6sa8y/email" alt="Relative paths support in v1.8 and ContextKeeper was mentioned on the Jesse Liberty's podcast!"></a></p>
<h2 id="contextkeeperonthejesselibertyspodcast">ContextKeeper on the Jesse Liberty's podcast</h2>
<p>Lately <a href="https://player.fm/series/yapcast-jesse-liberty/vsix-with-mads-kristensen?t=822">during Yet Another Podcast Show 206</a>, Jesse Liberty asked Mads Kristensen:</p>
<p><strong>Jesse</strong>: &quot;What I want in Visual Studio is to be able to say, take a snapshot of everything where I am. All the opened windows, all the breakpoints. All, everything that has to do with my development and let me save it under a name. And then switch, because if I'm in the middle of development, and the bug comes in, I want to be able to save it under my name, switch to what I'm doing. (...) and I'm back in that environment exactly the way I was.&quot;</p>
<p><strong>Mads</strong>: &quot;Someone wrote this extension like a 6 months ago. What you're asking for - exists. (...). It something about <strong>Context (Keeper)</strong>&quot;. Since May it's on the <a href="https://marketplace.visualstudio.com/items?itemName=ContextKeeper.ContextKeeperVsix"><strong>VS Marketplace</strong> and a little easier to find than before</a> 😉</p>
<p>Huge thanks for Mads Kristensen for mentioning the ContextKeeper!</p>
<h2 id="contextkeeperv18releaseandrelativepaths">ContextKeeper v1.8 release and relative paths</h2>
<p>I'm really proud 🎉🎉🎉 to announce that <strong>support for relative paths</strong> is finally <strong>implemented</strong> in the <a href="https://contextkeeper.io/downloads"><strong>version 1.8</strong></a><strong>.</strong> Relative paths support is part of the <a href="https://contextkeeper.io/blog/roadmap-for-2022/"><strong>2022 Roadmap</strong></a> and <strong>major milestone</strong>. The feature was one of the missing puzzle pieces, that I always wanted to include.</p>
<p>Adding support for <strong>relative path</strong> is essential part to allow <strong>sharing your context</strong> between different <strong>dev environments</strong> and also <strong>inside your team</strong>. It will unlock potential to e. g.:</p>
<ul>
<li><strong>switching</strong> between <strong>laptop</strong> and <strong>workstation</strong></li>
<li><strong>faster onboarding</strong> developers to new tasks, taking over responsibilities</li>
<li><strong>sharing mental models</strong> of the project across <strong>team members</strong></li>
<li><strong>fixing complex bugs easier</strong>, using targeted mental snapshots</li>
</ul>
<p>Every time a new snapshot is created it will include <code>RelativePath</code> property for every entry in a <code>*.ck</code> file. When a snapshot is restored, relative paths will be used by default. There is still <code>FilePath</code> property used, as a <strong>fallback strategy</strong>, for global files. All different types of files are supported including:</p>
<ul>
<li><strong>solution and projects files</strong></li>
<li><strong>&quot;loose&quot; files</strong> (not included in a solution/project) but still part of the folders structure</li>
<li><strong>global files</strong> (relative paths cannot be created for them, absolute paths are used)</li>
</ul>
<p><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/tva8A8pu5XWBxd7JQ5Xvb9" alt="Relative paths support in v1.8 and ContextKeeper was mentioned on the Jesse Liberty's podcast!"></p>
<p>Current limitations:</p>
<ul>
<li><strong>Full Restore</strong> works the best when when switching between the same or similar monitors setup (laptop/dev machine), when monitor's size and resolutions are different than the original snapshot please use:</li>
<li><strong>Restore Files</strong> which is using the current active window (main IDE or floating window) to restore all files from a snapshot</li>
<li><strong>machine-independent</strong> snapshots <strong>restore process is not implemented yet</strong> but <a href="https://contextkeeper.io/blog/roadmap-for-2022/"><strong>it's part of the 2022 Roadmap</strong></a></li>
</ul>
<h2 id="learnmore">Learn more</h2>
<p>The latest news and releases are announced at the <a href="https://contextkeeper.io/blog"><strong>ContextKeeper's blog</strong></a>. You could also <a href="https://contextkeeper.io"><strong>join the Beta program</strong></a> and get latest updates via newsletter.</p>
<p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Roadmap for 2022]]></title><description><![CDATA[support for bookmarks, breakpoints, relative paths with machine-independent snapshot restore process and upcoming plugin for VSCode 
]]></description><link>http://contextkeeper.io/blog/roadmap-for-2022/</link><guid isPermaLink="false">62626e5cf14b6f0007b5e50e</guid><category><![CDATA[roadmap]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Fri, 22 Apr 2022 10:03:50 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2022/06/Roadmap-for-2022.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2022/06/Roadmap-for-2022.jpg" alt="Roadmap for 2022"><p>July 16th 2021 was the first <a href="https://contextkeeper.io">ContextKeeper</a> beta release. It was late Friday when I had finished release note. Later it was sent to the 67 people who joined the beta program. The next week on Tuesday there was official <a href="https://contextkeeper.io/blog/hello-world-from-contextkeeper/">&quot;Hello World&quot; blog post</a> announcing version v0.71. The initial vision from 2015 came to fruition.</p>
<h2 id="2021recap">2021 recap</h2>
<p>They were 12 releases through last 9 months including some major new features like:</p>
<ul>
<li>v0.8 - <a href="https://contextkeeper.io/blog/automatic-snapshot-switching-when-changing-branches-v1/">automatic snapshot switching when changing branches</a> and later <a href="https://contextkeeper.io/blog/context-keeper-black-friday-gift/">first build for VS 2022</a></li>
<li>v1.0 - <a href="https://contextkeeper.io/blog/continuous-auto-saving-branch-snapshots-and-git-worktree-support/">continuous auto-saving branch snapshots</a></li>
<li>v1.3 - <a href="https://contextkeeper.io/blog/continuous-auto-saving-branch-snapshots-and-git-worktree-support/">Git worktree support</a></li>
<li>v1.6.26 - <a href="https://contextkeeper.io/blog/introducing-snapshot-stashing/">snapshot stashing</a></li>
</ul>
<p>From the beginning, the most expected feature was definitely <a href="https://contextkeeper.io/blog/automatic-snapshot-switching-when-changing-branches-v1/">automatic snapshot switch when changing branches</a> which is also highly voted on <a href="https://developercommunity.visualstudio.com/t/when-switching-branch-in-git-visual-studio-should/856415">the official VS forum</a>.</p>
<p>The core foundation for future versions is already built. And I think I've only implemented about 10-15% of what I want to achieve with the plugin. The plans are really bold and ambitious. Some of them includes introducing features that doesn't exists in any other IDE on the market. Moreover Visual Studio session management support haven't improved for years and with ContextKeeper I want to deliver completely new quality and create the new standard in this area.</p>
<p>The goal is to build ultimate contexts manager for Visual Studio that will significantly improve your daily work. I'm <strong>inviting you to join the ride</strong> and <strong>be sure</strong> <strong>to invite</strong> your <strong>friends</strong> 🚀</p>
<h2 id="2022roadmap">2022 Roadmap</h2>
<p>The roadmap for 2022 includes major milestones, like support for:</p>
<p>✅ <strong>bookmarks</strong></p>
<p>✅ <strong>breakpoints</strong></p>
<p>✅ <strong>relative paths and machine-independent snapshots restore process</strong> (<em>update</em>: <a href="https://contextkeeper.io/blog/relative-paths-support-in-v1-8-and-contextkeeper-mentioned-on-the-jesse-libertys-podcast/">relative paths implemented 1st June</a>)</p>
<p>✅ <strong>storing snapshots outside of the solution folder</strong></p>
<p>✅ <strong>search dialog</strong> (<em>update</em>: <a href="https://contextkeeper.io/blog/search-dialog-v1-71/">implemented 15th April</a>)</p>
<p>The <strong>bookmarks</strong>, <strong>breakpoints</strong> and <strong>relative paths</strong> are those <strong>big</strong> missing <strong>puzzles</strong> that I always wanted to include. Now it's the time to lift off ✈</p>
<p>Adding support for <strong>relative path</strong> and <strong>machine-independent restore</strong> process will remove last obstacle from <strong>sharing your context</strong> between different <strong>dev environments</strong> and also <strong>inside your team</strong>. It will unlock potential to e. g.:</p>
<ul>
<li>switching between laptop and workstation</li>
<li>faster onboarding developers to new tasks, taking over responsibilities</li>
<li>sharing mental models of the project across team members</li>
<li>fixing complex bugs easier using targeted mental snapshots</li>
</ul>
<p>And last but not least on the 2022 roadmap is 🔥:</p>
<ul>
<li><strong>first version for Visual Studio Code</strong> with unique ability to load snapshots created in ... Visual Studio 😉</li>
</ul>
<p>The Visual Studio Code plugin will have basic features at first, and gradually I will try to add more complex ones, to close features gaps between those two IDEs. The VS Code API is a little limiting compared to Visual Studio, but I will do my best to overcome any obstacles, and push VS Code APIs to its limits.</p>
<p><strong>Breaking news, from the last minute</strong>. I just have found out, when I finished writing, that finally <a href="https://github.com/microsoft/vscode/issues/15178">API access to &quot;Open Editors&quot;</a> have been <strong>implemented</strong> by VS Code Team. The GitHub issue was closed just <a href="https://github.com/microsoft/vscode/issues/15178#event-6471911286">1 day ago</a> (21 April). It was created in 2016! It's really huge milestone making possible to provide almost full support for VS Code using official API 🚀</p>
<h2 id="betaprogram">Beta program</h2>
<p>Beta program will continue and the plugin will remain free during the beta phase. I don't have any specified date in mind when beta will end. I thinking about different options to secure financial stability for the future development. Since January 2021 I'm in full-time, bootstrapping mode funding the development. It wasn't an easy decision to go 💯 in, but since 2018 I was actively preparing to make the jump.</p>
]]></content:encoded></item><item><title><![CDATA[Search dialog (version 1.71)]]></title><description><![CDATA[ContextKeeper v1.71 for Visual Studio is released with long awaited search dialog! The search filter is case-insensitive and use only a snapshot name for matching.]]></description><link>http://contextkeeper.io/blog/search-dialog-v1-71/</link><guid isPermaLink="false">6295d8669df5fd000707612b</guid><category><![CDATA[release]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Fri, 15 Apr 2022 08:56:00 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2022/06/Release-1.72.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2022/06/Release-1.72.jpg" alt="Search dialog (version 1.71)"><p><a href="https://contextkeeper.io">ContextKeeper </a>v1.71 <a href="https://contextkeeper.io/blog/roadmap-for-2022/"><strong>is released with long awaited search dialog</strong></a><strong>!</strong> If you have more than few snapshot it will definitely improve your daily interactions with the plugin. I already have 29 snapshots, that touch different areas in the plugin source code, and navigating through them, started to be more and more challenging.</p><p>The search dialog is a native VS control with <strong>search history</strong> and behaves like a standard search component which you used before (e. g. in the Solution Explorer). The <strong>search filter is case-insensitive</strong> and <strong>use only a snapshot name</strong> for matching. I'm planning to add more sophisticated search options later, including searching through snapshot's files.</p><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/osi5oAj2EQ76DfvjRBsWWf?w=800&amp;fit=max" class="kg-image" alt="Search dialog (version 1.71)"></figure><p>The search dialog for the first time was added in the version 1.7 but only to VS 2022 at the beginning. Starting today is <a href="https://contextkeeper.io/downloads">available, as usual, for VS 2022/2019/2017/2015 and VS 2013.</a></p><p>Happy Easter 🥚!</p>]]></content:encoded></item><item><title><![CDATA[Introducing snapshot stashing (version 1.6.25)]]></title><description><![CDATA[<p>I'm happy to announce that <a href="https://contextkeeper.io">ContextKeeper</a> <strong><strong>v1.6.25</strong></strong> with snapshot stashing feature <a href="https://contextkeeper.io/blog/downloads/#v1.6"><strong><strong>is available</strong></strong></a> for Visual Studio 2022/2019/2017/2015 and 2013.</p><p>I want to thank everyone for their time and participating in the last survey. A lot of proposed features were directly from the feedback I've gathered</p>]]></description><link>http://contextkeeper.io/blog/introducing-snapshot-stashing/</link><guid isPermaLink="false">624c0305c16bcf0007c93e83</guid><category><![CDATA[release]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Tue, 05 Apr 2022 09:06:15 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2022/04/Version-1.6-release.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2022/04/Version-1.6-release.jpg" alt="Introducing snapshot stashing (version 1.6.25)"><p>I'm happy to announce that <a href="https://contextkeeper.io">ContextKeeper</a> <strong><strong>v1.6.25</strong></strong> with snapshot stashing feature <a href="https://contextkeeper.io/blog/downloads/#v1.6"><strong><strong>is available</strong></strong></a> for Visual Studio 2022/2019/2017/2015 and 2013.</p><p>I want to thank everyone for their time and participating in the last survey. A lot of proposed features were directly from the feedback I've gathered during development. There were a lot of different propositions from the community that I had put in the survey, e. g.:</p><ul><li>keyboard shortcuts for creating <strong><strong>“quick snap” (stash)</strong></strong> snapshot and restore it later <strong><strong>(implemented in v1.6.25)</strong></strong></li><li><strong><strong>full screen state remembered</strong></strong> for the main IDE window and floating windows <strong><strong>(implemented in v1.6.25)</strong></strong></li><li>improvements around deleting snapshots (partially implemented in v1.5)</li><li>storing <strong><strong>.contextkeeper</strong></strong> folder <strong><strong>outside</strong></strong> the <strong><strong>solution folder</strong></strong> (configurable path) (coming soon)</li></ul><p>It was a nice surprise to see "quick snap" proposition got a lot of votes because it wasn't a feature I was initially planning to implement. To be honest, I even didn't have it in the backlog. But you asked and it's here 😀</p><p>From the other side the top voted features confirmed a strong desire for storing bookmarks and breakpoints. From the very beginning, I was planning to build a tool that will catch all those subtle pieces of puzzles, that every developer is laying around during a development session. Bookmarks and breakpoints are the the most important goals on the 2022 roadmap.</p><h2 id="survey-results"><strong>Survey results</strong></h2><p>I've prepared the results graph for the highest voted features. The two highlighted features are already implemented:</p><p>✅ snapshot stashing - creating "quick snap" snapshot and restore it later with keyboard shortcut support,</p><p>✅ full screen state is remembered for every opened window in a snapshot.</p><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/bdpEWRRzYB7Wr9o3pJTTgW/email" class="kg-image" alt="Introducing snapshot stashing (version 1.6.25)"></figure><h2 id="create-stash-snapshot-and-restore-it-later"><strong>Create stash snapshot and restore it later</strong></h2><p>There are two additional commands in the toolbar. <strong><strong>Stash</strong></strong> and <strong><strong>unstash</strong></strong>. The idea is from git workflow but here it's applied to a current context you're working on. You could <strong><strong>quickly save it (stash) and </strong></strong>switch to something else** that needs an <strong><strong>urgent attention</strong></strong>. <strong><strong>After stashing</strong></strong> a snapshot <strong><strong>all tabs will be closed</strong></strong> <strong><strong>automatically</strong></strong>, similarly how stashing works in git - current context is cleared and ready for a new work.</p><p>A stash snapshot is always displayed as a first on the list. Currently only single stash is supported but multiple stashes will be supported in the future.</p><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/kgAeeubdKzrWxkpK3CECfv/email" class="kg-image" alt="Introducing snapshot stashing (version 1.6.25)"></figure><p>A stash has <strong><strong>additional description</strong></strong>, like "&lt;stashed&gt; <strong><strong>2 hours ago</strong></strong>", to get you additional awareness how long it's awaiting to be unstashed. It's really easy to lose track of time, during coding session, and it will act as an <strong><strong>useful reminder</strong></strong> how long your "main" task was <strong><strong>put on hold</strong></strong>. The <strong><strong>stash timestamp</strong></strong> description <strong><strong>is</strong></strong> <strong><strong>live updated</strong></strong>. If you decide that more meaningful name for stash snapshot is needed, you can simply rename it and it will become a regular snapshot.</p><h2 id="keyboard-shortcuts"><strong>Keyboard shortcuts</strong></h2><p>You could <strong><strong>assign your favorites keyboard shortcut</strong></strong> combination for stash and unstash commands from the toolbar. There aren't default shortcuts assigned but I found useful to use:</p><ul><li>Ctrl+Shift+S, Ctrl+Shift+S for <strong><strong>s</strong></strong>nasphot <strong><strong>s</strong></strong>tashing</li><li>Ctrl+Shift+S, Ctrl+Shift+U for <strong><strong>s</strong></strong>nasphot <strong><strong>u</strong></strong>nstashing</li></ul><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/aw76uizdFeTKB1Rj1T7L96/email" class="kg-image" alt="Introducing snapshot stashing (version 1.6.25)"></figure><h2 id="full-screen-maximized-windows-support"><strong>Full screen (maximized) windows support </strong></h2><p>There is a support added to remember if windows is maximized during snapshot creation. No more problems with restoring maximized windows, especially during git branch switching 😍 Only maximized windows will have additional property serialized in a snapshot.</p><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/s2WTETYNrgrKaZiP5vW8Bj/email" class="kg-image" alt="Introducing snapshot stashing (version 1.6.25)"></figure><h2 id="celebrating-25th-visual-studio-birthday"><strong>Celebrating 25th Visual Studio Birthday</strong></h2><p>You could noticed that current version is 1.6.<strong><strong>25</strong></strong>. I've added 25 to <a href="https://www.youtube.com/watch?v=hATPpSCQ6u8&amp;feature=emb_title">celebrate 25th Visual Studio Birthday</a>. Officially, first Visual Studio 97 was released 19th March, 1997. But if you really curious <a href="http://www.malsmith.net/blog/visual-c-visual-history/">there were several MS Visual C++ versions</a> before 1997 that later were rebranded to Visual Studio. There is also really interesting documentary about Visual Studio - <a href="https://www.youtube.com/watch?v=WZVVs0oy0yU">part 1</a> and <a href="https://www.youtube.com/watch?v=_tV4LaPTtYA">part 2</a> - really worth to watch.</p><p>I've first started using VS around 2002/2003 when I was studying Computer Science at UMCS University in Lublin, Poland. It's more than 20 years I'm using VS on daily basis 🎉 and I'm looking forward for the next 20 years! Really unbelievable how one tool can impact your professional career. </p><p></p>]]></content:encoded></item><item><title><![CDATA[ContextKeeper v1.5 released]]></title><description><![CDATA[<p><a href="https://ContextKeeper.io">ContextKeeper </a>v1.5 <a href="https://contextkeeper.io/blog/downloads/#v1.5" rel="noopener noreferrer">is available</a> for Visual Studio 2022/2019/2017/2015 and 2013. I want to highlight some UX improvements.</p><h2 id="quick-snapshots-deletion"><strong>Quick snapshots deletion</strong></h2><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/dm3JL5xQ13eYKY16SmAceH/email" class="kg-image"><figcaption>Use "Delete" + "Enter" at a selected snapshot</figcaption></figure><p>​<a href="https://forms.gle/BdmEmFaqSexLEP1Q7" rel="noopener noreferrer">The last survey</a> has shown some directions for new features and improvements. One of them was an easier way</p>]]></description><link>http://contextkeeper.io/blog/contextkeeper-v1-5-released/</link><guid isPermaLink="false">6231f40dfca53600074f3615</guid><category><![CDATA[release]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Wed, 16 Mar 2022 14:56:42 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2022/04/Version-1.5-release.jpg" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2022/04/Version-1.5-release.jpg" alt="ContextKeeper v1.5 released"><p><a href="https://ContextKeeper.io">ContextKeeper </a>v1.5 <a href="https://contextkeeper.io/blog/downloads/#v1.5" rel="noopener noreferrer">is available</a> for Visual Studio 2022/2019/2017/2015 and 2013. I want to highlight some UX improvements.</p><h2 id="quick-snapshots-deletion"><strong>Quick snapshots deletion</strong></h2><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/dm3JL5xQ13eYKY16SmAceH/email" class="kg-image" alt="ContextKeeper v1.5 released"><figcaption>Use "Delete" + "Enter" at a selected snapshot</figcaption></figure><p>​<a href="https://forms.gle/BdmEmFaqSexLEP1Q7" rel="noopener noreferrer">The last survey</a> has shown some directions for new features and improvements. One of them was an easier way to delete snapshots. The introduced better keyboard support is the first step in this direction. The plan is to get all the “low-hanging” fruits before picking the biggest and sweetest ones: <strong>bookmarks and breakpoints</strong> 😁 There are also really interesting features in the middle, like:</p><ul><li>keyboard shortcuts for creating <strong>“quick snap” (stash)</strong> snapshot and restore it later</li><li>support for <strong>relative paths</strong> and the ability to <strong>restore snapshots</strong> in <strong>different</strong> dev environments</li><li>storing <strong>.contextkeeper</strong> folder <strong>outside</strong> the <strong>solution folder</strong> (configurable path)</li><li><strong>full screen state remembered</strong> for the main IDE window and floating windows</li><li>search dialog</li></ul><p>If you want to propose some additional features or report a bug, don’t hesitate and <a href="https://github.com/ContextKeeper/ContextKeeper.VisualStudio/issues" rel="noopener noreferrer">add it here</a> or <strong>reply to this email.</strong></p><h2 id="restoring-multiple-snapshots"><strong>Restoring multiple snapshots</strong></h2><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/oj1EjDdgN3FUgsnTz85Bvp/email" class="kg-image" alt="ContextKeeper v1.5 released"><figcaption>Use "Enter" to restore a selected snapshot</figcaption></figure><p>Sometimes it useful to "scan" snapshots as quick a possible. From now on it's possible to use only keyboard (arrow keys + Enter) to restore multiple snapshots which significantly speed up entire process. There are also smaller <a href="https://contextkeeper.io/blog/downloads/#v1.5" rel="noopener noreferrer">bug fixes and changes</a> in this release.</p>]]></content:encoded></item><item><title><![CDATA[Continuous auto-saving branch snapshots and git worktree support]]></title><description><![CDATA[<p>Starting from v1.0 <a href="https://contextkeeper.io">ContextKeeper</a> <strong>continuously auto-saves</strong> a git <strong>branch snapshot </strong>if a change is detected. When tabs with code are <strong>opened</strong>, <strong>moved</strong> or <strong>closed</strong> a new snapshot is generated. Also any <strong>changes</strong> in <strong>tabs layout</strong> <strong>triggers auto-save</strong>. When there are multiple changes in a short time, auto-save will be</p>]]></description><link>http://contextkeeper.io/blog/continuous-auto-saving-branch-snapshots-and-git-worktree-support/</link><guid isPermaLink="false">62260087151a6b4d18159a28</guid><category><![CDATA[git worktree]]></category><category><![CDATA[continuous auto-saving branch snapshots]]></category><dc:creator><![CDATA[Piotr Karczmarz]]></dc:creator><pubDate>Mon, 07 Mar 2022 13:03:13 GMT</pubDate><media:content url="http://contextkeeper.io/content/images/2022/03/Git-Worktree-support.png" medium="image"/><content:encoded><![CDATA[<img src="http://contextkeeper.io/content/images/2022/03/Git-Worktree-support.png" alt="Continuous auto-saving branch snapshots and git worktree support"><p>Starting from v1.0 <a href="https://contextkeeper.io">ContextKeeper</a> <strong>continuously auto-saves</strong> a git <strong>branch snapshot </strong>if a change is detected. When tabs with code are <strong>opened</strong>, <strong>moved</strong> or <strong>closed</strong> a new snapshot is generated. Also any <strong>changes</strong> in <strong>tabs layout</strong> <strong>triggers auto-save</strong>. When there are multiple changes in a short time, auto-save will be fired with a delay, after no more changes are detected (with 15 seconds threshold). Auto-save feature is disabled during debugging session to prevent accidental updates.​</p><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/eRAjLcfHD91j3TeG9bEM2K/email" class="kg-image" alt="Continuous auto-saving branch snapshots and git worktree support"><figcaption>Output window</figcaption></figure><p>Before the change ContextKeeper had updated a branch snapshot only at solution closing or before switching to another branch. It was a first step to a more robust solution.</p><h2 id="continuous-auto-saving-branch-snapshots"><strong><strong>Continuous auto-saving branch snapshots</strong></strong></h2><p>Introducing continuous<strong> </strong>auto-saving feature is a step closer in improving default Visual Studio session management experience that had stopped improving for years - session is still saved <a href="https://docs.microsoft.com/en-us/visualstudio/extensibility/internals/solution-user-options-dot-suo-file?view=vs-2022" rel="noopener noreferrer">only once, when solution is closed</a> (or saved). It unfortunately doesn't work well when VS crashes in the middle of a work, .suo file gets corrupted in the process or VS is closed "blank" by mistake. </p><p>The outcomes are similar: you cannot use your latest opened documents. I work daily with Visual Studio since 2005 and still, after those years, I vividly remember overwhelming surprise mixed with anger when VS opened blank and forgot whole context, built carefully, usually by days. Latest VS version looks more polished but still it can happen. Before ContextKeeper I usually had backuped .suo file for important contexts and switched between them by overwriting original .suo file. This little hack seems to be <a href="https://stackoverflow.com/questions/19039664/visual-studio-session-management" rel="noopener noreferrer">pretty popular</a>.</p><p>When <a href="https://contextkeeper.io/blog/automatic-snapshot-switching-when-changing-branches-v1/" rel="noopener noreferrer">automatic snapshot switching for branches</a> was first introduced in v0.8 a branch snapshot was saved a moment before Visual Studio was closing or changing branches. The solution was simple but it had some hidden flaws. Some files in a snapshot could get lost after changing branches because VS closed them really fast and generated snapshot didn't include those files. Also if VS crashes or you need to kill the VS process from Task Manager a snapshot won't be up to date. All those issues were fixed by introducing branch auto-save feature.</p><h2 id="git-worktree-support"><strong>Git worktree support</strong></h2><p>The git worktree support, introduced in <a href="https://contextkeeper.io/blog/downloads/" rel="noopener noreferrer">v1.3</a>, allows even <a href="https://stackoverflow.com/a/31951225" rel="noopener noreferrer">more streamlined context switching</a>. If you sometimes clone entire repository when working on a feature I recommend checking <a href="https://kickertech.com/git-worktrees-why-would-you-use-it/" rel="noopener noreferrer">git worktree</a>. Long story short, working tree is like clean, cloned repository but better because:</p><ul><li>repository "cloning" is done instantly - it's a local operation, </li><li>worktree uses less disk space - there is a single .git folder shared across multiple working trees,</li><li>often more convenient than stashing</li></ul><h2 id="git-rebase-detection"><strong>Git rebase detection</strong></h2><p>ContextKeeper has small and simple built-in engine detecting git branch changes. It uses .git/HEAD file to actively detects current branch and also switching between branches. This approach allows switching between branches to <a href="https://www.youtube.com/watch?v=BlxAoJpBrZ0" rel="noopener noreferrer">work with any git client</a> and also with VS 2013 which doesn't have native git support. ContextKeeper can even detect and automatically restore a snapshot when git branch is changed from a command line:</p><figure class="kg-card kg-image-card"><img src="https://embed.filekitcdn.com/e/ta2FHAgWPvhq7wYzRrVqfZ/5YYSqMkrHsJEEcp5W6sa8y?w=800&amp;fit=max" class="kg-image" alt="Continuous auto-saving branch snapshots and git worktree support"><figcaption>Restoring a branch snapshot via git checkout</figcaption></figure><p>The branch detection engine is really simple and didn't support rebase operation properly at the beginning. During rebase multiple "intermediate" snapshots were generated but it was fixed in the<a href="https://contextkeeper.io/blog/downloads/" rel="noopener noreferrer"> v1.1 and v1.2</a> releases. Thanks to <a href="https://twitter.com/PiotrSolarczyk" rel="noopener noreferrer">Piotr Solarczyk</a> for reporting the issue.</p>]]></content:encoded></item></channel></rss>