• Short answer: you can open a .tex file in Xcode. You can also eat soup with a fork. Nobody’s stopping you.

    I understand the impulse, though. If you’re a Mac developer who suddenly needs to write a paper — or an academic who happens to live in Xcode — the question is natural. You already have a professional editor installed. It has syntax highlighting, a file navigator, and find-and-replace that works. Why install anything else?

    Here’s what happens when you try.

    What Xcode gives you

    Xcode will treat your .tex file as plain text. You get the editor surface — which, to be fair, is excellent. Native text engine, flawless IME handling for Korean, Japanese, and Chinese, buttery scrolling, every macOS keyboard convention you already know. The bones are good, because the bones are AppKit.

    What Xcode doesn’t give you

    Everything else.

    There’s no LaTeX syntax highlighting — your \section commands sit there in monochrome. No build integration: you’ll be alt-tabbing to Terminal to run xelatex, then to Preview to see the PDF, then back to Xcode to find your place again. No SyncTeX, so “where does this paragraph appear in the PDF?” is a question you answer by scrolling. No document outline, no autocompletion for the four hundred LaTeX commands you half-remember, no error list that jumps to the offending line.

    You can bolt some of this together with Run Script build phases and external tools. People have — there are decade-old Stack Exchange threads with heroic Xcode-LaTeX configurations, and they all read like instructions for teaching a horse to drive.

    The instinct is right, though

    Wanting to write LaTeX in a real native Mac app — with the system text engine, real IME support, and keyboard shortcuts that match every other app you use — is exactly the right instinct. Xcode just isn’t the app.

    That’s roughly why I built texspark. I wanted the part of Xcode that’s good (the native editor feel) attached to the parts LaTeX actually needs: one-keystroke builds with any engine, SyncTeX in both directions, an outline that follows \include chains, autocompletion that knows the difference between \ref{ and \begin{, and an error list where clicking a row lands you on the line that broke. Plus an AI panel, because it’s 2026 and half my debugging is asking Claude why my table is off the page.

    One-time license, 14-day full trial, and it weighs a lot less than Xcode.

    If you still want to use Xcode

    Genuinely, no judgment — here’s the minimal setup: install MacTeX, add a Run Script build phase calling xelatex -interaction=nonstopmode "$FILE", and keep Preview open next to it. It works. For a two-page document, it’s fine.

    For a thesis, come back to this post. I’ll be here.


  • Looking for a Texpad (Texifier) Alternative on Mac?

    If you typed “Texpad” into a search box recently, you know it goes by Texifier now. And if you’re searching for alternatives, you’re probably not unhappy so much as curious — wondering what else the native-Mac LaTeX world has to offer these days.

    Fair question. The answer used to be “not much.”

    Credit where it’s due

    Texpad earned its following. It was, for a long stretch, the definitive native LaTeX editor on the Mac: fast, polished, with a live-typesetting engine of its own and an iPad version to boot. Texifier carries that lineage on, and if it fits your workflow, this post won’t talk you out of it.

    But “native Mac LaTeX editor” was a category of roughly one for a long time, and having options is healthy.

    What the rest of the landscape looks like

    Texmaker and TeXstudio are free and capable, but they’re Qt apps — functional, cross-platform, and unmistakably not Mac-native. Overleaf is a browser tab with a subscription, brilliant for collaboration, less so for offline work. VS Code with LaTeX Workshop is powerful if you enjoy configuring things, which is a specific personality type.

    If what drew you to Texpad was the native part — system text engine, real IME support, keyboard conventions that match every other Mac app — that list doesn’t offer much.

    Where texspark fits

    texspark is my addition to the category. Native SwiftUI + AppKit on the system text engine, so IME input, dictation, and every macOS text convention just work. It drives a standard TeX distribution (MacTeX/BasicTeX), so your documents build identically everywhere. SyncTeX in both directions across \input/\include files, a recursive outline of your whole project, a customizable build pipeline, and an AI panel for the “why is my figure floating to page 9” moments.

    One-time license, 14-day full trial, no signup.

    The honest caveats

    texspark is macOS-only — no iPad version, unlike Texifier — and it’s young. It also doesn’t bundle a typesetting engine; it drives the TeX Live you install. If iPad editing or built-in live preview matters most to you, Texifier holds those cards.

    But if you’re a Mac-first LaTeX writer who likes the idea of two good native options instead of one: texspark.io. Kick the tires for 14 days.


  • Here’s a problem they don’t teach you in a PhD program: I made a thing, and I have no idea how to tell people about it.

    The building part, I understood. Every problem had a shape — you debug it, it works, you move on. Six weeks of that and texspark became something I genuinely reach for every day, which is the highest praise I can give my own software.

    Then I looked up from the code and realized: nobody knows it exists.

    So far my marketing strategy has been, in its entirety: tweeting into the void with #buildinpublic, writing blog posts like this one, and refreshing a Telegram bot that mostly reports visits from Googlebot. (Hello, Googlebot. You’re my most loyal user.)

    The honest inventory of what I know about marketing: Nothing. That’s the inventory.

    But here’s what I’m trying, in increasing order of terror: SEO groundwork first — comparison pages, feature docs, blog posts that might index before anyone searches. Then the communities where LaTeX people actually live. Then, once the checkout pipeline is real, the big swings — Show HN, Product Hunt — the places where an indie app either finds its people or dies in the “new” tab.

    If you’ve marketed a developer tool before, I would genuinely love to hear what worked. And if you haven’t but you write LaTeX on a Mac — well, that’s convenient. texspark.io. Tell a friend. Apparently that’s how this works.


  • New

    • Choose whether to restore your last session — a new Editor → Behavior toggle, Restore last session on launch (on by default), lets texspark start empty instead of reopening your previous tabs. Your tabs are still saved on quit either way, so flipping it back on brings them right back.
    • Open the PDF in your default app — a new button in the PDF header hands the current PDF to Preview, Skim, or whatever you’ve set as the default, for full-window reading, printing, annotating, or presenting.
    • Jump to any open tab — a new ⌄ menu at the right of the tab strip lists every open document, with a checkmark on the current one and a ● on unsaved tabs. Pick one to switch straight to it — handy when you have more tabs than fit and some are scrolled off. It appears once you have more than one tab open.

    Fixed

    • Click to move the caret while typing Korean — clicking elsewhere mid-composition now moves the cursor on the first click instead of taking two, while still committing the syllable you were typing.
    • Highlighting survives a line break inside inline math — wrapping a long $…$ across a line no longer drops its syntax colors. Inline math now highlights across line breaks (stopping only at a blank line), and editing one line of a multi-line formula re-colors the whole span instead of just the line you touched.

    Improved

    • Unnumbered headings in the outline — starred sectioning commands (\chapter*, \section*, \subsection*) now appear in the outline without a number, and no longer bump the counter — so a starred preface no longer pushes your first real chapter to “2”.
    • Smarter bracket auto-close — typing an opening (, [, or { in front of text that already has a matching closer no longer inserts a stray extra one. Type ( before something) and you get (something), not ()something). When the line is balanced, the pair is still auto-inserted as before.
    • Smarter $ auto-close — when a line already has an open math delimiter, typing $ closes it with a single character instead of dropping in a new $$ pair. So finishing $x with a $ gives you $x$, not $x$$.
    • Lettered appendices in the outline — headings after \appendix are now numbered with letters (A, B, C…) instead of digits, matching LaTeX. Appendix chapters read A, B… with their sections as A.1, A.2, and the counter restarts at A so a numbered chapter before the appendix no longer throws it off. In article-class documents, where the appendix letters sections instead, that’s handled too.
    • Outline reopens where you left off — on relaunch, the outline now scrolls to the section holding your restored cursor instead of starting at the top, so you land right back in context in a long document.
    • Smarter “expand to level” in the outline — expanding to Chapters / Sections / Subsections now only opens nodes that actually contain a heading at that level. A chapter whose only children are deeper items (e.g. paragraphs directly under it) stays collapsed instead of dumping those too-deep entries into view.
    • Smoother typing in long documents — the code-folding scan is dramatically faster (it no longer recounts line numbers from the top of the file for every match), so editing a long file no longer pins a CPU core. The minimap also skips redrawing while its window is hidden.

  • Last month I set out to write a book. What I actually did was build a LaTeX editor.

    The plan was always “just fix this one thing, then get back to the manuscript.” One thing became a build pipeline, then SyncTeX, then an AI panel, then a minimap, then session restore, then — you get the idea. The git log reads like a confession.

    But somewhere in the last week or two, something changed. I’d sit down to write, reach for a feature that wasn’t there, and find that… it was there. Forward search landed exactly where I expected. The outline followed my \include chain without complaint. The build target stayed pinned to main.tex no matter which chapter I wandered into.

    The editor stopped getting in my way — which was the whole point, one detour and one month ago.

    So this week, I opened chapter3.tex. Not to test bracket matching. To write.

    texspark isn’t finished — no software ever is. There’s still a list of things I want to build, and the changelog will keep moving. But it’s crossed the threshold from “project I’m building” to “tool I’m using.” The dogfooding phase is over; the dog is fed and the food is fine.

    The book is about machine learning, written in Korean, typeset in LaTeX — obviously. If the editor holds up through a few hundred pages of equations, figures, and my questionable prose, you’ll know the 1.0 badge was earned.

    Back to the manuscript. For real this time.


  • Fixed

    • Rock-steady Hangul typing — typing Korean no longer flickers, drifts, or bobs. Previously a Korean line could shimmer (along with the line above it) the moment it soft-wrapped, nudge the lines below it downward, or make the composing syllable jitter up and down. Line height and baseline are now fixed during typesetting itself, so wrapping, fast typing, and IME composition all stay put.
    • No more sideways drift — at fit-width the page no longer scrolls or drags horizontally; horizontal panning kicks in only once you’ve zoomed in past the page width.

    Improved

    • Line numbers never clip — the gutter now sizes itself to the document. It always fits at least four digits and grows automatically for five- and six-digit files (and for larger editor fonts), so deep line numbers are never cut off — while shorter files reclaim the extra space.
    • Softer minimap text — the minimap renders its text a touch lighter so it reads as a calm overview instead of competing with the editor.

    Added

    • Hand tool for panning — right-click the PDF and pick Hand Tool to grab and drag the page around (the cursor turns into a hand); Select Tool switches back to text selection. ⌘-click inverse search keeps working in either mode.
    • Terminal font tracks editor font size — the terminal now automatically matches the editor’s font size, so both stay in sync when you adjust text size in settings.
    • Scroll to zoom — hold ⌥ or ⌘ and scroll to zoom in and out toward the cursor. (⌃+scroll is left to macOS’s own screen zoom.) Use the built-in Automatically Resize in the right-click menu to snap back to fit-width.
    • Hide the sidebar — a new toggle in the editor’s status bar (next to the bottom-panel toggle) collapses the left Outline / Labels sidebar so the editor gets the full width, and brings it back with one click. Both toggles keep a direction-specific icon whether open or closed — a filled left column vs. a filled bottom strip — so you can always tell which is which, and it dims when its panel is hidden. The state is remembered across relaunches, and collapsing the sidebar keeps your editor and tabs exactly as they were.

  • It was 2:49 AM and I was deep in a debugging session with Claude — the kind where you’ve lost track of time and the git log is starting to look like a diary of questionable decisions.

    Then the notification: You’ve reached your usage limit.

    And right below it: Your limit resets at 2:50 AM.

    One minute. My AI pair programmer had walked out on me — for exactly sixty seconds.

    I’d like to tell you I used that minute wisely. Stretched. Drank water. Reflected on my life choices. What actually happened is that I sat there watching the clock, waiting for my robot colleague to come back from its one-minute break.

    It came back at 2:50. We kept going. I went to bed at 4.

    There’s probably a lesson here about work-life balance, or about how “my AI ran out and I had to wait a minute” is now a genuine inconvenience in a developer’s night. But mostly the lesson is: I should go to bed earlier.

    (I won’t.)


  • Minimap

    texspark now has a code minimap: a slim overview of the whole document down the right edge of the editor. It renders your actual text — syntax colours and all — scaled way down, so you can see the shape of a file at a glance and jump anywhere in it. On long documents the minimap keeps a fixed zoom and slides to follow your position rather than squashing the entire file into the strip, and clicking or dragging on it scrolls the editor straight to that spot. It stays out of your way otherwise, and you can turn it off entirely in Preferences.

    Fixed

    • Hangul line drift, for good — typing a Korean line no longer nudges the lines below it downward. Line height is now hard-pinned in layout, so the taller CJK-composition font can’t inflate a line.

  • Improved

    • Faster tab switching — switching tabs no longer waits on the tab strip’s scroll animation, so the editor updates right away. Switches that used to take about a fifth of a second are now near-instant.
    • Instant first switch to reopened tabs — after a relaunch, texspark now warms up your restored tabs in the background, laying each one out up to your saved cursor. The first time you switch to a tab is immediate instead of stalling to render — even in long files. A slim progress bar in the status bar shows the warm-up and fades away once every tab is ready.
    • Smoother newlines in large files — pressing Return in a big document no longer stalls; the editor only lays out the visible region instead of the whole file.
    • Fold arrows keep up — the fold triangles in the gutter now track the text more closely as you type and add lines.

    Fixed

    • Line numbers in the gutter — after opening a tab scrolled partway down (including a session-restored tab), the line numbers could restart from 1 at the top of the screen instead of showing the real line numbers. The gutter now reads the visible region in the right coordinate space, so the numbering always matches the document.
    • Line numbers no longer drift while typing Hangul — composing a Korean syllable briefly grew its line taller than the rest, nudging every line (and its number) below it down. Lines now hold a fixed height across Latin and CJK text, composing or committed, so nothing shifts.

    Changed

    • Switching tabs now returns you to your cursor — instead of trying to restore a remembered scroll position, the editor jumps to where your caret last was in that tab and brings it into view. It’s more predictable across tab switches and app relaunches: you land exactly where you were typing.

  • This release is all about how the editor feels in a large, multi-file project — faster tab switching, smoother typing, and a caret that stays exactly where you left it.

    Instant tab switching

    Every open tab now keeps its own editor, so switching between them is immediate — no re-highlighting or re-layout on each switch. Your cursor position, scroll offset, and collapsed sections are all preserved per tab, so returning to a file lands you exactly where you were. Restored tabs are warmed up in the background after launch, so even the first switch to a tab is instant. A single click on a tab selects it right away (double-click still sets/clears the build target).

    Smoother typing in large files

    Typing in large documents (tens of thousands of characters) no longer stutters — most noticeably when completing a Hangul syllable. Keystrokes stay smooth no matter how big the file is; the outline and fold markers simply catch up a moment after you pause.

    Refinements

    • The caret is now saved on every way of switching tabs — mouse, keyboard cycling, and jump-to-issue — so it’s never lost.
    • Switching tabs scrolls the active tab into view and centers it in the tab bar.
    • Outline entries open on any click, single or double.