本文へ移動
cutty.dev
All posts

cutty.dev のテクノロジースタック — 意識的な選択

cutty.dev の中身は何で、それはなぜなのか。宣伝はいらない。哲学:退屈で安定したスタック、EU圏内のホスティング、そして一人で運用可能な、設計段階から組み込まれたプライバシー。

「私のテックスタック」という投稿のほとんどは、最新技術を自慢するためのリストです。「見て、これを持っていて、あれも持っている、そしてここには先週リリースされたばかりのライブラリもある」といった具合です。これは他とは違うはずです。

真実はこうです。プロジェクトを一人で進めているとき、一番流行っているものを探しているわけではありません。夜中の3時に目が覚めてしまうようなものではなく、自分を安眠させてくれるものを探しているのです。cutty.devのテクノロジースタックが目指しているのは、まさにそこです。流行よりも退屈なものを、アメリカ流よりもヨーロッパ流を、根本からプライベートなものを、そして一人の手でも扱えるほどシンプルなものを。

コーヒーでも飲みながら説明しているかのように、順番に説明していきます。

サーバー側でレンダリングされるAstro(そして、なぜ「もっと何か良いもの」ではないのか)

cutty.dev は、サーバーサイドレンダリングを行う Astro です。すべてのリクエストはサーバーを経由し、ページを組み立てて、完成した HTML を返します。退屈? まさにそれが狙いです。

私が求めていたのは3つのことでした:重い仕組みを必要としないサーバーサイドレンダリング、すぐに使えるしっかりとした多言語サポート、そしてオーバーヘッドのないスピードです。Astroはこれらすべてを提供し、コードの可読性も維持されます。2ヶ月のブランクを経て戻ってきても、何が起きているのかすぐに理解できます。ソロプロジェクトにおいて、これは1年後には誰もサポートしていないような、いかなる流行のプラグインよりも価値があります。

花火のデータベースの代わりに、たった一つのファイル

SQLite。1つのデータベース、ディスク上の1つのファイル。さらにTypeScriptと対話するクエリレイヤーがあるため、データ構造を変更した際、エラーは深夜のプロダクション環境ではなく、エディタ上で発生します。

なぜこれなのですか? cutty は「read-heavy」です。誰かが短縮リンクをクリックすると、読み取りを行い、カウンターをインクリメントします。それだけです。SQLite は、一日の非常に大きな数値に至るまで、このようなトラフィックを余裕で処理できます。バックアップは? ファイルをコピーするだけです。終了です。レプリケーションの儀式も、誰も使い方が覚えていないようなスクリプトも必要ありません。

ここで一つ注意すべき点があります。これはよくある罠です。「SQLite」と聞くと、「単位を取るためのプロジェクト用の玩具」だと思ってしまう人がいます。しかし、それは間違いです。可動部品が少ないということは、壊れる可能性のある要素が少ないということです。これは品質を妥協しているのではなく、意識的な決定なのです。

サーバーはヨーロッパにあり、それは偶然ではありません

EU内の専用サーバー。独自のTLS、自動HTTPSを備えたリバースプロキシ、コンテナ化されたアプリケーション。

これは、cuttyがどのようにデータを扱うかの基盤です。データが物理的にどこに保存されているかを正確に把握しています(EUのクライアントやGDPRにおいては、これは単なる興味関心ではなく、必須条件です)。特定のプロバイダーに縛られることもなく、データが自動的に海外へ流出することもありません。また、コストはトラフィックに合わせて変動するのではなく、予測可能です。

はい、西側の便利なプラットフォームを使えば、より素早くスタートできたでしょう。クリックして、デプロイすれば、動く。ただ、その代償として、ユーザーのデータがどこに保存されるかという問題を抱えることになります。私にとって、それは悪い取引でした。

翻訳は自分自身でモデルを作成し、ローカルで行う


cuttyは25か国語を話します。これは、私のインフラストラクチャ上で動作するローカルなオープンソースAIモデルによって翻訳されます。インターフェースからのテキストを外部のプロバイダーに送信することはありません。

メリットは実用的です。単一の翻訳にかかるコストはゼロです。品質を完全にコントロールでき、いつでも更新できます。それに、機械には常に人間の目が必要なので、これら25の言語のすべてがレビュー済みです。しかし、自分自身で行っているという事実は、プライバシーが料金表の項目ではないことを意味します。それは、システム全体がどのように構築されているかという特性なのです。

Tailwind、コンテナ、そしていくつかの小さな決定事項

スタイル?Utility-first、つまりTailwindです。CSS-in-JSも、個別のスタイルファイルもなし、すべてはテンプレート内に直接記述します。クラス名の考案に時間を浪費することはありませんし、使われていないスタイルが最終的なページに残ることもありません。そして、システム自体が整合性を強制するため、デザインは一貫性を保てます。一人で作業する場合、些細なことに費やされない一分一秒が重要なのです。

これはDockerによるデプロイメントです。ローカル環境と本番環境を同一にできるため、「自分の環境では動いた」という問題はもう終わりです。そして、もし必要になれば、30分ほどで全てを別のサーバーへ移行できます。ポータビリティ(移植性)とは、静かな形での独立性なのです。

学んだこと

退屈なスタックが勝つ。Astro、SQLite、Tailwind、コンテナ。すべてが成熟しており、使い古され、解説されている。最も必要とされる瞬間に、壊れることはない。

EUでのホスティングは、本当に本番環境に耐えうる準備ができています。「本格的なものを作るなら、巨大なアメリカのクラウドを使わなければならない」というのは、ただの迷信です。ローカルAIも現実的であり、まともな翻訳を得るために外部APIにデータを渡す必要はありません。そして最後に:一人の人間でも、チーム全体の仕事のように見える成果物を出すことができます。ただし、時間は金よりも貴重であることを忘れず、その観点からあらゆる要素を選択する必要があります。

自分のものを作り上げる際、それぞれのテクノロジーに対して一つの質問を自分に投げかけてみてください。それは、「1年後、自分一人でこれをメンテナンスできるだろうか?」という問いです。もし答えが「いいえ」であれば、おそらく答えは出ているはずです。

すべてはこちらで動作します: cutty.dev。もしこれらの決定について話したい場合は、[email protected] までご連絡ください。当日中に返信します。