One public world in a bottle.
ひとつだけ存在する、小さな公開世界。
Concept visual — the atmosphere and distance of the work, not a final UI mockup.
RINGRIUM(リングリウム) は、机の上のボトルアクアリウムをブラウザ越しに観察する、持続型の人工世界/Web作品です。
ログインも個人用ワールドもありません。誰が見に来ても、同じ瓶、同じ水、同じ住人、同じ時間の続きが見えます。ブラウザを閉じている間も世界の時間は進みます。
訪問者ができることは、ごくわずかです。たとえば、ガラスにそっと触れる。その振動は匿名の小さな外界イベントとして世界へ入ります。住人が気づくかもしれないし、気づかないかもしれません。
これは「AIと会話するアプリ」ではなく、観察者がいなくても向こう側で続いている、小さな世界を見に行く作品を目指します。
Status: Concept / research. 実装を急がず、まず既存のAIアクアリウム、人工生命、持続するagent world、デジタル生態系、Webインスタレーション等を横断調査し、RINGRIUMがどの形であるべきかを再検討しています。現在の開始点は Issue #2 です。
RINGRIUM は、Konrad Lorenz の『King Solomon's Ring / ソロモンの指環』への遠いオマージュとしての Ring と、aquarium / terrarium / vivarium を連想させる -rium を組み合わせた造語です。
ローレンツの水槽を眺めるように、住人を命令で動かすのではなく、環境と内部状態の中で何をするかを観察することを、この作品の基本姿勢にします。
画面はできるだけ静かにします。
- 木の机と窓の光
- 机上に置かれた一つのガラス瓶
- 瓶の中の水草、石、水、微粒子、光
- ごく小さな住人たち
- 横に置かれた日記帳 / Field Notes
- 小さな
Day N表示 - ガラスにそっと触れるための最小限の操作
設定画面、チャット欄、ユーザープロフィール、個人別のセーブデータは、少なくとも初期版には置きません。
住人は瓶に対してかなり小さく見えるサイズにします。
初期イメージ:
- 色違いの極小人魚たち — 数体。個体ごとに色、行動傾向、好む場所が少し違う
- 足/触手がとても長い極小クラゲ — ゆっくり漂い、光や水流へ反応する
- カラフルなウミウシ的な何か — 石や水草の近くをゆっくり移動する、小さな底生住民
重要なのは、精巧なキャラクター造形よりも、昨日と今日で居場所や行動が違い、それが世界の状態や過去の出来事につながっていることです。
住人は常時LLMで動かす必要はありません。内部状態、欲求、記憶、環境、確率、簡単な行動選択を中心にし、必要なら言語生成だけをモデルへ任せます。
RINGRIUM の中心原則は world is singular です。
visitor A ─┐
visitor B ─┼──> the same RINGRIUM
visitor C ─┘
- 世界は一つだけ
- 誰でもログインなしで見られる
- 全員が同じ現在状態を見る
- 世界の時刻は継続する
- 訪問者の操作は弱い外界イベントとして共有される
- 個々の訪問者との専用関係は作らない
訪問者は主人公ではなく、瓶の外側に時々現れる観察者です。
世界の事実と表示を分離します。
canonical world state
↓
world simulation
↓
events / resident actions
↓
render projection
↓
Three.js / HTML UI
サーバー側には、たとえば次のような現在状態を保持します。
world time
light / water / environment state
plants / objects
resident positions
resident internal states
resident memories / relationships
last updated time
recent world events
ページを開いていなかった時間については、last_updated との差分から世界を追いつかせる offline catch-up を基本にし、必要に応じて定期実行を併用します。
現在状態をGitHubそのものへ高頻度で書き込むのではなく、ライブ状態はサーバー/DB、GitHubは設計と歴史の保管庫という分担を第一候補にします。
初期版の主な干渉は touch the glass。
訪問者が瓶をクリック/タップすると、サーバーへ匿名の小さなイベントを送ります。
11:23:08 glass_touch magnitude=small
住人はそれを知覚する場合があります。多数の訪問者が触れれば、「今日は外側から振動が多い」という環境的な出来事になります。
個人識別は目的ではありません。ログインを求めず、必要な不正利用対策も個人プロフィールではなく、レート制限や短い匿名セッション単位で行う方針です。
机の横に小さな日記帳を置きます。クリックすると、RINGRIUM の過去の日々を読めます。
重要なのは、日記を最初から物語として捏造しないことです。
まず機械的な事実を残します。
07:12 light increased
09:43 resident:m01 moved behind plant:b
11:08 glass_touch x3
14:21 water temperature rose slightly
18:02 resident:m03 moved object:leaf-07
23:47 resident:j01 entered rest state
その日の終わりに、このイベント列を材料として人間向けのデイリーログへ変換します。
Day 47
朝は早く光が差し込んだ。
午前中、外から三度、小さな振動があった。
午後は水が少し暖かくなり、住人たちは水草の陰で長く過ごした。
つまり、
machine/audit history = 世界で実際に起きたこと
Field Notes = その日の出来事を読むための文章
と分離します。
日次ログは logs/YYYY/MM/DD.md のような形でGitHubへ保存する案を検討します。長く動けば、リポジトリ自体が世界の地層になります。
最初から画面全体をリアルタイム3Dにする必要はありません。
第一候補:
静止画 / CSS
└─ 机、窓、本、日記帳、部屋の雰囲気
React Three Fiber / Three.js
└─ ボトル、水、水草、石、粒子、住人、光、ガラスへの接触
HTML UI
└─ Day表示、Field Notes、アクセシブルな操作
背景の美しさは静止画で稼ぎ、生命感のある部分だけを3Dにすることで、軽さと作品性を両立させます。
カメラは基本固定。3Dゲームのような自由移動は初期版では不要です。
- One world, not many rooms. 世界をユーザーごとに複製しない
- Observe before command. 住人へ命令するより観察する
- Weak human agency. 人間の干渉は小さくする
- The world exists outside language. 文章より先に世界状態がある
- Code moves the world; language interprets it. 世界の因果をLLM任せにしない
- Persistent but cheap. 常時高価な推論を回さず、長期間生かせる設計にする
- History matters. 現在状態だけでなく、そこへ至った出来事を残す
- Quiet UI. ダッシュボードではなく、机上の小世界として見せる
現時点の候補です。調査・小さな技術スパイクの後に決めます。
- TypeScript
- React + Vite
- Three.js + React Three Fiber
- Drei等の補助ライブラリは必要な範囲だけ
- UI非依存のpure TypeScript
- seeded randomness
- time / event / resident stateを分離
- resident behaviorは軽量なdrive / memory / utility-based selectionを基本にする
- LLMはdaily log等の言語化に限定可能
A. Cloudflare Durable Objects
「一つの名前付きオブジェクト = 一つの世界」という構造と相性がよく、状態の直列化、Alarms、WebSocketによる共有更新を一か所へまとめやすい候補。
B. Supabase / Postgres
現在状態、append-only event history、Realtime、定期処理をSQL中心で扱える。履歴を人間が直接観察・分析しやすい候補。
どちらを採用するかは、無料枠、長期運用コスト、単一世界の同時更新、安全な匿名書き込み、日次処理の扱いやすさを比較して決めます。
RINGRIUM はゼロから全部作らず、既存の実験を部品・設計思想として再利用します。
特に調査対象:
ggpt-3— world / memory / agent分離、offline catch-up、seeded randomnessNOZOMI-Beings— 欲求、内部状態、記憶、関係性から動く軽量住民FOLKS— machine eventとjournalの分離、append-only history、モデルを意味生成へ限定する設計WorldSimSeed— Agents / Time / Events / Rules / Observersの世界シミュレーション分解Word-Terrarium— ポインターを「支配」ではなく小さな擾乱として扱うUI思想particle-winds— 微粒子、ゆらぎ、タッチ反応、UIを消して眺める表示4der— World / continuity / historyを分ける長期人工世界の考え方Mintwhirl-Island/orbital-bowl— Reactと3Dキャンバス、描画とゲームロジックの分離の実装参考
詳細は docs/REUSE_AND_RESEARCH.md に整理します。
初期版では、次を作らない/後回しにします。
- ユーザーアカウント
- 個人別の水槽
- AIとのチャット
- 自由なアバター操作
- 大規模3Dワールド
- NFT / 通貨 / 経済圏
- 常時LLM推論
- 複雑な水質・流体の科学シミュレーション
- 過剰な管理画面
まず必要なのは、ひとつの小さな世界が、誰も見ていない時間を含めて続いていることです。
実装へ急がず、まず Issue #2 の先行調査から再開します。
-
既存の「アクアリウム的AI世界」を10〜20件程度集める
AI aquarium、artificial life、persistent agent world、digital terrarium、低干渉型の共有世界、Webインスタレーション等を横断して調べる。 -
人工生命とLLM agent worldの両方を見る
複雑な知能なしで存在感や履歴を作る古典的ALifeと、記憶・継続性を持つ現代のagent実装を比較する。 -
RINGRIUMのなり得る形を複数案で再検討する
観察型人工生態系/AI住民世界/code+AIハイブリッド/生きたWebインスタレーション等を、作品性・自律性・運用費・複雑性・長期維持性で比較する。 -
手持ちリポジトリと外部OSSを再評価する
使えるから使うのではなく、調査後のRINGRIUMに必要な部品だけを残す。 -
その後にvisual spikeとworld coreへ進む
3Dが本当に必要かも含めて決めたうえで、最小の縦切りを実装する。
最初の完成条件は、豪華な3Dではありません。
昨日閉じた瓶を今日開いたら、住人たちが昨日の続きから生きていて、その昨日の日記が一枚増えている。
そこまで通れば、RINGRIUM はもう存在し始めています。
