夢のmacOSプレゼンテーションアプリをバイブコーディングで実現
著者が2026年2月のLLMの現状について発表した。イベントは事前提案不要のアンカンファレンス形式で行われた。
キーポイント
LLM開発の加速化を示す具体例として、2025年11月を転換点とする3ヶ月単位での進化報告が初めて行われた
AIエージェント支援によるデータ分析(カカポ繁殖期)をプレゼンに活用する実践例
Swift/SwiftUIを用いた迅速なmacOSアプリ開発(45分でプレゼンツール作成)の実証
プレゼンテーション手法の革新として、URLベースのスライド管理とWebView表示を組み合わせた新アプローチ
影響分析・編集コメントを表示
影響分析
この記事は、LLM分野の急速な進化を実証する具体例として、開発者コミュニティにおける実践的なAI活用と迅速なツール構築の文化を反映している。技術的には画期的ではないが、AI時代のプレゼンテーション手法と開発ワークフローの変化を示す興味深いケーススタディを提供する。
編集コメント
技術的な革新性よりも、AI時代の開発者文化とプレゼンテーション手法の変化を体現する興味深い事例。LLM進化の加速を実感させる具体性が記事の価値。
私は夢のmacOSプレゼンテーションアプリをバイブコーディングした
Simon Willison's Weblog
私は夢のmacOSプレゼンテーションアプリをバイブコーディングした
2026年2月25日
この週末、マウンテンビューで開催されたSocial Science FOO Campで講演を行った。このイベントは古典的なアンカンファレンス形式で、事前に提案する必要なく誰でも講演を発表できるものだった。私は「The State of LLMs, February 2026 edition」と題し、サブタイトルを「It's all changed since November!」とした講演の枠を確保した。私は前夜、そのプレゼンテーション用にカスタムmacOSアプリをバイブコーディングした。

私はこれまで、LLM開発の過去12か月について、2023年12月、2024年12月、2025年12月に書いてきた。また、2025年6月のAI Engineer World's Fairでは『The last six months in LLMs, illustrated by pelicans on bicycles』という講演も行った。今回は初めて、カバーする期間をわずか3か月に短縮した。これは、この分野がいかに加速し続けているかをうまく示しており、2025年11月の転換点を考えると適切だと感じた。
(私はさらに、この加速を象徴するために、講演でGemini 3のセーターを着た。それは数週間前に貰ったものだが、Gemini 3.1のおかげでもう時代遅れになっている。)
私はいつも、スタンフォードで学んだSTAR瞬間の原則(Something They'll Always Remember=聴衆が常に覚えているような何かを含めて、講演を際立たせるようにする)に基づき、どんな講演にも少なくとも一つの「仕掛け」を入れるようにしている。
この講演では、仕掛けを二つ用意した。講演の最初の部分は、コード生成エージェントによるKākāpō(フクロウオウム)の繁殖期のデータ分析支援を中心に構成し(その過程で私のマグカップを自慢できた)、その後、自転車に乗るペリカンの新しい事例を手短に紹介し、最後に、講演全体が私が前夜に約45分でバイブコーディングした新しいmacOSアプリを使って行われていたことを明かして締めくくった。
そのアプリは「Present」という名前だ。文字通り、私が最初に思いついた名前である。SwiftとSwiftUIで構築されており、サイズは355KB、圧縮時は76KBだ。Swiftアプリは小さい!
構築は迅速だったかもしれないが、組み合わされた機能セットは私が長年欲しかったものだ。
私は通常、プレゼンテーションにKeynoteを使うが、時々、一連のウェブページを使ってプレゼンすることで変化をつけるのが好きだ。そのためには、ブラウザウィンドウを開き、各ページごとにタブを読み込み、話しながらそれらのタブを順番にクリックしていく。
これはうまく機能するが、非常に恐ろしい欠点がある。ブラウザがクラッシュしたら、デッキ全体を失ってしまうのだ!
私はいつもURLをメモファイルに入れているので、必要ならそこに戻って手動ですべて起動することはできるが、講演の最中に対処したいことではない。
これが私の最初のプロンプトだ:
「各スライドがURLであるプレゼンテーション用のSwiftUIアプリを構築せよ。アプリは、右側にウェブビュー、左側にURLの追加、削除、順序変更のためのUIを持つウィンドウとして起動する。次に、メニューで「再生」をクリックすると、アプリはフルスクリーンになり、左右のキーでURLを切り替えられるようにする」
それが計画を生成した。その計画を実装したトランスクリプトはここで見ることができる。
Presentでは、講演は順序付けられたURLのシーケンスであり、それらのURLを追加、削除、並べ替えるためのサイドバーUIがある。それが編集体験のすべてだ。

メニューで「再生」オプションを選択する(またはCmd+Shift+Pを押す)と、アプリはフルスクリーンモードに切り替わる。左右の矢印キーで前後に移動でき、必要に応じてフォントサイズを上下させたり、ページをスクロールしたりできる。終了時はEscapeキーを押す。
重要なことに、Presentは変更を行うたびにURLを自動的に保存する。アプリがクラッシュしても、再起動してプレゼンテーションの状態を復元できる。
また、プレゼンテーションを.txtファイルとして保存することもできる。
私のスマートフォンによるリモート制御
最初のアプリの動作にはほとんど時間がかからなかったので、もっと野心的にやってみることにした。
プレゼンテーション用のリモコンがあるのはかっこいい…
「0.0.0.0:9123で待ち受けるウェブサーバーを追加せよ。このウェブサーバーは、モバイルフレンドリーな単一ページを提供し、目立つ左右ボタンを配置する。それらのボタンをクリックすると、スライドが左右に切り替わる。また、現在のモードに応じてプレゼンテーションモードを開始または停止するボタンもある。」
私はラップトップとスマートフォンにTailscaleをインストールしている。つまり、両デバイス間のアクセスをWi-Fiネットワークがブロックする心配はない。私のスマートフォンはhttp://100.122.231.116:9123/にアクセスできる。
最終的なインターフェースに到達するまでに、さらに数回の反復プロンプトが必要だった。それは次のような見た目だった:

上部にスライドインジケーター、前後のボタン、大きくて見やすい「開始」ボタン、そしてフォントサイズを調整するボタンがある。
最も複雑な機能は、開始ボタンの隣にある細いバーだ。これはタッチ操作可能なスクロールバーで、指を上下にスライドさせると、現在表示されているウェブページを画面上で上下にスクロールできる。
とても洗練されているとは言えないが、ページが読み込まれた時に最も興味深いコンテンツが折り返し線より下にあるという問題を解決するには十分に機能する。
コードから学ぶこと
私はすでにコードをGitHubにプッシュしていた(「このアプリはバイブコーディングされました…私のマシンでは動きましたが、それ以上の保証はありません!」という大きな免責事項付きで)。その後に、おそらくコードを見るべきだと気づいた。
私はこれを、最近使っているパターンを文書化する機会として利用した。つまり、モデルにコードベース全体の線形ウォークスルーを提示するよう依頼するのだ。使用したプロンプトを含め、進行中の『Agentic Engineering Patterns』ガイドにある、その結果としての『Linear walkthroughs』パターンがこちらだ。
結果として得られたウォークスルー文書は本当に役に立つ。どうやらClaude Codeは、リモコン機能用のウェブサーバーをライブラリなしのソケットプログラミングを使って実装することを決めたらしい!ルーティングに使用した最小限のHTTPパーサーは以下の通り:
private func route(_ raw: String) -> String {
let firstLine = raw.components(separatedBy: "\r\n").first ?? ""
let parts = firstLine.split(separator: " ")
let path = parts.count >= 2 ? String(parts[1]) : "/"
switch path {
case "/next":
state?.goToNext()
return jsonResponse("ok")
case "/prev":
state?.goToPrevious()
return jsonResponse("ok")
このように状態変更にGETリクエストを使用すると、楽しいCSRF脆弱性が生まれる。この特定のアプリケーションでは、私は本当に気にしない。
私たちの視野を広げる
このようなバイブコーディングの話は、今や珍しいものではない。この話を共有する価値があると思う理由はいくつかある:
私が知らない言語であるSwiftは、ここでは絶対に正しい選択だった。ウェブコンテンツを埋め込み、ネットワーク経由で制御可能なフルスクリーンアプリが欲しかった。Swiftには必要なものがすべて揃っていた。
最終的にコードを見た時、それはシンプルで分かりやすく、必要なことを正確に行い、それ以上は何もしなかった。
これは私の実際の問題を解決した。私は常に、プレゼンテーションを一連のページとして提供する良い方法を欲していたが、今まさにそれを手に入れた。
これは、ネイティブMac開発者が時代遅れになったことを意味しない。私は依然として、この結果を得るために自分自身の蓄積された技術的知識(そしてXcodeなどをすでにインストールしていた事実)を大量に使用しており、自分が何をしているか知っている人は、同じ時間でよりはるかに優れたソリューションを構築できただろう。
これは、ソフトウェアエンジニアリングの経験を持つ私たちが、楽しく興味深い方向に視野を広げられることを示す好例だ。私はもうSwiftを恐れていない!次に小さな個人的なmacOSアプリが必要になった時、それは既存のツールセットで達成可能だと分かっている。
最近の記事
Agentic Engineering Patternsについて書く - 2026年2月23日
TIL、リリース、博物館、ツール、研究をブログに追加 - 2026年2月20日
これはSimon Willisonによる『私は夢のmacOSプレゼンテーションアプリをバイブコーディングした』で、2026年2月25日に投稿されました。
前へ: Agentic Engineering Patternsについて書く
月報
月額10ドルでスポンサーになり、その月の最も重要なLLM開発のキュレーションされたメールダイジェストを受け取れ。
少なく送ってもらうために私に支払え!
原文を表示
I vibe coded my dream macOS presentation app Simon Willison’s Weblog
I vibe coded my dream macOS presentation app
25th February 2026
I gave a talk this weekend at Social Science FOO Camp in Mountain View. The event was a classic unconference format where anyone could present a talk without needing to propose it in advance. I grabbed a slot for a talk I titled “The State of LLMs, February 2026 edition”, subtitle “It’s all changed since November!”. I vibe coded a custom macOS app for the presentation the night before.

I’ve written about the last twelve months of development in LLMs in December 2023, December 2024 and December 2025. I also presented The last six months in LLMs, illustrated by pelicans on bicycles at the AI Engineer World’s Fair in June 2025. This was my first time dropping the time covered to just three months, which neatly illustrates how much the space keeps accelerating and felt appropriate given the November 2025 inflection point.
(I further illustrated this acceleration by wearing a Gemini 3 sweater to the talk, which I was given a couple of weeks ago and is already out-of-date thanks to Gemini 3.1.)
I always like to have at least one gimmick in any talk I give, based on the STAR moment principle I learned at Stanford—include Something They’ll Always Remember to try and help your talk stand out.
For this talk I had two gimmicks. I built the first part of the talk around coding agent assisted data analysis of Kākāpō breeding season (which meant I got to show off my mug), then did a quick tour of some new pelicans riding bicycles before ending with the reveal that the entire presentation had been presented using a new macOS app I had vibe coded in ~45 minutes the night before the talk.
The app is called Present—literally the first name I thought of. It’s built using Swift and SwiftUI and weighs in at 355KB, or 76KB compressed. Swift apps are tiny!
It may have been quick to build but the combined set of features is something I’ve wanted for years.
I usually use Keynote for presentations, but sometimes I like to mix things up by presenting using a sequence of web pages. I do this by loading up a browser window with a tab for each page, then clicking through those tabs in turn while I talk.
This works great, but comes with a very scary disadvantage: if the browser crashes I’ve just lost my entire deck!
I always have the URLs in a notes file, so I can click back to that and launch them all manually if I need to, but it’s not something I’d like to deal with in the middle of a talk.
This was my starting prompt:
Build a SwiftUI app for giving presentations where every slide is a URL. The app starts as a window with a webview on the right and a UI on the left for adding, removing and reordering the sequence of URLs. Then you click Play in a menu and the app goes full screen and the left and right keys switch between URLs
That produced a plan. You can see the transcript that implemented that plan here.
In Present a talk is an ordered sequence of URLs, with a sidebar UI for adding, removing and reordering those URLs. That’s the entirety of the editing experience.

When you select the “Play” option in the menu (or hit Cmd+Shift+P) the app switches to full screen mode. Left and right arrow keys navigate back and forth, and you can bump the font size up and down or scroll the page if you need to. Hit Escape when you’re done.
Crucially, Present saves your URLs automatically any time you make a change. If the app crashes you can start it back up again and restore your presentation state.
You can also save presentations as a .txt
Remote controlled via my phone
Getting the initial app working took so little time that I decided to get more ambitious.
It’s neat having a remote control for a presentation...
Add a web server which listens on 0.0.0.0:9123—the web server serves a single mobile-friendly page with prominent left and right buttons—clicking those buttons switches the slide left and right—there is also a button to start presentation mode or stop depending on the mode it is in.
I have Tailscale on my laptop and my phone, which means I don’t have to worry about Wi-Fi networks blocking access between the two devices. My phone can access http://100.122.231.116:9123/
It took a few more iterative prompts to get to the final interface, which looked like this:

There’s a slide indicator at the top, prev and next buttons, a nice big “Start” button and buttons for adjusting the font size.
The most complex feature is that thin bar next to the start button. That’s a touch-enabled scroll bar—you can slide your finger up and down on it to scroll the currently visible web page up and down on the screen.
It’s very clunky but it works just well enough to solve the problem of a page loading with most interesting content below the fold.
Learning from the code
I’d already pushed the code to GitHub (with a big “This app was vibe coded [...] I make no promises other than it worked on my machine!” disclaimer) when I realized I should probably take a look at the code.
I used this as an opportunity to document a recent pattern I’ve been using: asking the model to present a linear walkthrough of the entire codebase. Here’s the resulting Linear walkthroughs pattern in my ongoing Agentic Engineering Patterns guide, including the prompt I used.
The resulting walkthrough document is genuinely useful. It turns out Claude Code decided to implement the web server for the remote control feature using socket programming without a library! Here’s the minimal HTTP parser it used for routing:
private func route(_ raw: String) -> String { let firstLine = raw.components(separatedBy: "\r\n").first ?? "" let parts = firstLine.split(separator: " ") let path = parts.count >= 2 ? String(parts[1]) : "/" switch path { case "/next": state?.goToNext() return jsonResponse("ok") case "/prev": state?.goToPrevious() return jsonResponse("ok")
Using GET requests for state changes like that opens up some fun CSRF vulnerabilities. For this particular application I don’t really care.
Expanding our horizons
Vibe coding stories like this are ten a penny these days. I think this one is worth sharing for a few reasons:
Swift, a language I don’t know, was absolutely the right choice here. I wanted a full screen app that embedded web content and could be controlled over the network. Swift had everything I needed.
When I finally did look at the code it was simple, straightforward and did exactly what I needed and not an inch more.
This solved a real problem for me. I’ve always wanted a good way to serve a presentation as a sequence of pages, and now I have exactly that.
This doesn’t mean native Mac developers are obsolete. I still used a whole bunch of my own accumulated technical knowledge (and the fact that I’d already installed Xcode and the like) to get this result, and someone who knew what they were doing could have built a far better solution in the same amount of time.
It’s a neat illustration of how those of us with software engineering experience can expand our horizons in fun and interesting directions. I’m no longer afraid of Swift! Next time I need a small, personal macOS app I know that it’s achievable with our existing set of tools.
More recent articles
Writing about Agentic Engineering Patterns - 23rd February 2026
Adding TILs, releases, museums, tools and research to my blog - 20th February 2026
This is I vibe coded my dream macOS presentation app by Simon Willison, posted on 25th February 2026.
Previous: Writing about Agentic Engineering Patterns
Monthly briefing
Sponsor me for $10/month and get a curated email digest of the month's most important LLM developments.
Pay me to send you less!
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み