• Let me start with a confession. I was supposed to be writing a book.

    I was working on something large — the kind of manuscript that spans many files — and the editor I was using kept getting in the way. The outline never generated properly, so I could never see the shape of what I was writing. The files didn’t feel connected; jumping between a chapter and the parts it pulled in was clumsy, and nothing tied them together the way the document actually fit together. And I couldn’t customize the compile step to run the way I needed it to. “If I just fix this one thing,” I thought, “writing will get so much easier.”

    That was how it started.

    “Just this one feature, then back to the manuscript.”

    I’ve lost count of how many times I said that. I polished the syntax highlighting, added folding, wired up SyncTeX to jump between the PDF and the source, bolted on an AI assistant, and started timing tab switches down to the millisecond. The manuscript stayed open the whole time — in the background, cursor blinking, waiting.

    When I finally looked up, the book hadn’t gained a single chapter. What I had instead was texspark, a LaTeX editor for macOS. The tool I built to serve the goal had quietly become the goal itself.

    What do you even call this? Productive procrastination? A tool-building addiction? Or maybe I just found coding more fun than writing.

    Probably all three.

    Still, there’s one consolation: this editor is slowly becoming a little less annoying for people like me — the ones who sit down to write a book and end up fixing their tools first. Someday I’ll finish that book in it. Probably.

    For now, though, I’ve got an editor to work on.


  • Improved

    • Faster tab switching on large files — the editor now lays out only the visible region and rescans folds off the main thread, so swapping between big documents is markedly quicker while the caret and scroll position still land where you left them
    • Fixed typing lag in large documents — text now stays smooth even in files with tens of thousands of characters, including while composing Hangul.

    New

    • Active tab scrolls into view — switching tabs (especially by keyboard, ⌘⇧[ / ⌘⇧]) now keeps the selected tab centered in the strip instead of letting it slide off the edge; a session-restored tab that starts off-screen is brought into view on launch

    Fixed

    • Cursor position per tab — moving the caret and then switching tabs by keyboard (⌘⇧[ / ⌘⇧]) now saves the caret’s new spot, so returning to a tab lands where you left off instead of an earlier position
    • Minor bug fixes

  • I shipped texspark 0.4.1 this week. The editor works. SyncTeX jumps land where they should. The website has a yellow button, the button counts downloads, and every download pings my phone through a little Telegram bot I wired up. The machine is built and humming.

    There’s just one problem left, and it’s the one nobody warned me about: almost nobody knows this thing exists.

    The chart that keeps me honest

    I set up analytics recently. Here is what I’ve learned from my traffic data so far: my most loyal visitors are (1) me, checking whether the site looks right, and (2) Googlebot, dutifully crawling the sitemap I submitted. Somewhere in there are a handful of real humans — and I’m grateful for every one of you, whoever you are.

    When download #6 came in from an IP that wasn’t mine, my phone buzzed and I genuinely stared at it for a moment. Someone I’ve never met dragged my app into their Applications folder. That feeling doesn’t show up in any chart, but it’s the whole reason to keep going.

    Turns out this is a different job

    I spent months on the fun problems. Making a native NSTextView behave with LaTeX. Getting inverse search to follow \input chains. Parsing TeX’s 79-column log wrapping so error messages stop losing their line numbers. These problems have a shape: you push, they resist, eventually they yield.

    “Getting people to visit a website” has no such shape. There’s no compiler error telling me what’s wrong. The honest answer to “why is nobody coming?” is simply that the internet is very large, texspark.io is very new, and no amount of ⌘B fixes that.

    So I’m doing what engineers do with unfamiliar problems: reading the documentation and making a list.

    The list

    Here’s my plan, in public, so you can watch it succeed or fail:

    • Directories. I signed up for AlternativeTo, where new accounts must wait a week before submitting anything. So right now my marketing strategy is, quite literally, a waiting room. (MacUpdate is next.)
    • Writing. Posts like this one, plus actually useful ones — what I’ve learned about multi-file LaTeX projects, editor internals, why native macOS text handling matters for CJK writers.
    • Telling people. Colleagues, grad students, the LaTeX forums I’ve quietly read for years. This is the part that feels most unnatural to a person who chose a career of typing alone in a quiet room. Doing it anyway.
    • Not yet: the big launch posts. Checkout isn’t open (paperwork — the boring kind, being finished). A launch that sends people to a product they can’t buy is a launch wasted, so Show HN stays in the drawer a little longer.

    If you’re one of the humans

    The trial is the whole app — every feature, 14 days, no signup, no email. If you write LaTeX on a Mac, try it and tell me what’s broken or missing: support@texspark.io. Bug reports are gold. Blunt opinions are platinum.

    And if you know someone whose thesis lives in seventeen .tex files held together by hope — send them here. Word of mouth is the one channel that no waiting room can delay.

    — the LaTeX nerd behind texspark


  • New

    • Double-click a tab to set or clear it as the build target (same as ⌘⇧P / right-click)
    • Collapsible bottom panel — hide the Terminal / Issues / Log area with ⇧⌘Y or the status-bar button; it reopens automatically when a build reports errors
    • ⌘⇧A shuttles keyboard focus between the editor and the AI input (and still sends the selection when there is one)
    • AI input now grows with your text up to 6 lines and then scrolls, and Shift+Enter inserts a newline
    • The AI system prompt gains a Clear button, applies to the next message without a restart, and can be left blank
    • The AI Attach activated document toggle now persists across launches

    Fixed

    • Tab state cross-contamination — opening several files at once no longer shows the build target’s content in the wrong tabs, and each tab keeps its own PDF scroll position
    • Stale highlight artifacts — thin residual lines left behind by bracket and selection highlights are gone; gutter fold marks stay aligned
    • Selection alignment — the selection highlight now matches the line height instead of drooping below the text, especially with a custom editor font
    • Bottom panel state — a panel hidden at quit now stays hidden on the next launch instead of reappearing out of sync with its toggle icon
    • Korean / IME input in the AI box no longer drops the second composed syllable
    • Minor bug fixes

  • Better navigation and smoother file handling.

    • Outline cursor tracking — the outline highlights the section your cursor is in — and its ancestor chain (section → subsection → paragraph) — live as you move around the document, so you always know where you are.
    • Drag & drop — drop .tex files from Finder onto the editor to open them as tabs, and drag tabs to reorder them.
    • File association — open .tex files in texspark straight from Finder (double-click / Open With).
    • Minor bug fixes — assorted stability and polish fixes.

  • I didn’t set out to build an editor. I set out to finish a book.

    I’ve been teaching machine learning for a few semesters. Each term the lecture notes grew — a derivation cleaned up here, a worked example added there, a figure redrawn because last year’s version confused everyone. At some point the pile of notes stopped looking like handouts and started looking like a book. So I decided to write one. In LaTeX, of course.

    And that’s when the trouble started — not with the math, but with the tools.

    A book is not one file

    A serious LaTeX document isn’t a single .tex file that happens to be long. It’s a main.tex that pulls in a dozen chapters with \input and \include, each chapter carrying its own figures, its own labels, its own cross-references into three other chapters. The preamble lives in one place, the bibliography in another, the custom macros in a third.

    Every editor I tried treated that project as one long document instead of the branching structure it actually was. And each one broke down in its own way once the thing got big.

    Overleaf was wonderful right up until it wasn’t. Collaboration is great, nothing to install — but as the project grew the web editor started to lag, and I couldn’t touch it on a plane or a train with bad Wi-Fi, which is exactly where I get my best writing done. VS Code with LaTeX Workshop was powerful, but it felt like I had to assemble a workshop before I could write a single sentence — extensions, settings, recipes, output panels. TeXShop was fast and properly native, but it knew nothing about the structure I was actually working in: which file includes which, which label is defined where, which file ⌘B should really compile.

    The real itch

    Here’s the moment that pushed me over the edge. I’d be deep inside chapters/07-optimization.tex, mid-thought on a gradient-descent proof, and I’d hit build — and compile the wrong file, because the editor thought “build” meant “build whatever’s in front of me.” Or I’d click a section in the outline to jump to it and land in a file that didn’t have my unsaved edits, so the outline was quietly lying to me. Or I’d need the label for that one equation from chapter 3 and end up grepping the whole project to find it.

    None of these are catastrophes. They’re papercuts. But you get a few hundred of them over a few hundred pages, and the tool stops feeling like a place to think and starts feeling like something you’re fighting. The tools worked on files. I was working on a project.

    So I built the editor I wanted

    texspark is built around one idea: the editor should understand that you’re working on a project, not a file. Concretely, that means:

    • Set main.tex as the build target once. After that, ⌘B always compiles the project root — no matter which sub-file you wandered into. No more building the wrong thing.
    • The outline follows \input / \include across every file in the project, built from your live buffer — no save needed. Click an entry and land exactly there, in the right file, with your latest edits intact.
    • SyncTeX works both ways, across file boundaries. Click anywhere in the PDF and the editor jumps to the matching source file — even if it’s a chapter you didn’t have open. Jump from the editor and the PDF scrolls to your cursor with a highlight so your eye finds it instantly.
    • Every file’s labels in one list, feeding \ref / \eqref / \cref autocomplete. Stop grepping for that equation tag; start typing and pick it.

    Native, and quiet about it

    texspark is a real macOS app, not a web view in a trench coat. Every keystroke goes through Apple’s text engine — the same one Notes and Xcode use — so the Korean and CJK input, the Services menu, dictation, and the system Find bar all just work, the way you already expect them to. Folding, bracket matching, and autocomplete are there when you want them and silent when you don’t. It launches instantly and it doesn’t warm up your lap.

    There’s also an AI agent in the sidebar, for the moments you want a second pair of eyes on a stubborn proof or a table that won’t line up. It reads the document you’re working on (only when you toggle it on), talks back in rendered markdown with copy-ready LaTeX, and uses your API key — nothing is routed through a server of mine, and the key lives in your Keychain.

    Still writing that book

    The book still isn’t done. But somewhere along the way the tool stopped being the obstacle, and the writing became the hard part again — which is exactly how it should be. Every feature in texspark exists because I hit the wall it removes, usually at 1 a.m. the night before a lecture.

    It’s still early — v0.4.0, built by one person who mostly wanted to use it himself. If you write long things in LaTeX and the file-shaped tools have been quietly annoying you too, I’d genuinely love for you to try it. There’s a 14-day trial, no signup and no email required.


  • An in-app AI assistant, automatic updates, and a batch of writing conveniences.

    • AI Agent — chat with an LLM in a side panel without leaving the editor. Choose your provider — Claude (Anthropic), ChatGPT (OpenAI), or Gemini (Google) — bring your own API key, and get streaming, markdown-rendered replies tuned for LaTeX help.
    • Automatic updates — powered by Sparkle, texspark can check for and install new versions in the background, with every update cryptographically signed.
    • Word count — a live word count for the rendered document in the editor’s status bar, counted with texcount so \input / \include are followed.
    • SyncTeX highlight — a forward search now flashes a highlight at the destination in the PDF, so you can see exactly where you landed.
    • Auto save — optionally flush your edits to disk automatically after a short idle, so a build always runs against the latest text.
    • Optimization — further editor and build performance improvements.
    • Minor bug fixes — assorted stability and polish fixes.

  • Licensing, the groundwork for the AI Agent, and a proper app icon.

    • License management — a 14-day full trial with no signup, and license entry to unlock texspark after it ends. Enter a key to activate your Mac, with the licensing handled through the built-in Buy / Enter License flow.
    • AI assistant scaffold — the foundation for the in-app AI Agent panel, ahead of the full chat experience in a later release.
    • App icon — texspark gets its own icon.
    • Minor bug fixes — assorted stability and polish fixes.

  • Editor power tools for finding, matching, and inserting faster.

    • Find & Replace — the native macOS find bar, right inside the editor: ⌘F to find, ⌘G / ⇧⌘G for next / previous, and replace across the document.
    • Bracket matching — when the caret sits next to {, [, (, or $, both halves of the pair get a soft highlight so you can see what closes what at a glance.
    • Command palette — an inline autocompletion popup for \commands: navigate with the arrow keys, accept with Tab or Enter, dismiss with Esc.
    • Fixed line-number spacing — resolved an issue where the line numbers in the gutter could drift out of alignment with their lines.
    • Minor bug fixes — assorted stability and polish fixes.

  • A tune-up release focused on speed and internals.

    • Faster text editor — editing and scrolling are noticeably snappier, especially in large documents, with the heavy work kept off the typing path.
    • Code cleanup & refactoring — the codebase was reorganized for maintainability, laying groundwork for future features (no behavior change on its own).
    • Terminal theme — the embedded terminal’s colors now follow the app’s appearance, so the build console sits consistently alongside the editor.
    • Minor bug fixes — assorted stability and polish fixes.