{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Superlinea blog",
  "home_page_url": "https://superlinea.app/blog/",
  "feed_url": "https://superlinea.app/blog/feed.json",
  "items": [
    {
      "id": "https://superlinea.app/blog/ghost-paths-and-scissors/",
      "url": "https://superlinea.app/blog/ghost-paths-and-scissors/",
      "title": "Ghosts and Scissors",
      "summary": "Moving points with confidence and cutting paths in three ways.",
      "content_html": "<p>I recently added two new features to Superlinea: ghost paths, which help you\nkeep your bearings while moving things around, and the Scissors tool, which\nhelps you cut them apart. Let's see how they work.</p>\n\n<h2 id=\"ghost-paths\">Ghost paths</h2>\n<p>While you drag a point or a path, the original path stays on the canvas as a guide,\nand your point snaps to them. This makes dragging a corner along a slanted edge\nvery easy and lets you change the shape while keeping the same angle, something\nthat would otherwise be tricky</p>\n<p><video src=\"https://superlinea.app/media/ghost-paths-and-scissors-ghost-path-ui-2026-10-23.mp4\" autoplay loop muted playsinline></video></p>\n<h2 id=\"scissors\">Scissors</h2>\n<p>The second addition is a cutting-edge feature: the Scissors tool (sorry, I couldn't resist).\nThis tool lets you cut in three different ways.</p>\n<h3>Cut at a point</h3>\n<p>Click a path to split it at that point. Handy when you want to open a closed\npath or break a line into separate pieces.</p>\n<p><video src=\"https://superlinea.app/media/ghost-paths-and-scissors-cut-point-ui-2026-10-23.mp4\" autoplay loop muted playsinline></video></p>\n<h3>Cut with a straight line</h3>\n<p>Drag across a shape to cut it with a straight line. This is great for slicing a shape cleanly in two.</p>\n<p><video src=\"https://superlinea.app/media/ghost-paths-and-scissors-cut-straight-ui-2026-10-23.mp4\" autoplay loop muted playsinline></video></p>\n<h3>Cut freehand</h3>\n<p>And finally, you can draw the cut yourself. If your hand is a bit shaky, turn\nup the stabilization and the seam comes out smoother.</p>\n<p><video src=\"https://superlinea.app/media/ghost-paths-and-scissors-cut-freehand-ui-2026-10-23.mp4\" autoplay loop muted playsinline></video></p>\n<p>No drawings were harmed during the recording of these videos. Well, they\nwere, but then I pressed <kbd>⌘Z</kbd>, so they're fine now.</p>\n",
      "content_text": "I recently added two new features to Superlinea: ghost paths, which help you\nkeep your bearings while moving things around, and the Scissors tool, which\nhelps you cut them apart. Let's see how they work.\n\nGhost paths\n\nWhile you drag a point or a path, the original path stays on the canvas as a guide,\nand your point snaps to them. This makes dragging a corner along a slanted edge\nvery easy and lets you change the shape while keeping the same angle, something\nthat would otherwise be tricky\n\nScissors\n\nThe second addition is a cutting-edge feature: the Scissors tool (sorry, I couldn't resist).\nThis tool lets you cut in three different ways.\n\nCut at a point\n\nClick a path to split it at that point. Handy when you want to open a closed\npath or break a line into separate pieces.\n\nCut with a straight line\n\nDrag across a shape to cut it with a straight line. This is great for slicing a shape cleanly in two.\n\nCut freehand\n\nAnd finally, you can draw the cut yourself. If your hand is a bit shaky, turn\nup the stabilization and the seam comes out smoother.\n\nNo drawings were harmed during the recording of these videos. Well, they\nwere, but then I pressed ⌘Z, so they're fine now.",
      "image": "https://superlinea.app/blog/ghost-paths-and-scissors/card.png",
      "date_published": "2026-10-21T00:00:00.000Z",
      "tags": [
        "features"
      ]
    },
    {
      "id": "https://superlinea.app/blog/performance/",
      "url": "https://superlinea.app/blog/performance/",
      "title": "Measuring Superlinea's performance",
      "summary": "Measuring large drawings, edits, and path operations",
      "content_html": "<p>Speed is one aspect of Superlinea's development that I consider super important\n(pun intended). A drawing app not only needs a good set of features and a good\ndesign, it also has to be fast. Because of that, during the development process\nI'm putting a lot of effort into optimizing it as much as possible. In this post,\nI'd like to present the results from the automated benchmarks I run to track\nthe app's performance.</p>\n\n<h2 id=\"how-i-ran-the-benchmarks\">How I ran the benchmarks</h2>\n<p>One important caveat about the numbers below: I ran the benchmarks on one of\nthe latest MacBook Pros on the market. Obviously, I don't expect everybody to\nhave this exact machine, so while I continue building the app, I plan to gather\nmore data from other machines.</p>\n<p>The measurements below were taken with a production build of the editor in\nSuperlinea 0.0.35, running in an isolated native macOS WebKit window with the\nsidebars visible. The machine I used is a MacBook Pro with an Apple M5 Pro chip\nand 48 GB of memory, running macOS Golden Gate (27.0.1). The window is 1,600 ×\n1,000 points at 2× scale (3,200 × 2,000 pixels), using the Apple GPU.</p>\n<p>I measured opening large drawings, panning and zooming, bulk selection and\nediting, and path operations like Smooth &amp; Simplify and booleans. The desktop\nshell, native file dialogs, disk access, and autosave are outside the\nmeasurements for now.</p>\n<h2 id=\"big-drawings\">Big drawings</h2>\n<p>For this first benchmark, I used two repeatable drawings. The first is a grid\nof colored rectangles. The second mixes rectangles, gradient-filled ellipses,\nand stroked curves, arranged in nested groups.</p>\n<!-- benchmark:headline -->\n<p>The editor loaded and displayed both test drawings at <strong>100,000 shapes</strong>. The mixed drawing opened in a median of <strong>1,535 ms</strong>. That's the largest size in this test, not a hard limit on what Superlinea can open.</p>\n<!-- /benchmark:headline -->\n<p>The opening times cover everything from reading the drawing to showing it on\nscreen, ready to edit. They don't include launching the app or loading the file\nfrom disk. Each number is the typical (median) result of seven runs.</p>\n<!-- benchmark:capacity -->\n<div class=\"post-table\" role=\"region\" aria-label=\"Data table: Shapes, Open rectangles, Open mixed, Pan p95, Zoom p95\" tabindex=\"0\"><table>\n<thead>\n<tr>\n<th scope=\"col\">Shapes</th>\n<th style=\"text-align:right\" scope=\"col\">Open rectangles</th>\n<th style=\"text-align:right\" scope=\"col\">Open mixed</th>\n<th style=\"text-align:right\" scope=\"col\">Pan p95</th>\n<th style=\"text-align:right\" scope=\"col\">Zoom p95</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1,000</td>\n<td style=\"text-align:right\">33 ms</td>\n<td style=\"text-align:right\">50 ms</td>\n<td style=\"text-align:right\">18 ms</td>\n<td style=\"text-align:right\">18 ms</td>\n</tr>\n<tr>\n<td>5,000</td>\n<td style=\"text-align:right\">83 ms</td>\n<td style=\"text-align:right\">100 ms</td>\n<td style=\"text-align:right\">18 ms</td>\n<td style=\"text-align:right\">17 ms</td>\n</tr>\n<tr>\n<td>10,000</td>\n<td style=\"text-align:right\">118 ms</td>\n<td style=\"text-align:right\">167 ms</td>\n<td style=\"text-align:right\">18 ms</td>\n<td style=\"text-align:right\">18 ms</td>\n</tr>\n<tr>\n<td>25,000</td>\n<td style=\"text-align:right\">284 ms</td>\n<td style=\"text-align:right\">381 ms</td>\n<td style=\"text-align:right\">19 ms</td>\n<td style=\"text-align:right\">18 ms</td>\n</tr>\n<tr>\n<td>50,000</td>\n<td style=\"text-align:right\">557 ms</td>\n<td style=\"text-align:right\">775 ms</td>\n<td style=\"text-align:right\">18 ms</td>\n<td style=\"text-align:right\">20 ms</td>\n</tr>\n<tr>\n<td>100,000</td>\n<td style=\"text-align:right\">1,216 ms</td>\n<td style=\"text-align:right\">1,535 ms</td>\n<td style=\"text-align:right\">22 ms</td>\n<td style=\"text-align:right\">18 ms</td>\n</tr>\n</tbody>\n</table></div>\n<!-- /benchmark:capacity -->\n<p>The last two columns show how smooth it feels to move around the mixed drawing.\nA typical screen draws a new frame every 16.7 ms, so anything close to that\nfeels fluid. The numbers are the slow end, known as p95: 95% of frames arrived\nat least that fast.</p>\n<!-- benchmark:capacity-note -->\n<p>At 100,000 shapes, the mixed document also contains 3,000 groups. Panning at 200% zoom had a p95 frame interval of 21 ms. Preparing its SVG took 266 ms, producing 11.2 MiB of editable SVG data.</p>\n<!-- /benchmark:capacity-note -->\n<h2 id=\"selecting-and-editing\">Selecting and editing</h2>\n<p>A drawing also needs to respond quickly when the user changes it. For these\ntests I used the rectangle drawing, selected every shape for the bulk\noperations, and restored the original document before each destructive edit.</p>\n<p>This table shows <strong>median processing times</strong> from seven repetitions after two\nwarm-ups. These times measure how long the editor takes to do the work and\nupdate its panels, not the moment the result appears on screen.</p>\n<!-- benchmark:editing -->\n<div class=\"post-table\" role=\"region\" aria-label=\"Data table: Action, 1,000 shapes, 5,000 shapes, 10,000 shapes\" tabindex=\"0\"><table>\n<thead>\n<tr>\n<th scope=\"col\">Action</th>\n<th style=\"text-align:right\" scope=\"col\">1,000 shapes</th>\n<th style=\"text-align:right\" scope=\"col\">5,000 shapes</th>\n<th style=\"text-align:right\" scope=\"col\">10,000 shapes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Click one shape</td>\n<td style=\"text-align:right\">6 ms</td>\n<td style=\"text-align:right\">6 ms</td>\n<td style=\"text-align:right\">4 ms</td>\n</tr>\n<tr>\n<td>Marquee everything</td>\n<td style=\"text-align:right\">16 ms</td>\n<td style=\"text-align:right\">45 ms</td>\n<td style=\"text-align:right\">78 ms</td>\n</tr>\n<tr>\n<td>Select all</td>\n<td style=\"text-align:right\">14 ms</td>\n<td style=\"text-align:right\">42 ms</td>\n<td style=\"text-align:right\">73 ms</td>\n</tr>\n<tr>\n<td>Select matching fill</td>\n<td style=\"text-align:right\">11 ms</td>\n<td style=\"text-align:right\">20 ms</td>\n<td style=\"text-align:right\">32 ms</td>\n</tr>\n<tr>\n<td>Move all</td>\n<td style=\"text-align:right\">16 ms</td>\n<td style=\"text-align:right\">38 ms</td>\n<td style=\"text-align:right\">73 ms</td>\n</tr>\n<tr>\n<td>Duplicate all</td>\n<td style=\"text-align:right\">29 ms</td>\n<td style=\"text-align:right\">129 ms</td>\n<td style=\"text-align:right\">306 ms</td>\n</tr>\n<tr>\n<td>Group all</td>\n<td style=\"text-align:right\">23 ms</td>\n<td style=\"text-align:right\">112 ms</td>\n<td style=\"text-align:right\">300 ms</td>\n</tr>\n<tr>\n<td>Ungroup all</td>\n<td style=\"text-align:right\">23 ms</td>\n<td style=\"text-align:right\">74 ms</td>\n<td style=\"text-align:right\">139 ms</td>\n</tr>\n<tr>\n<td>Delete all</td>\n<td style=\"text-align:right\">3 ms</td>\n<td style=\"text-align:right\">8 ms</td>\n<td style=\"text-align:right\">14 ms</td>\n</tr>\n<tr>\n<td>Undo deletion</td>\n<td style=\"text-align:right\">19 ms</td>\n<td style=\"text-align:right\">63 ms</td>\n<td style=\"text-align:right\">117 ms</td>\n</tr>\n<tr>\n<td>Redo deletion</td>\n<td style=\"text-align:right\">3 ms</td>\n<td style=\"text-align:right\">7 ms</td>\n<td style=\"text-align:right\">14 ms</td>\n</tr>\n<tr>\n<td>Prepare SVG</td>\n<td style=\"text-align:right\">4 ms</td>\n<td style=\"text-align:right\">17 ms</td>\n<td style=\"text-align:right\">23 ms</td>\n</tr>\n</tbody>\n</table></div>\n<!-- /benchmark:editing -->\n<p>The opening tests wait for two frames (two screen refreshes) after each run,\nso nothing there can measure below about 33 ms. I left that wait out here,\nwhich shows the real differences between small operations. Clicks and marquee\nselections go through the real selection tool, but they're triggered by a\nscript rather than a physical mouse. “Prepare SVG” creates the file contents\nwithout writing them to disk.</p>\n<!-- benchmark:drag-note -->\n<p>For continuous dragging with all 10,000 rectangles selected and snapping enabled, the median frame interval was 22 ms and p95 was 25 ms. This uses the actual selection tool with scripted movement; it measures the editing workload rather than a physical mouse gesture.</p>\n<!-- /benchmark:drag-note -->\n<!-- benchmark:drag-improvement -->\n<p>Before these optimizations, the same drag had a p95 frame interval of <strong>77 ms</strong>, compared with <strong>25 ms</strong> now. The editor reuses paths when shapes are translated; when the whole drawing moves together, it can also shift cached artwork during the drag and refine it after release.</p>\n<!-- /benchmark:drag-improvement -->\n<p>Dragging this many selected objects is still slower than the 16.7 ms per frame\nneeded for a perfectly smooth 60 frames per second. It's a heavier task than\nnavigating the drawing.</p>\n<h2 id=\"curves-and-overlapping-shapes\">Curves and overlapping shapes</h2>\n<p>For this benchmark, I tested paths and overlapping shapes. The tables in this\nsection include the two-frame wait again, which means that no operation can be faster than ~33 ms.</p>\n<h3>Smooth &amp; Simplify</h3>\n<p>I tested the Smooth &amp; Simplify tool at its default 50% settings on a wavy ring\ndrawn with 100, 1,000, and 5,000 anchors. The timings include opening the\npreview and applying it.</p>\n<!-- benchmark:refinement -->\n<div class=\"post-table\" role=\"region\" aria-label=\"Data table: Input, Result, Elapsed time\" tabindex=\"0\"><table>\n<thead>\n<tr>\n<th scope=\"col\">Input</th>\n<th scope=\"col\">Result</th>\n<th style=\"text-align:right\" scope=\"col\">Elapsed time</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>100 anchors</td>\n<td>29 anchors</td>\n<td style=\"text-align:right\">33 ms</td>\n</tr>\n<tr>\n<td>1,000 anchors</td>\n<td>29 anchors</td>\n<td style=\"text-align:right\">68 ms</td>\n</tr>\n<tr>\n<td>5,000 anchors</td>\n<td>64 anchors</td>\n<td style=\"text-align:right\">250 ms</td>\n</tr>\n</tbody>\n</table></div>\n<!-- /benchmark:refinement -->\n<p>All three rings are the same shape, drawn with more or fewer anchors. The\ndensest one ends up with more anchors than the others: 64 instead of 29. For\nthe technically curious, the simplifier merges at most 32 segments at a time\nto limit its work, so a denser path leaves more segments behind before\nsmoothing. It's a limitation I want to improve.</p>\n<h3>Boolean operations</h3>\n<p>I tested live boolean operations on grids of overlapping circles. The timings\ninclude creating the combined shape, which stays editable, and drawing the\nresult. Other drawings can be faster or slower, depending on how their shapes\noverlap.</p>\n<!-- benchmark:booleans -->\n<div class=\"post-table\" role=\"region\" aria-label=\"Data table: Operation, Input, Elapsed time\" tabindex=\"0\"><table>\n<thead>\n<tr>\n<th scope=\"col\">Operation</th>\n<th scope=\"col\">Input</th>\n<th style=\"text-align:right\" scope=\"col\">Elapsed time</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Unite</td>\n<td>10 circles</td>\n<td style=\"text-align:right\">33 ms</td>\n</tr>\n<tr>\n<td>Exclude</td>\n<td>10 circles</td>\n<td style=\"text-align:right\">33 ms</td>\n</tr>\n<tr>\n<td>Unite</td>\n<td>100 circles</td>\n<td style=\"text-align:right\">33 ms</td>\n</tr>\n<tr>\n<td>Exclude</td>\n<td>100 circles</td>\n<td style=\"text-align:right\">34 ms</td>\n</tr>\n<tr>\n<td>Unite</td>\n<td>500 circles</td>\n<td style=\"text-align:right\">34 ms</td>\n</tr>\n<tr>\n<td>Exclude</td>\n<td>500 circles</td>\n<td style=\"text-align:right\">150 ms</td>\n</tr>\n</tbody>\n</table></div>\n<!-- /benchmark:booleans -->\n<p>This test also helped improve the editor.</p>\n<!-- benchmark:boolean-improvement -->\n<p>For these 500 overlapping circles, Exclude fell from <strong>12.3 seconds to 150 ms</strong>, comparing median elapsed times with the same two-frame wait. Both runs use the same fixtures, native WebKit host, and machine.</p>\n<!-- /benchmark:boolean-improvement -->\n<p>Before, the editor merged shapes one at a time, so every step dealt with a\nbigger, messier shape. Now, for operations such as Unite and Exclude, it\nmerges them in pairs and then merges the results, which keeps each step small.</p>\n<h2 id=\"whats-next\">What's next?</h2>\n<p>Thanks to this benchmark I found and fixed a boolean operation that took over\n12 seconds, and made dragging large selections about three times smoother.\nThere's still work to do: dragging 10,000 shapes doesn't reach 60 fps yet, and\nduplicating or grouping that many elements takes about 300 ms.</p>\n<p>Next I'll run the same tests on other machines and start measuring the parts I\nleft out: the desktop shell, disk access, and autosave. By the way, if you are\none of the beta testers and have a drawing that makes Superlinea\nstruggle, send it my way.</p>\n",
      "content_text": "Speed is one aspect of Superlinea's development that I consider super important\n(pun intended). A drawing app not only needs a good set of features and a good\ndesign, it also has to be fast. Because of that, during the development process\nI'm putting a lot of effort into optimizing it as much as possible. In this post,\nI'd like to present the results from the automated benchmarks I run to track\nthe app's performance.\n\nHow I ran the benchmarks\n\nOne important caveat about the numbers below: I ran the benchmarks on one of\nthe latest MacBook Pros on the market. Obviously, I don't expect everybody to\nhave this exact machine, so while I continue building the app, I plan to gather\nmore data from other machines.\n\nThe measurements below were taken with a production build of the editor in\nSuperlinea 0.0.35, running in an isolated native macOS WebKit window with the\nsidebars visible. The machine I used is a MacBook Pro with an Apple M5 Pro chip\nand 48 GB of memory, running macOS Golden Gate (27.0.1). The window is 1,600 ×\n1,000 points at 2× scale (3,200 × 2,000 pixels), using the Apple GPU.\n\nI measured opening large drawings, panning and zooming, bulk selection and\nediting, and path operations like Smooth & Simplify and booleans. The desktop\nshell, native file dialogs, disk access, and autosave are outside the\nmeasurements for now.\n\nBig drawings\n\nFor this first benchmark, I used two repeatable drawings. The first is a grid\nof colored rectangles. The second mixes rectangles, gradient-filled ellipses,\nand stroked curves, arranged in nested groups.\n\nThe editor loaded and displayed both test drawings at 100,000 shapes. The mixed drawing opened in a median of 1,535 ms. That's the largest size in this test, not a hard limit on what Superlinea can open.\n\nThe opening times cover everything from reading the drawing to showing it on\nscreen, ready to edit. They don't include launching the app or loading the file\nfrom disk. Each number is the typical (median) result of seven runs.\n\nShapes\nOpen rectangles\nOpen mixed\nPan p95\nZoom p95\n\n1,000\n33 ms\n50 ms\n18 ms\n18 ms\n\n5,000\n83 ms\n100 ms\n18 ms\n17 ms\n\n10,000\n118 ms\n167 ms\n18 ms\n18 ms\n\n25,000\n284 ms\n381 ms\n19 ms\n18 ms\n\n50,000\n557 ms\n775 ms\n18 ms\n20 ms\n\n100,000\n1,216 ms\n1,535 ms\n22 ms\n18 ms\n\nThe last two columns show how smooth it feels to move around the mixed drawing.\nA typical screen draws a new frame every 16.7 ms, so anything close to that\nfeels fluid. The numbers are the slow end, known as p95: 95% of frames arrived\nat least that fast.\n\nAt 100,000 shapes, the mixed document also contains 3,000 groups. Panning at 200% zoom had a p95 frame interval of 21 ms. Preparing its SVG took 266 ms, producing 11.2 MiB of editable SVG data.\n\nSelecting and editing\n\nA drawing also needs to respond quickly when the user changes it. For these\ntests I used the rectangle drawing, selected every shape for the bulk\noperations, and restored the original document before each destructive edit.\n\nThis table shows median processing times from seven repetitions after two\nwarm-ups. These times measure how long the editor takes to do the work and\nupdate its panels, not the moment the result appears on screen.\n\nAction\n1,000 shapes\n5,000 shapes\n10,000 shapes\n\nClick one shape\n6 ms\n6 ms\n4 ms\n\nMarquee everything\n16 ms\n45 ms\n78 ms\n\nSelect all\n14 ms\n42 ms\n73 ms\n\nSelect matching fill\n11 ms\n20 ms\n32 ms\n\nMove all\n16 ms\n38 ms\n73 ms\n\nDuplicate all\n29 ms\n129 ms\n306 ms\n\nGroup all\n23 ms\n112 ms\n300 ms\n\nUngroup all\n23 ms\n74 ms\n139 ms\n\nDelete all\n3 ms\n8 ms\n14 ms\n\nUndo deletion\n19 ms\n63 ms\n117 ms\n\nRedo deletion\n3 ms\n7 ms\n14 ms\n\nPrepare SVG\n4 ms\n17 ms\n23 ms\n\nThe opening tests wait for two frames (two screen refreshes) after each run,\nso nothing there can measure below about 33 ms. I left that wait out here,\nwhich shows the real differences between small operations. Clicks and marquee\nselections go through the real selection tool, but they're triggered by a\nscript rather than a physical mouse. “Prepare SVG” creates the file contents\nwithout writing them to disk.\n\nFor continuous dragging with all 10,000 rectangles selected and snapping enabled, the median frame interval was 22 ms and p95 was 25 ms. This uses the actual selection tool with scripted movement; it measures the editing workload rather than a physical mouse gesture.\n\nBefore these optimizations, the same drag had a p95 frame interval of 77 ms, compared with 25 ms now. The editor reuses paths when shapes are translated; when the whole drawing moves together, it can also shift cached artwork during the drag and refine it after release.\n\nDragging this many selected objects is still slower than the 16.7 ms per frame\nneeded for a perfectly smooth 60 frames per second. It's a heavier task than\nnavigating the drawing.\n\nCurves and overlapping shapes\n\nFor this benchmark, I tested paths and overlapping shapes. The tables in this\nsection include the two-frame wait again, which means that no operation can be faster than ~33 ms.\n\nSmooth & Simplify\n\nI tested the Smooth & Simplify tool at its default 50% settings on a wavy ring\ndrawn with 100, 1,000, and 5,000 anchors. The timings include opening the\npreview and applying it.\n\nInput\nResult\nElapsed time\n\n100 anchors\n29 anchors\n33 ms\n\n1,000 anchors\n29 anchors\n68 ms\n\n5,000 anchors\n64 anchors\n250 ms\n\nAll three rings are the same shape, drawn with more or fewer anchors. The\ndensest one ends up with more anchors than the others: 64 instead of 29. For\nthe technically curious, the simplifier merges at most 32 segments at a time\nto limit its work, so a denser path leaves more segments behind before\nsmoothing. It's a limitation I want to improve.\n\nBoolean operations\n\nI tested live boolean operations on grids of overlapping circles. The timings\ninclude creating the combined shape, which stays editable, and drawing the\nresult. Other drawings can be faster or slower, depending on how their shapes\noverlap.\n\nOperation\nInput\nElapsed time\n\nUnite\n10 circles\n33 ms\n\nExclude\n10 circles\n33 ms\n\nUnite\n100 circles\n33 ms\n\nExclude\n100 circles\n34 ms\n\nUnite\n500 circles\n34 ms\n\nExclude\n500 circles\n150 ms\n\nThis test also helped improve the editor.\n\nFor these 500 overlapping circles, Exclude fell from 12.3 seconds to 150 ms, comparing median elapsed times with the same two-frame wait. Both runs use the same fixtures, native WebKit host, and machine.\n\nBefore, the editor merged shapes one at a time, so every step dealt with a\nbigger, messier shape. Now, for operations such as Unite and Exclude, it\nmerges them in pairs and then merges the results, which keeps each step small.\n\nWhat's next?\n\nThanks to this benchmark I found and fixed a boolean operation that took over\n12 seconds, and made dragging large selections about three times smoother.\nThere's still work to do: dragging 10,000 shapes doesn't reach 60 fps yet, and\nduplicating or grouping that many elements takes about 300 ms.\n\nNext I'll run the same tests on other machines and start measuring the parts I\nleft out: the desktop shell, disk access, and autosave. By the way, if you are\none of the beta testers and have a drawing that makes Superlinea\nstruggle, send it my way.",
      "image": "https://superlinea.app/blog/performance/card.png",
      "date_published": "2026-10-11T19:01:00.000Z",
      "tags": [
        "performance",
        "development"
      ]
    },
    {
      "id": "https://superlinea.app/blog/construction-tools/",
      "url": "https://superlinea.app/blog/construction-tools/",
      "title": "Construction tools",
      "summary": "Some lines cannot be drawn by eye.",
      "content_html": "<p>The construction tools are one of the features I'm most excited about. They're\na set of tools that make it easier to build geometric shapes with precision (although,\nobviously, they're useful for much more than that).</p>\n<p>There are currently four construction tools: Tangent line, tangent circle, perpendicular line, and curvature circle.</p>\n<p>Let's see how each of them work.</p>\n\n<h2 id=\"tangent-line\">Tangent line</h2>\n<p>As the name implies, this tool draws tangents from any shape, but it can also\nbe used to connect two shapes. For example, if you select the Tangent line tool\nand drag from one circle to another, you'll be able to connect them with two\ntangent lines. Quick geometry lesson: two non-overlapping circles have two\nexternal and two internal tangents.</p>\n<p><video src=\"https://superlinea.app/media/construction-tools-tangents-ui-2026-10-23.mp4\" autoplay loop muted playsinline></video></p>\n<p>While dragging a tangent, holding <kbd>⌥</kbd> extends it in both directions. Holding <kbd>⌘</kbd> makes the line ignore other shapes, or detaches it from the end shape if it's already connected.</p>\n<h2 id=\"tangent-circle\">Tangent circle</h2>\n<p>If you enjoyed drawing tangent lines, I'm sure you'll have a lot of fun with tangent circles. Same idea here: you can draw a circle tangent to a line or any other shape, or fit one between two shapes.</p>\n<p><video src=\"https://superlinea.app/media/construction-tools-tangent-circle-ui-2026-10-23.mp4\" autoplay loop muted playsinline></video></p>\n<p>As you get closer to another shape, an indicator guides you to the connecting point. And just like with lines, holding <kbd>⌘</kbd> lets you ignore other shapes or detach the circle from a shape it's already connected to.</p>\n<h2 id=\"perpendicular-line\">Perpendicular line</h2>\n<p>The name is self-explanatory: this tool lets you draw perpendicular lines from any shape. Holding <kbd>⌥</kbd> draws the line in both directions.</p>\n<p><video src=\"https://superlinea.app/media/construction-tools-perpendicular-ui-2026-10-23.mp4\" autoplay loop muted playsinline></video></p>\n<h2 id=\"curvature-circle\">Curvature circle</h2>\n<p>Finally, this tool finds the circle that exactly matches the bend of a curve at any given point. Select the tool and hover over any curve to see a preview of the circle, then click to draw it.</p>\n<p><video src=\"https://superlinea.app/media/construction-tools-curvature-circle-ui-2026-10-23.mp4\" autoplay loop muted playsinline></video>\n<video src=\"https://superlinea.app/media/construction-tools-curvature-circle-2-ui-2026-10-23.mp4\" autoplay loop muted playsinline></video></p>\n<p>And that's it. I plan to keep adding more tools. Write to <a href=\"mailto:feedback@superlinea.app\">feedback@superlinea.app</a> to let me know how you like them and which one I should add next.</p>\n",
      "content_text": "The construction tools are one of the features I'm most excited about. They're\na set of tools that make it easier to build geometric shapes with precision (although,\nobviously, they're useful for much more than that).\n\nThere are currently four construction tools: Tangent line, tangent circle, perpendicular line, and curvature circle.\n\nLet's see how each of them work.\n\nTangent line\n\nAs the name implies, this tool draws tangents from any shape, but it can also\nbe used to connect two shapes. For example, if you select the Tangent line tool\nand drag from one circle to another, you'll be able to connect them with two\ntangent lines. Quick geometry lesson: two non-overlapping circles have two\nexternal and two internal tangents.\n\nWhile dragging a tangent, holding ⌥ extends it in both directions. Holding ⌘ makes the line ignore other shapes, or detaches it from the end shape if it's already connected.\n\nTangent circle\n\nIf you enjoyed drawing tangent lines, I'm sure you'll have a lot of fun with tangent circles. Same idea here: you can draw a circle tangent to a line or any other shape, or fit one between two shapes.\n\nAs you get closer to another shape, an indicator guides you to the connecting point. And just like with lines, holding ⌘ lets you ignore other shapes or detach the circle from a shape it's already connected to.\n\nPerpendicular line\n\nThe name is self-explanatory: this tool lets you draw perpendicular lines from any shape. Holding ⌥ draws the line in both directions.\n\nCurvature circle\n\nFinally, this tool finds the circle that exactly matches the bend of a curve at any given point. Select the tool and hover over any curve to see a preview of the circle, then click to draw it.\n\nAnd that's it. I plan to keep adding more tools. Write to feedback@superlinea.app to let me know how you like them and which one I should add next.",
      "image": "https://superlinea.app/blog/construction-tools/card.png",
      "date_published": "2026-10-10T00:00:00.000Z",
      "tags": [
        "features",
        "construction"
      ]
    },
    {
      "id": "https://superlinea.app/blog/hello/",
      "url": "https://superlinea.app/blog/hello/",
      "title": "Hello, World",
      "summary": "Where the features that land in Superlinea get more than a line in the changelog.",
      "content_html": "<p>Hi, and welcome to the Superlinea blog!</p>\n<p>Superlinea is a vector drawing app for Mac that I’m currently building because\nI love vector illustration and I haven’t been able to find a tool that works\nthe way I want (and believe me, I’ve tried them all).</p>\n<p>My plan is to use this blog to share how it’s going: what I’m working on and\nwhat I’m learning. I hope you’ll follow along. And if you’re a vector\nenthusiast too, sign up for the newsletter below to be the first to know when\nthe app launches.</p>\n<p>Best,<br>\nJavier</p>\n",
      "content_text": "Hi, and welcome to the Superlinea blog!\n\nSuperlinea is a vector drawing app for Mac that I’m currently building because\nI love vector illustration and I haven’t been able to find a tool that works\nthe way I want (and believe me, I’ve tried them all).\n\nMy plan is to use this blog to share how it’s going: what I’m working on and\nwhat I’m learning. I hope you’ll follow along. And if you’re a vector\nenthusiast too, sign up for the newsletter below to be the first to know when\nthe app launches.\n\nBest,\n\nJavier",
      "image": "https://superlinea.app/blog/hello/card.png",
      "date_published": "2026-10-09T00:00:00.000Z",
      "tags": []
    }
  ]
}