Groselia

ひとりでに回るソーシャルメディア

担当

共同創業者
エンジニアリング
プロダクトとブランドのデザイン

概要

Groseliaは、まずテック系スタートアップの、そしてほかの業界や規模の企業のソーシャルメディアも運用しています。戦略、デザイン、投稿、コメント返信、レポートまで、すべてのチャンネルをひとつのプラットフォームで。

チーム

Danilo Parmegiani共同創業者
Pedro Critchi共同創業者

背景

GroseliaはPedroと2人で始めました。彼はマーケティング、営業、オペレーションを担当し、私はブランドとプロダクトをデザインして、その土台となるプラットフォームをデータベースから最後のアニメーションまでつくりました。セルフサーブだった時期には200人以上が登録して使ってくれて、いまはお客さんのコンテンツとソーシャルメディアを動かしています。2026年6月には、私の母校Link School of BusinessのアクセラレーターLink Vectorから、R$100kのプレシードを調達しました。そしてサービスへのピボットから2か月で、Groseliaの売上は月R$15,000を超えています。

ツール

Codex
Claude Code
Figma
Adobe tools

技術スタック

  • React
  • Next.js
  • TypeScript
  • Tailwind
  • Supabase
  • Frontier LLMs
  • Trigger.dev
  • Stripe
  • Vercel

期間

2025年〜現在

数字で見る

R$180k+
年間売上ランレート
200+
作成されたアカウント
350
設定されたブランド
9,700+
commits
520+
プルリクエスト
47
Edge Functions

課題

つくることはボトルネックではなくなった。見つけてもらうことが、新しいボトルネックになった。

AIはソフトウェアをつくるコストを一気に下げました。エンジニアリングの経験がない創業者でも、いまは週末でプロダクトをリリースできます。そしてそれは、ほかの誰もが同じです。安くならなかったのは、誰かに気づいてもらうこと。ディストリビューションはタスクではなく、終わりのない運用です。毎日投稿し、それぞれ違う形式を求める8つのネットワークに対応し、すべてのコメントに返信し、アプリごとにバラバラに報告される数字を読み解く。

スタートアップはその代償を、3つのうちどれかで払います。まだ雇う余裕のないチームを雇うか、一部分しか解決しないツールを十数個つなぎ合わせるか、何も投稿せずに成長で払うか。Groseliaは、4つ目の選択肢になるために存在しています。

ここまでの道のり

Groseliaは、いまの姿にたどり着くまでに4回形を変えました。そのたびに、うまくいったものを残し、それ以外を手放してきました。

  1. 2025年末〜2026年2月

    Argibee

    AIでブランドデザインをするプラットフォーム。2025年末にプロトタイプとして始まり、2026年2月に正式な会社になりました。市場は見つかりませんでしたが、そのブランドキットのエンジンは、その後のすべての背骨になりました。

  2. 2026年4月

    モーション動画

    Groseliaは、After EffectsのテンプレートでつくるApple風のローンチ動画から始まりました。パイプライン全体を手作業で検証し、そして求める品質にはスケールできないとわかりました。

  3. 2026年6月

    Link Vectorからプレシード

    Link School of BusinessのStartup Schoolに参加しました。創業者のための100日間のプログラムで、リアリティ番組として撮影されています(シーズンを見る)。最後はデモデイで、私がステージでGroseliaをピッチし、そしてプレシードを調達しました。私の母校Link School of BusinessのアクセラレーターLink Vectorから、R$100kの出資です。

    デモデイでの私のピッチ
  4. 2026年8月

    マーケティング版のLovable

    フォームの代わりにひとつの会話。キャンペーンを説明すれば、Groseliaが計画し、書き、公開します。ボットの集まりではなく、ツールを持つひとつのチャットエージェント。

  5. 2026年9月

    ソーシャルメディアマネージャー

    お客さんはAIにコンテンツをつくってほしいわけではありませんでした。自分の写真をうまく投稿して、コメントに返信してほしかったのです。私たちは生成をやめ、チャンネルの運用を深く掘り下げました。

  6. 現在

    サービス・アズ・ア・ソフトウェア

    売るのはツールではなく仕事です。私たちのチームがプラットフォームで各お客さんのソーシャルメディアを運用していて、そのおかげで、かつては代理店が必要だった仕事をひとりで回せます。

つくる過程を公開

私たちは最初から、つくる過程を公開してきました。まだArgibeeだったころからYouTubeで歩みを共有していて、Argibeeのウェイトリスト公開から、Groseliaを初めて見せた動画まであります。その先の物語は、動画ごとにチャンネルで見られます.

Argibeeのウェイトリスト公開
Groseliaを初めて見せた動画

ブランド

Groseliaのブランドは大胆にしたいと思っていました。ウェブサイトでも、アプリでも、ソーシャルメディアのどの投稿でも、思わず足を止めて見てしまうようなもの。どこで出会っても、驚かせて、少し憧れてもらって、いま見たもののおかげで私たちに頼みたくなる。何よりも、私たちが属するエコシステムであり、最初のお客さんでもあるテック系スタートアップの目に、最高にかっこよく映る必要がありました。

ブランドはすべてCodexの中のFigmaプラグインを使ってデザインしました。ロゴ、タイポグラフィとシンボルを正しい比率で組み合わせる方法、イメージ、SVGアイコンライブラリ、文字スタイル、整理されたカラーパレット。どの判断も寸法つきで1枚のボードにまとめ、比べたり議論したりできるようにしました。

FigmaのGroseliaファイルの横に並ぶCodex: ロゴシステム、各背景色の上のロゴ、パレット全体に置いたシンボル、カラーパレット
Codexの中のFigmaプラグインを使って、Figmaでつくったブランドボード。

シンボル

シンボルは最初にあり、そのまま残りました。中心のまわりを回る3枚のやわらかな花びら。会社のいちばん最初のバージョンから受け継いだもので、新しいロゴはその上に描き直すのではなく、そのまわりに組み立てました。形状はコピーして拡大縮小しただけで、一度も描き直していません。

ワードマーク

ワードマークはTT Commons Pro Boldの小文字で、どこでも同じように表示されるようアウトライン化しています。標準の字間ではシンボルの隣でゆるく見えたので、160pxで各文字を左に6.4ユニットずつ詰め、−4%のトラッキングにしました。小さな変化に聞こえますが、単語の幅が564から520ユニットになり、ひとつの形として読めるようになりました。

Hのグリッド

すべてはH、つまりワードマークの見た目の高さで測り、H/10のグリッドに乗せています。これでロゴを拡大縮小するときに、誰かが目分量で合わせ直す必要がなくなります。

縦組みのロゴでは、シンボルのサイズ3種(1.50H、1.75H、2.00H)と間隔2種(0.15H、0.25H)を組み合わせて6案を描き、B: 1.75Hのシンボルを、文字の0.15H上にを選びました。横組みでは0.20Hから0.35Hまでの間隔を比べ、1.10Hのシンボルと0.35Hの間隔に決めました。

1.75H0.15HH

作図グリッド上の縦組みロゴ。Hはワードマークの高さで、グリッドはH/10です。

Groseliaの横組みロゴ

横組み

シンボル 1.10H · 間隔 0.35H

Groseliaの縦組みロゴ

縦組み

シンボル 1.75H · 間隔 0.15H

Groseliaのシンボルロゴ

シンボル

元の比率、0.93 : 1

Colour

The palette is fifteen colours, loud on purpose. But the logo only ever comes in four treatments: blue symbol with black text, blue with white, all black and all white. The other colours are grounds, never the symbol.

To prove that, I put the symbol and both lockups on twelve backgrounds, 24 studies each, and kept the ones where its silhouette survives. On blue grounds the symbol goes monochrome. Click a colour to copy it.

タイポグラフィ

TT Commons Proはすべてをこなします。LightからExtraBoldまでの6ウェイト、12pxから96pxまでの11段階のスケール、そして本物のイタリック。ファイル内の688個のテキストレイヤーをすべてこの書体に移行したので、ブランドブックもアプリもウェブサイトも、いまはひとつの声で話しています。

メインフォント

TT Commons
Pro

TT Commons Proディスプレイ · 01
→Groselia@
Reels → Posts
Nº 128⅝ e

アプリアイコン

アプリアイコンは、ブランドが唯一3Dになる場所です。磁器のようなシンボルを重ね、上から光を当てて、少しだけ艶を出しています。のちのリニューアルで、タイルの中で余白が生まれるよう中のシンボルを10%小さくしました。ワードマークと組み合わせた専用のロックアップもあり、タイルは1.5Hです。

Groseliaのアプリアイコン

3Dオブジェクトの世界

ロゴのまわりには、3Dオブジェクトたちが暮らしています。ぎょろ目のついたハート、吹き出し、ハッシュタグ、キラキラ。ウェブサイトや投稿でブランドの声になる存在で、じっとしていることはありません。ふわふわ浮かび、サイトではカーソルに反応します。ここにいる子たちも同じです。押してみたり、ひとつ引っぱって離してみたりしてください。

Neo ドゥードゥル

フラットなものにはすべて、私たちのアイコンセットNeoを使います。太い黒の輪郭、パレットからの塗り、白いハイライトをひとつ。ウェブサイトでは、どれも白いチップに入ったシンプルな線のアイコンから始まり、カーソルを合わせると落書きに変わります。パーツがひとつずつ現れて、円がぽんと出て、棒が落ちてきて、ハイライトが描かれる。ウェブサイトの落書きとアニメーションをそのまま持ってきました。ひとつ触ってみてください。

公式の連携
おまかせ
いつでも一時停止
すべて記録
データは非公開のまま
いつでも解約
あなたらしい返信
人によるレビュー
見込み客をお知らせ
有料広告
ランディングページ
プロダクトのリデザイン
リブランディング
スパーク
ハート
トロフィー

プロダクト

Groseliaでは、すべてをひとつのチャットに打ち込むだけで済みます。何をいつ出すかを書けば、予約し、公開し、コメントに返信し、何がうまくいったかを教えてくれます。仕事は、操作すべき十数個の画面ではなく、オーナーが承認するひとつのプランとして届きます。

ダッシュボードではなく、会話

先週はどうだった?

6月以来のベストウィークです。

  • リーチが38%増加。けん引したのはラテアートのリールです(Instagramで4.1万回、TikTokで6.4万回再生)。
  • エスプレッソのカルーセルで保存数が倍に。みんなレシピは取っておくんですね。
  • 返信待ちのコメントがあります。配送と挽き目についての質問が14件、ほとんどが未返信です。

パターンははっきりしています。動画は17時〜19時、写真は朝。この先2週間はこれでいきたいと思います。

2日前

おはようございます!今週は対応してほしいことが2つあります。

  • Carmo de Minasの新しい収穫が金曜に店頭に並びますが、まだ何も予定が入っていません。
  • 14件の質問が投稿に届いていて、ほとんどが配送についてです。

どちらから始めますか?

1つ選択
8分前

Groseliaは最初フォームでした。目標を選んで、項目を埋めて、キャンペーンを受け取る。でも自分のビジネスについてのフォームを埋めたい人はいません。だからいまは、どのブランドにもひとつの会話があります。

ブランドを開いて、打ち込むだけ。今週何を投稿すべきか聞いたり、スマホの写真を放り込んだり、「昨日のコメントに返信して」と書いたり。エージェントは答える前に確認します。カレンダー、これまでの成果、ブランドのメモリーを。

何か必要なときは、タップで答えられる短い質問を一度だけ投げます。そしてひとつのプランを提案します。日時つきの投稿、返信、変更点。好きなところを編集して承認すれば、カレンダーが埋まっていくのを眺められます。

ここにあるカードは本物のチャットを、アプリ自身のトークンを使ってブラウザで再現したものです。どうぞ使ってみてください。

2回デザインした: まずオーナーのために、次に自分たちのために

最初のユーザーは、自分でソーシャルメディアを運用する小さなお店のオーナーでした。キャンペーンやファネルや投稿頻度で考えるのではなく、「今週何を投稿しよう?」と考える人たちです。だから難しかったのは、仕組みを隠すこと。4つの質問で終わるオンボーディング、リンクひとつで埋まるブランドキット、ドラッグできるカレンダー、17言語に対応してスマホでも使えるすべての画面。

そのあと、お客さんはどんなにシンプルでもツールを操作したくはないのだと知りました。仕事を終わらせてほしかったのです。だから私たち自身がメインユーザーになりました。チームのひとりがたくさんのブランドを回すので、同じアプリに、複数ブランドのワークスペース、ミーティングで始まりレポートで終わるサイクル、すべての投稿への承認ステップ、全ネットワークをまとめた受信箱が必要になりました。お客さんもいまもログインしますが、アプリは仕事をする場所ではなく、仕事を見守る場所になりました。

2026年11月

月
103
火
113
水
123
木
133
金
143
土
152
日
162
8:00

相場より40%高く払う理由

インポート済み
6
新しい収穫
49:00

新しい収穫: Carmo de Minas

公開済み
5
舞台裏
17:30

POV: 焙煎所での初めてのシフト

公開済み
レシピ
9:00

エスプレッソの調整方法

公開済み
12:00

深煎りについて、あえて言います

公開済み
失敗
舞台裏
1218:00

常連さんの注文を採点

公開済み
8:30

クロワッサンの時間

予約済み
3
採用
11:00

ヘッドバリスタのAnaを紹介

手動
レシピ新しい収穫+1
17:00

スローモーションのラテアート

予約済み
9:00

生豆1kgが何になるか

予約済み
7
舞台裏
11:00

焙煎所の中、最初から最後まで

予約済み
レシピ
18:30

60秒でわかるコールドブリュー

下書き
動画が必要
新しい収穫プロモ
9:00

新しい収穫、店頭に並びました

予約済み
下書き
採用
10:00

ヘッドロースター募集中

予約済み
17:00

アイスラテ、最初から最後まで

下書き
プロモ
10:00

あなたの土曜の食卓

予約済み
15:00

エスプレッソトニックの季節到来

下書き
レシピ
11:00

4分でできるハンドドリップガイド

予約済み
プロモ
18:00

Oaklineの袋を紹介

下書き
4

エージェントに読まれるためにつくる

ブランドやウェブページを最初に読むのは、どんどんAIになっています。だからGroseliaのすべては、人と同じくらいエージェントのために書かれています。ブランドのメモリーはシンプルなMarkdownドキュメントの集まりで、好み、やること・やらないこと、ブランドの事実が書かれています。エージェントは返信のたびにそれを読み、AIアシスタントが自分の記憶を管理するのと同じように、4つのツールで自ら編集します。人もブランドキットの中で、まったく同じドキュメントを開いて編集します。

インサイトは、ダッシュボードとエージェントの両方が読むひとつの共有コアを通るので、「何がうまくいってる?」と聞けば、答えはあなたが見ている数字から返ってきます。ウェブサイトも、人が私たちについて質問するアシスタントのために同じことをしています。groselia.comはllms.txt、もっと長いllms-full.txt、比較ファイルを配信していて、すべてコードの中のひとつの事実ソースから生成されます。だから、AIが私たちの料金やセキュリティについて言うことが、サイトとずれることはありません。

エンゲージメントの推移

週ごと、過去30日間、公開日別

エンゲージメント率7.69%

主な機能

  • リンクひとつでブランドキット

    ウェブサイトを貼りつけて、アカウントを連携するだけ。Groseliaがサイトを読み取り、過去の投稿を読んで、ロゴ、カラー、フォント、トーン、オーディエンスを自動で埋めます。

  • ひとつの会話

    41個のツールを持つAIエージェントが、メディアにキャプションをつけ、あなた自身のエンゲージメントデータから時間を選び、指標を読み、返信の下書きを書いて、すべてをひとつのプランにまとめます。

  • 8つのネットワークのためのカレンダー

    Instagram、LinkedIn、TikTok、YouTube、X、Facebook、Threads、Reddit。それぞれのネイティブな形式で。過去の投稿も取り込むので、カレンダーが空になることはありません。

  • すべてのコメントに返信

    すべてのネットワークのコメントとDMをひとつの受信箱に。返信はブランドのトーンで下書きされ、デリケートなものは人が対応するまで保留されます。

  • わかりやすい言葉のインサイト

    すべてのアカウントのリーチ、再生数、エンゲージメント。各プラットフォームが何を報告し、何を報告しないかに正直で、「何がうまくいってる?」にも答えます。

  • サイクルと承認

    仕事はサイクルで回ります。それぞれミーティングで始まり、AIが数字から書くレポートで締めくくられ、どの投稿もお客さんの承認を待つことができます。

AIエージェントと一緒につくる

GroseliaはAIエージェントをエンジニアリングチームにしてつくりました。CodexとClaude Codeがコードを書き、変更はそれぞれ専用のブランチで。私はデザインし、すべてのプルリクエストをレビューし、何をリリースするかを決めました。

プロンプトのほとんどは、タイプせずにWispr Flowで話して入力しました。いいプロンプトは長くて細かい指示書です。話せば、考えるのと同じ速さでそれを渡せました。

  • Codex

    コーディングエージェント

  • Claude Code

    コーディングエージェント

  • Wispr Flow

    音声入力

ウェブサイト

ウェブサイトは、ブランドがいちばん声を張る場所です。Next.jsでデザインして開発しました。17言語に対応していて、登録するときには訪問者の言語をそのままアプリに引き継ぎます。

遊べるヒーロー

ページを読み込むあいだにロゴが回り込み、そしてヒーロー。ふわふわ浮かび、マウスに合わせて傾き、カーソルに押しのけられる3Dの小道具たち。スクロールシーンの最後は「Made for you」で終わります。

groselia.com
groselia.comのヒーロー: 「We run your socials. You run your business.」、ハートのまわりに3Dの小道具

本物のアプリを再現

「Inside your Groselia」では、アプリ自身の画面をコードで再現し、デモブランドを使ってプラットフォームをありのままに見せています。

groselia.com
「Inside your Groselia」: プラットフォームのチャンネル連携画面

ブログ

ソーシャルメディア運用についてのメモ。記事はシンプルなMDXファイルで、言語ごとに1つ、CMSはなし。それぞれに専用のフィードと構造化データがあるので、検索エンジンもAIアシスタントも正しく読めます。

groselia.com
groselia.comのブログ。カーソルの下で最初の記事が浮かび上がり、その下にほかの記事

見込み客を見極めるフォーム

どの「Book a call」も、カレンダーの前に短いフォームを開きます。あなたは誰か、どこに投稿しているか、何が必要か、予算はいくらか。各ステップは入力するたびにデータベースに保存されるので、途中までの回答も見られます。最後まで終わると、Slackでチームに通知が届きます。

groselia.com
予約ページ: 「Let's talk about your social media.」、3つのステップの横にフォーム

いつでもレスポンシブ

どのページも、ただ縮めて収めるのではなく、スマホのためにもデザインしています。ホバーがない環境では、セクションは画面の中央に来たときに目を覚まします。

スマホで見たホームページ
スマホで見た「Always in sync with your team」、最初のカードが動き出したところ
スマホで見た予約フォーム。必要なものと月の予算を聞くステップ

エンジニアリング

アーキテクチャ

プラットフォームはAIを相棒にして自分でつくりました。アプリはReactとVite、ランディングはNext.js、どちらもひとつのSupabaseプロジェクトの上にあります。行レベルセキュリティつきのPostgres、認証、リアルタイム、ストレージ、そして47個のEdge Functions。時間のかかる処理や定期実行はTrigger.devで動き、ソーシャルネットワークはひとつの投稿APIを通り、Stripeがプラン、カード、ブラジルのボレートを扱います。

MCPサーバーとCodexプラグインもあるので、AIエージェントの中からGroseliaを使えます。同じブランド、投稿、下書きを、ツールとして。

使われる場所

コア

Supabase

その裏側

アプリ、ウェブサイト、MCPサーバーはVercelでホストしています。

ボックスにカーソルを合わせるかタップすると、役割とつながる先が表示されます。

投稿がたどる道のり

パーツがどうかみ合うかを知るいちばんの方法は、ひとつの投稿を追いかけること。チャットの一文から、インサイトに並ぶ数字まで。ステップをクリックして進めるか、そのまま再生してください。

Webアプリ

オーナーが頼む

「収穫の写真を金曜にInstagramとLinkedInに投稿して」。メッセージはエージェントのEdge Functionに届き、答えがストリーミングで返ってきます。

ReactSSEストリーム

エージェント

エージェントは、Anthropic、OpenAIなどのプロバイダーが提供する市場最高のモデルで動いていて、ツールループを持つひとつのストリーミングEdge Functionとして実装しています。モデルには独自のツールが41個に加えて、ウェブ検索とウェブ取得があり、1ターンで最大8ホップ。難しかったのはモデルではなく、エージェントが「いま何が本当か」を常に知っているようにすることでした。

そこで毎ターン、モデルがメッセージを見る前に、関数がデータベースからコンテキストを組み直します。オーナーのタイムゾーンでの日付と時刻、ブランドのメモリードキュメント、ライブカレンダー、進行中のプラン、アップロードされたドキュメント、古いメッセージの要約。プロンプトの安定した部分は1時間キャッシュしますが、この部分は決してキャッシュしないので、古くなることがありません。

残りは2つのルールで形づくられました。公開されるものや取り消せないものは、そのまま出さず、必ずオーナーが承認するプランに入れること。そして、投稿はそのターンにツールが作成したときだけ存在すること。これで、エージェントがやっていない作業を説明してしまう日々が終わりました。エージェントはひとつのモデルに縛られてもいません。小さくて安いモデルが十分よくなったときに、会話あたりのコストを下げるため、チャットをそちらに移しました。

毎ターン組み直すコンテキスト

指示とツール1時間キャッシュ
日付と時刻オーナーのタイムゾーン
メモリードキュメント好み、やること・やらないこと
ライブカレンダーすべての投稿とそのステータス
進行中のプラン提案済みと承認済み
これまでの流れ随時更新される要約
→LLMトップモデル · 最大8ホップ→

ツール呼び出し

✓get_posting_times
✓get_insights
✓propose_plan

承認待ちのプラン

収穫ウィーク: 投稿3件、返信4件

エージェントがコンテキストを組み立てるところ
// Volatile block: time + memory + live calendar + active plans + rolling summary.
// Rebuilt each turn (never cached) so the agent always sees current state.
const volatileSystem = () => {
  const parts = [
    nowBlock,
    renderMemories(memories),
    renderCalendar(calendar, todayISO),
    renderPlans(plans),
  ]
  if (documents.length) parts.push(renderDocuments(documents))
  if (rollingSummary) parts.push(`STORY SO FAR (summary of earlier messages in THIS conversation):\n${rollingSummary}`)
  // … then a line for each of the brand's other conversations
  return parts.join('\n\n')
}

データモデル

テーブルはおよそ55個で、いくつかのはっきりしたグループに分かれています。ワークスペースにはメンバーとブランドがあり、それ以外はすべてブランドにぶら下がるので、行レベルセキュリティはどこでもひとつの問いに答えればいい。この人はこのブランドのメンバーか?

誰が

  • ワークスペース
  • メンバー
  • ブランドのロール
  • プロフィール

ブランド

  • ブランド
  • カラー、フォント、ロゴ
  • プロダクトと人物
  • メモリードキュメント
  • ブランドドキュメント

チャット

  • 会話
  • メッセージ
  • プラン
  • プランの項目

カレンダー

  • 投稿
  • ネットワークごとに1件
  • 投稿の指標
  • 投稿のコメント

チャンネル

  • 連携アカウント
  • アカウントの日次指標
  • チャンネル設定

受信箱とサイクル

  • 受信箱のスレッド
  • 受信箱のメッセージ
  • 返信の下書き
  • サイクル
  • サイクルレポート

「誰が」より下のものはすべてブランドIDを持ち、行レベルセキュリティが読み書きのたびにそれを確認します。

信頼性とセキュリティ

Groseliaは本物のアカウントに投稿します。だから痛い失敗は、投稿が2回出てしまうことか、気づかないうちに投稿が出ないこと。エンジニアリングのほとんどはそこに注いでいます。

12回承認しても実行は1回

プランランナーは条件付き更新でまずプランを、次に各項目を確保し、冪等キーはすべて項目自身のIDから生成します。ダブルクリックやリトライは、再投稿ではなく再生になります。

2Webhookは署名つきで、再生される

投稿APIからの配信には、すべて有効なHMAC署名が必要です。配信は複数回届くことがあるのでハンドラーは冪等にしてあり、取りこぼしたイベントは10分ごとにジョブが再生します。

3キューに入れる前に拒否する

共有のルールファイルひとつに、各ネットワークが受け付けるものを書いています(Instagramはメディア必須、YouTubeは動画必須、Facebookは混在不可)。スケジューラーはキューに入れる前にそれを確認し、拒否された投稿は、カレンダーに「予約済み」のまま残るのではなく、理由つきで「失敗」として戻ってきます。

4呼び出しのたびにアクセスを確認

Postgresの行レベルセキュリティ、すべてのEdge Functionでのロール確認、そしてPKCEつきOAuthによるMCPアクセス。ブランドごと、操作ごとにスコープを絞り、1ページから取り消せます。

しばらくのあいだ、ローカルのアプリと本番のアプリがひとつの本番データベースを共有していて、デプロイより先に走ったマイグレーションが、本番のBrand Kitsページを空にしてしまったことがあります。それ以来、バックエンドの作業はまずSupabaseのブランチで行い、それを必要とするコードと一緒に本番へマージしています。

品質とワークフロー

140個のテストファイルにわたる約1,000件のテストケースが、アプリ、MCPサーバー、Edge Functionsをカバーしています。一度壊れたことがあるから存在するチェックもあります。17言語のどれかでキーが欠けるとビルドを落とすパリティテストや、合成データで動いて最後にロールバックするMCPのデータベーステストなどです。

エージェントには専用の評価もあります。ブランドのパフォーマンスについて決まった質問を、毎回新しい会話で本番のエージェントに投げ、正しい期間でインサイトを読んだか、答えにインサイトのページと同じ数字が入っているかを確認します。

AIエージェントをチームのように扱うことで、ひとりで520件以上のプルリクエストをリリースしました。変更はそれぞれ専用のgit worktreeの中の専用ブランチで行うので、Claude CodeとCodexはお互いの邪魔をせずに複数の作業を同時に進められます。それぞれがテストと型チェックを走らせ、小さなプルリクエストを開き、私が読むまでは何もマージされません。

ひとつの変更→専用のworktree→Claude CodeかCodex→テストと型→小さなPR→私のレビュー→マージしてデプロイ

技術的な課題

どれもUIのバグに見えて、実はもっと深いところに原因がありました。ストリームの形、タイムスタンプ、ネットワークが実際に報告するもの、そして時計。

生成をライブに感じさせる · リアルタイム

1か月分の投稿を生成すると、スピナーが回ったあとに12件の投稿が一気に出てきました。遅く感じましたが、問題はモデルではなく、粒度でした。

モデルの出力をJSON Linesに切り替えてストリーミングし、1行が閉じた瞬間にその投稿を挿入するようにしました。カレンダーはSupabase RealtimeでPostgresの変更を購読し、先にプレースホルダーを描くので、投稿が1件ずつ自分で入力されていくように見えます。

同じ待ち時間が、いまは誰かが作業しているのを眺めているように感じられます。

一致しない2つのタイムスタンプ · データ

Supabaseから、データベースのディスクIOが尽きそうだと警告が来ました。読み込みは問題なし。何かが同じ行を書き直し続けていて、8.3万件のメッセージを保存するのに34.4万回のinsertが走っていました。

受信箱の同期は、保存したタイムスタンプと読み戻したものを比べていました。Postgresは+00:00で返し、私たちはZで書いていたので、すべての会話が変更されたように見え、毎回の巡回で再ダウンロードされていたのです。文字列ではなく時刻そのものを比べることで直りました。

2つのタイムスタンプを比べる
export function sameInstant(a: string | null | undefined, b: string | null | undefined): boolean {
  if (a == null && b == null) return true;
  if (a == null || b == null) return false;
  if (a === b) return true;
  const ta = Date.parse(a);
  const tb = Date.parse(b);
  return Number.isFinite(ta) && Number.isFinite(tb) && ta === tb;
}

8.3万件のメッセージ保存に必要なinsert

34.4万→新着メッセージ1件につき1回

巡回ごとに読み直す会話

すべて→変わったものだけ

無駄な書き込みが止まり、ずっと終わらなかった受信箱の履歴が初めて同期を終えました。

ゼロが常にゼロとは限らない · 分析

分析プロバイダーはどのネットワークでも同じ形式で返し、ネットワークが報告しない項目は0で埋めます。Instagramはすべての投稿でクリックが0「でした」。グラフは礼儀正しく嘘をついていました。

プラットフォームごとの指標レジストリをつくり、各ネットワークが実際に報告するものを記録して、それ以外は取り込み時にnullに。どのグラフも、指標を正直に表示したり、控えめにしたり、隠したりできるようにしました。

8つのネットワークにまたがるインサイトで、誰も測っていない数字は決して表示されません。

進んだ時計にログアウトさせられる · 認証

共同創業者が、サインインした瞬間にログアウトされていました。1秒に15回のトークン更新、そしてレート制限。ほかの誰にも再現できませんでした。

彼のパソコンの時計が1時間以上進んでいて、発行したてのトークンがすべて期限切れに見えていたのです。セッションストレージをラップして、セッションを書き込むときに有効期限をローカルの時計に合わせ直すようにしました。

1秒あたりのトークン更新

15→0

どんな端末の時計でもサインインでき、時計がずれているとコンソールが教えてくれます。

学び

センスこそが堀になる

AIでつくるコストが下がれば、誰でもリリースできるようになり、そのほとんどは似たようなものになります。それでも希少なのは判断力です。何を削るか、画面がどう感じられるべきか、どのアニメーションがひとつ多すぎるか。資金力で誰にも勝てない2人のチームにとって、センスこそがGroseliaをずっと大きな何かのように見せ、動かしてくれるもの。そしてそれは、私が決してモデルに任せない部分です。

売るのはツールではなく成果

どんなに優れていても、マーケティングソフトを操作したい人はいませんでした。みんな、見てもらいたかったのです。アプリではなく仕事そのものを売ることで、プロダクトの重要性はむしろ増しました。毎日動かすエンジンになったので、粗いところはすべて直されていきました。

賢さよりコンテキスト

エージェントがよくなったのは、プロンプトが賢くなったときではなく、知っていることが増えたときでした。毎ターン、ライブカレンダー、メモリー、進行中のプランを渡し、行動する前に確認させる。それがどんなモデルのアップグレードよりも効きました。

AIはチームの大きさを変える

エージェントがコードの大部分を並行して書くようになって、私の仕事は、何をつくるかを決め、すべての変更をレビューし、基準を高く保つことに移りました。いまはひとりで、かつてはチームが必要だったものを回せます。その人が編集者であり続ける限りは。

次のプロジェクト

すべてのプロジェクト