いくつものサービスを、
ひとつの基盤で。

は、アプリやサービスの裏側を支える
ItsuCaraの共通技術基盤です。

データを守り、権限を整え、AIの変化に備える。
サービスに必要な共通の仕組みを、
一つの土台にまとめます。

サービスの裏側で守ること

データ分けて守る
権限操作を整える
AI出力を確かめる
ITSU

見えないところを支える、共通の土台

  • データを守る
  • 権限を整える
  • 記録を残す
  • AIにつなぐ
共通技術基盤の構成イメージ

日々に寄り添う、
いくつもの道具。

ItsuCaraが企画・開発・提供するアプリです。
対応環境や提供状況は、各公式サイトでご確認いただけます。

Recto MD

本のように読める、Markdownリーダー兼エディタ。

無料 · App Store(Mac / iPad / iPhone)と Mac 向け直接ダウンロード

公式サイト

Qopito

コピーした内容を、すぐに呼び出せるクリップボード履歴。

現在は無料 · Apple 公証済み

公式サイト

Koemoji

Macの中だけで処理する、日本語音声入力。

現在は無料 · 直接ダウンロードと Mac App Store

公式サイト

Kagisecure

AIに秘密の値を見せずに使わせる、パスワードマネージャー。

無料・オープンソース(MIT または Apache 2.0)· Apple 公証済み · 英語のみ

公式サイト

Heftor

重量と回数、自己ベストを残すトレーニング記録。

Google Play で配信中 · App Store は近日公開予定

公式サイト

Pret

教科書やPDFから、自分に合った英語学習コースを。

App Store・Google Play(日本)で配信中

公式サイト

Texlen

ベータ版

紙の文字を読み取り、テキストとして持ち出すOCRアプリ。

ベータ版 · App Store は準備中

公式サイト

02 / WHY

AIは、
動き続けてからが
本番だ。

動くものをつくることと、
安心して使い続けられることは違う。

だから、機能を積む前に
何を守り、どう確かめるかを決める。

01

AIの答えは、毎回変わる。

出力を検証してから業務につなぐ。

02

顧客の情報は、混ぜられない。

データの境界をDB層で守る。

03

操作できる範囲は、人で違う。

誰が何をできるかを、一箇所で判断する。

04

AIも、事業も、変わっていく。

モデルと業務の処理を、直接つなぎすぎない。

安心して使うための、
6つの仕組み。

サービスごとに違うのは、事業の機能。
共通して守るべきことは、基盤にまとめる。

01 / データ境界

データを、分けて守る。

会社・店舗ごとの情報をDB層で分離。アプリ側の書き忘れに頼らず、データの境界を守る。

コード例を見る
ALTER TABLE records ENABLE ROW LEVEL SECURITY;
ALTER TABLE records FORCE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON records
  USING (tenant_id = current_setting('app.tenant_id')::uuid);

02 / 認証・権限

できることを、明確に。

誰が何を見て、何を操作できるか。実行直前の一箇所で判断し、サービス全体に同じルールを通す。

コード例を見る
const decision = await authz.evaluate({
  actor: { id: ctx.user.id, roles: ctx.user.roles },
  action: 'invoice:delete',
  resource: { type: 'invoice', id, tenantId },
})
if (!decision.allowed) throw new Forbidden(decision.reason)

03 / 実行記録

起きたことを、たどれる。

いつ、誰が、何をしたかを記録。AIの入出力は本文ではなくハッシュを残し、後から経緯を確かめられるようにする。

コード例を見る
await audit.append({
  actor: ctx.user.id,
  tenantId: ctx.tenantId,
  action: 'ai:generate',
  ai: { model, promptHash, outputHash }, // 本文は保持しない
  prev: lastHash,
  at: now(),
})

04 / モデル接続

AIが変わっても、使い続ける。

業務の処理とAIの接続部分を分ける。モデルの差し替えに備え、処理ごとにモデルとトークン量を選ぶ。

コード例を見る
const ai = createAdapter(pickModel(task))
const result = await ai.run(prompt, schema)
// 軽い処理は軽いモデル・少ないトークンへ

05 / AI境界

AIの答えを、そのまま通さない。

出力を検証・型変換してから業務へ渡す。想定外の応答には代替処理を用意し、システムの内側を守る。

コード例を見る
const raw = await llm.complete(prompt)
const parsed = OutputSchema.safeParse(raw)
if (!parsed.success) return fallback(ctx)
return parsed.data

06 / テスト

変更するたび、確かめる。

権限・データ分離・AI境界・記録を自動テスト。機能を増やしても、守るべき仕組みを繰り返し検証する。

コード例を見る
describe('tenant isolation', () => {
  it('他テナントのデータは絶対に返さない', async () => {
    const rows = await queryAs(tenantB)
    expect(rows.every(r => r.tenantId === tenantB.id)).toBe(true)
  })
})

TECHNOLOGY

この設計を支える技術。

型・データ・AIの境界を、実装に落とし込む。

TypeScript
型安全な境界契約
PostgreSQL
RLSによるDB層テナント分離
Row Level Security
クエリ単位のデータ境界
JWT / JWKS
ステートレス認証・鍵ローテーション
Zod
LLM出力のスキーマ検証
React
サーバー描画と再利用を同じ型で通せる
tRPC
型安全なAPI契約
Drizzle ORM
型付きクエリとマイグレーション管理
Cloudflare Workers
Hyperdrive経由の接続。テナント設定はトランザクション内のSET LOCALで、プールを跨がせない
OpenAI / Anthropic
アダプター層経由で差し替え可能

つくり直すより、
次をつくる。

共通化

土台を、共通化する。

認証・認可・データ分離・記録を共通の仕組みにまとめ、サービス固有の機能に開発を集中する。

再利用

ゼロから、始めない。

必要な仕組みを組み合わせ、同じ設計を繰り返さない。構成や開発期間は、サービスの要件に合わせて決める。

継続性

変化に、備える。

機能の追加やAIモデルの更新を見据え、業務の処理と基盤の役割を分けておく。

AIの接続も共通化。処理ごとにモデルとトークン量を選び、更新のしやすさと運用コストを考える。

ITSUCARA &

動き続けるAIは、
偶然では生まれない。

派手な機能より、崩れない構造を選んだ。
信頼は、後から追加できない。だから最初に設計する。

について相談する

会社のフォーム(itsucara.com)へ移動します。