Motivation
Corelive はまだ「使い物にならない」最大要因が 既存タスクを取り込めない=乗り換えられない こと。最小コストで「自分の過去/現在のタスク群を流し込めて、即 dogfooding できる」状態を作る。
Slice 1 — Paste import (no metadata)
- 複数行テキストをペースト →
\n で split → 空行除去 → 1行1レコード
- Vercel dashboard の env var 画面のような「貼ると行ごとに分かれる」UX
- メタデータなしで投入。
Completed として入れると過去実績がそのままヒートマップ(草)に反映され、即「自分の過去を見てくれてる」報酬が出る
- 実装は
textarea + split('\n') + prisma.createMany レベル。PR1枚
Slice 2 — AI auto-labeling (optional)
- 入った行に対し、カテゴリ/日付などを後付け。手動 or AI 自動
- 「雑に雰囲気でラベル付ける」用途。ピーク性能不要、安いモデルで十分
技術方針
- Vercel AI SDK (
ai) を抽象レイヤーに。プロバイダ非依存でモデル差し替え自由
- 裏に OpenRouter (
@openrouter/ai-sdk-provider)。APIキー1本で300+モデル、安いのにルーティング
generateObject + Zod で型安全な構造化ラベル出力(既存 Category enum を schema に)
- 安いモデル候補: Groq Llama 8B / Gemini Flash-Lite / DeepSeek V3.2
- ⚠️ Electron なので AI 呼び出しは Next.js server 側(
src/server/)。クライアントにキーを晒さない
- DeepSeek 等の直 SDK は1ベンダーロックで逆に不便 → OpenRouter 経由が後で楽
Slice 3 以降(動線メモ)
ラベル付く → 並び替えたくなる → DnD(Todo.order 活用) → 大量描画で re-render 最適化。最初のかゆいところから技術詳細まで一直線に繋がる。
const { object } = await generateObject({
model: openrouter('google/gemini-2.0-flash-lite-001'),
schema: z.object({
items: z.array(z.object({
text: z.string(),
category: z.enum(['Work','Health','Learning','Life']),
})),
}),
prompt: `Label each task line:\n${pastedLines.join('\n')}`,
})
Motivation
Corelive はまだ「使い物にならない」最大要因が 既存タスクを取り込めない=乗り換えられない こと。最小コストで「自分の過去/現在のタスク群を流し込めて、即 dogfooding できる」状態を作る。
Slice 1 — Paste import (no metadata)
\nで split → 空行除去 → 1行1レコードCompletedとして入れると過去実績がそのままヒートマップ(草)に反映され、即「自分の過去を見てくれてる」報酬が出るtextarea+split('\n')+prisma.createManyレベル。PR1枚Slice 2 — AI auto-labeling (optional)
技術方針
ai) を抽象レイヤーに。プロバイダ非依存でモデル差し替え自由@openrouter/ai-sdk-provider)。APIキー1本で300+モデル、安いのにルーティングgenerateObject+ Zod で型安全な構造化ラベル出力(既存 Category enum を schema に)src/server/)。クライアントにキーを晒さないSlice 3 以降(動線メモ)
ラベル付く → 並び替えたくなる → DnD(
Todo.order活用) → 大量描画で re-render 最適化。最初のかゆいところから技術詳細まで一直線に繋がる。