Post‑processing LLM‑generated Markdown in Bike

Bike is becoming my preferred environment for the fast post‑processing of LLM‑generated Markdown exports, because its outlining model lets me quickly turn raw AI output into a clean, heading‑centric document structure.

In my current workflow, the Markdown headings exported from AI tools act as the primary structural anchors of the text. When I bring this content into Bike, I don’t actually want to outdent the headings themselves. Instead, I want to indent all non‑heading rows (body text, notes, etc.) so that the headings remain at their current outline level while the surrounding content moves one level deeper.

Technically, this means: all rows that are not of row type “heading” would be indented by one level, making the headings appear outdented relative to the rest of the text. The headings thus form the outer structural frame, and all other rows hang underneath them as more deeply nested content. This relative outdenting of headings—achieved by indenting everything else—matches how I think about the document: headings as the visible spine, body text as subordinate material.

It would be very helpful if Bike made it easy to perform this kind of operation in a repeatable way (for example via scripting, Shortcuts, or a built‑in command that indents all non‑heading rows in one step), so that imported Markdown can quickly be transformed into a clear, heading‑centric outline.

Klar, hier ein kurzer Nachtrag, den du separat unter deinen bestehenden Post setzen kannst:


As a small follow‑up: for this idea I asked an AI assistant to propose a possible AppleScript. The following snippet is AI‑generated and not tested, but it illustrates the intended operation (indent all non‑heading rows, never indent headings):

-- Bike: Indent all non-heading rows by one level
-- Intention: keep headings at their level and make them appear outdented
tell application "Bike"
    if not (exists front document) then return
    
    tell front document
        -- Select all rows whose type is not "heading"
        set bodyRows to rows matching "//*[@type!=heading]"
        
        repeat with r in bodyRows
            try
                indent r
            end try
        end repeat
    end tell
end tell

Now that in 269 we have two paths for reading markdown content I think I can build this in.

The default “safe” path is to read Bike’s nested list subset of Markdown. This is “safe” because when Bike saves it will output the same document structure. So Bike is a safe “editor” for this format.

In the latest 269 release when you open a markdown that doesn’t conform to Bike’s nested list format you will see a warning and be given the option to “Open Anyway”. In this second path Bike will still open file OK, but if you save the file it will change the structure to Bike’s nested list format.

Now that we have this distinction I think I will implement some previous markdown ideas in the “Open Anyway” path. In particular mapping headings to outline structure. Phew. Hope that makes some sense.

1 Like

Intention
The goal of this transformation is to keep Markdown headings as the visible structural spine of the document while indenting all non‑heading lines (body text, lists, etc.) one level deeper. In an outlining environment like Bike, headings should stay at their current outline level, and everything else should be nested under the nearest preceding heading. This makes the hierarchy visually clear and matches a heading‑centric mental model of the document.

Before (standard LLM‑style Markdown)

text

# Project Overview

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus.

- Key goal: Lorem ipsum dolor.
- Timeline: Lorem ipsum dolor sit amet.

## Background

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio.

- Stakeholders
- Alice
- Bob
- Constraints
- Lorem ipsum dolor sit amet.

### Related Work

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed cursus ante dapibus diam.

1. First item of related work.
2. Second item of related work.

# Implementation Ideas

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sagittis ipsum.

- Idea A: Lorem ipsum dolor sit amet.
- Idea B: Lorem ipsum dolor sit amet.

## Open Questions

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla quis sem at nibh elementum imperdiet.

- Question 1: Lorem ipsum?
- Question 2: Dolor sit amet?

After (headings unchanged, all other rows indented)

text

# Project Overview

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus.

- Key goal: Lorem ipsum dolor.
- Timeline: Lorem ipsum dolor sit amet.

## Background

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio.

- Stakeholders
- Alice
- Bob
- Constraints
- Lorem ipsum dolor sit amet.

### Related Work

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed cursus ante dapibus diam.

1. First item of related work.
2. Second item of related work.

# Implementation Ideas

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sagittis ipsum.

- Idea A: Lorem ipsum dolor sit amet.
- Idea B: Lorem ipsum dolor sit amet.

## Open Questions

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla quis sem at nibh elementum imperdiet.

- Question 1: Lorem ipsum?
- Question 2: Dolor sit amet?

Jesse, do you also see the advantage of using Bike as a target environment for LLM‑generated Markdown (for example from Perplexity)? Large LLM threads become much more manageable once they are in Bike’s outline model.

Beyond this specific heading‑mapping idea, I also see Bike as a very promising “post‑processor” for longer LLM sessions. Once the raw markdown is in Bike, I can quickly restructure, prune, and annotate large threads in a way that would be very hard to do in a linear editor.

For tools like Perplexity that produce long, multi‑section answers, Bike’s outline model becomes almost a management layer on top of the LLM: I can collapse sections, move whole reasoning branches around, and add my own notes without breaking the original content.

My hope is that Bike can evolve into a kind of “LLM companion editor”: a place where AI‑generated markdown lands first, gets cleaned up structurally, and then is exported again into whatever final format is needed.

I would love to hear whether you see Bike in this role as well – as a companion editor for AI‑generated markdown, where the outline is the main way to make large LLM threads manageable.

Footnote – processes (operational or cognitive) that become over-dependent on LLMs may be in for a price shock.

( Energy crisis now radiating from the Gulf, and LLMs are extraordinarily energy-intensive. The supplier(s) that get(s) through will emerge in much more monopolistic or cartel-like positions, and under shareholder pressure to monetize more aggressively )

I first see Bike as better text editor, applying the two tricks for folding and focusing. My biggest goal is to unlock that surface that for many uses.

I have certainly wondered about more specific LLM uses, and it seems like a good fit for those too. Though I have to admit that in my personal use of AI, pretty much just Claude Code, the chunks of output are small enough that I’m happy with just the terminal at the moment.

I don’t expect this will be my personal focus. I feel like Bike infrastructure and bugs (iOS at some point hopefully soon) and such will be my focus for a long time. I expect my focus will be “good outline editor”.

With that said I’ve worked really hard to build out Bike’s extension system. I think that’s the route to interesting Bike/LLM interactions. And I’m definitely willing to tweak that system as needed to support more cases.

2 Likes