Cannabivo.com
ネオンに照らされたCannabis Social Clubの内部で、Cannabivoのマスコットキャラクターが携帯電話を手に持ち、Cannabivoアプリとクラブディレクトリを表示しています。

社内

読了目安18分

Cannabivo:Cannabisソーシャルクラブのための国際インフラを構築する

Cannabivoは、法的なCannabisソーシャルクラブ、オランダのコーヒーショップ、喫煙ラウンジのための国際情報ディレクトリ兼ニュースハブです。透明で最新の多言語情報を通じて、検索し、見つけ、つながるための場として設計されています。以下は、その物語を完全版でお届けするものです。Cannabivoはどこから生まれ、何へと成長し、どのように構築されているのかを、順を追って紹介します。

2024年に私たちが見たギャップ

「ドイツとスペイン向けのより良いディレクトリ」が、10カ国、18言語、25万ページ規模の本番プラットフォームへと変わり、それを支える最先端のエンジニアリングまで含む話になった経緯です。

ディレクトリは単なる一覧以上のものになれます。法的で、多言語で、検証済みで、プライベートで、技術的に真面目なものにすれば、それはもはや一覧ではありません。インフラになるのです。

「Cannabisソーシャルクラブ、コーヒーショップ&喫煙ラウンジ — ひとつの国際ディレクトリ&ニュースハブ。」 それが私たちの一文の約束であり、あえて平易な表現にしました。Cannabivoは、消費を促すキャンペーンでも、Cannabisのマーケットプレイスでも、コピーした住所を寄せ集めただけの薄い掲載サイトでもありません。法的なCannabisソーシャルクラブ、オランダのコーヒーショップ、喫煙ラウンジのための国際情報ディレクトリであり、人々が検索 → 発見 → 接続を、透明で最新、かつ自分の言語で利用できる情報を通じて行えるように作られています。

その目的は、単なるディレクトリを超えています。CannabivoはCSCコミュニティのためのインフラになりつつあります。設計思想としてプライベートで、国際的な広がりを持ち、コミュニティ主導で、18言語で稼働しています。プラットフォームはすでに225,792ページ211,397件のジオロケーションページ10カ国にまたがる13,573件のクラブ掲載を提供しています。その上に、深掘りしたCannabisウィキ、教育・予防ページ、ニュースシステム、自動クラブ更新、コミュニティフォーラム、そして実際のツールにつながったAIサポートエージェントが載っています。基盤には、完全に内製でフレームワークに依存しないアーキテクチャがあり、最新のウェブ標準、永続PHPワーカー、HTTP/3、設定しうる限り厳格な静的解析、ファーストパーティ分析、そしてウェブとモバイルで共有される単一の型付き PHP → TypeScript → Dart 契約が動いています。

これは、その物語の長い版です。Cannabivoはどこから来たのか、今は何であるのか、そして—詳細に—どのように作られているのか。

2024年初頭のドイツの合法化は、見過ごしやすかった問題を露わにしました。Cannabisソーシャルクラブのオンライン情報は、予定どおりに到来する現実にまったく追いついていなかったのです。経験豊富なウェブ開発者の目には、既存の多くのものが半端に見えました。断片的で、不完全で、ローカライズが不十分で、技術的に古く、実際に誰かの役に立つには薄すぎたのです。

人々が抱いていた疑問は、難しいものではありませんでした。合法のクラブはどこにあるのか。どの情報が最新なのか。クラブに連絡する前に、新規の人は何を理解すべきなのか。何が事実で、何が古く、何が別の場所から単にコピーされたものなのか。あまりに頻繁に、答えは弱い掲載情報、機械翻訳された断片、そして自分たちが対象だと主張するコミュニティのために作られていないことが明らかなページに散らばっていました。

最初の発想は控えめなものでした。ドイツとスペイン向けの、もっと良いディレクトリです。しかし見れば見るほど、パターンははっきりしてきました。CSCコミュニティに必要なのは、会場の一覧をもう一つ増やすことではありません。国ごとに拡張でき、それでいて都市、地域、1つのクラブ、1つの記事、1つのFAQ項目、1つの言語という粒度でも正確さを保てる、多言語で、法務に慎重で、技術的に信頼できる情報層だったのです。

完全な内製開発は2024年夏の終わり/秋に始まりました。Cannabivoは2026年2月に、最初から18言語すべてで公開され、それ以来ほぼ毎日改良されています。ここで重要なのは順序です。多言語対応は公開後に付け足したものではありません。データベース、URL、ルーティング、SEO層に至るまで、最初のコミットから土台に流し込まれていました。

ディレクトリ構想から始まったものは、AI支援開発によって加速され、アルゼンチン、コロンビア、ドイツ、マルタ、オランダ、南アフリカ、スペイン、スイス、タイ、ウルグアイをカバーする国際プラットフォームへと成長しました。各国のカバレッジはいまも進行中であり、私たちはそのことを意図的に明言しています。しかし本番規模はすでに現実であり、中期目標にも迷いはありません。Cannabisが合法化されている、あるいは少なくとも非犯罪化されているすべての国をカバーすることです。すでに掲載しているスイスのようなパイロットプログラム国も含みます。

いまのCannabivo

Cannabivoは本番環境で稼働しており、継続的に保守されています。2026-06-13 に確認された本番スナップショットは、このプラットフォームがとうにプロトタイプの段階を離れていることを示しています。

落ち着いたダークテーマのインターフェースで、地図、掲載情報、ダッシュボードが複数の大型スクリーンに表示された広い現代的な運用スペース。
Cannabivoは、ディレクトリ、ウィキ、ニュースデスク、サポート層を一体化した、ひとつの大きな生きたプラットフォームとして稼働しています。
本番メトリクス現在の件数
総ページ数225,792
ジオロケーションページ211,397
クラブ掲載13,573
個別クラブ詳細ページ13,573
Cannabisウィキ記事106
ウィキカテゴリ9
FAQ項目82
FAQカテゴリ11
公開済み編集記事15
自動クラブ更新ニュース275
登録ユーザー1,216
フォーラムスレッド170

これらは見栄えのための数字ではありません。それぞれが、製品上の判断に結びついています。

大きなディレクトリにジオページが必要なのは、人々が地域ごとに検索するからです。詳細ページが必要なのは、どのクラブも一覧の1行ではなく、文脈を持つべきだからです。多言語URLが必要なのは、国際ユーザーを後回しにしてはならないからです。掲載情報は放置した瞬間に劣化するので、絶え間ない保守も必要です。教育ページが必要なのは、情報の質こそが本質だからです。そしてフォーラムが必要なのは、CSCコミュニティが検索の問題だけではなく、会話の問題でもあるからです。

検証済みの国際ディレクトリ

ディレクトリには現在、10カ国にまたがる13,573件のクラブが掲載されています:

ヨーロッパ、南米、アフリカ、アジアにまたがる地点ピンが密集した、大きく照らされた世界地図。
各クラブ掲載は個別に確認され、位置情報が付与された専用ページとして地図化されるため、このディレクトリは10カ国にまたがる現実世界のシーンを検証済みの地図として読めます。
クラブ
タイ9,489
スペイン1,081
ウルグアイ810
ドイツ710
オランダ673
アルゼンチン495
南アフリカ243
コロンビア41
マルタ18
スイス13

国別の検証済みクラブ掲載 (クラブ)

国別の検証済みクラブ掲載国別の検証済みクラブ掲載 — values in クラブタイ9,489スペイン1,081ウルグアイ810ドイツ710オランダ673アルゼンチン495南アフリカ243コロンビア41マルタ18スイス13

現在、データベースで最大の割合を占めているのはタイであり、その規模は本物の強みです。スペイン、ドイツ、オランダ、ウルグアイ、アルゼンチン、そして他の国々はそれぞれ異なる法的文脈、異なるローカルな期待、異なる発見パターンを伴ってやってきます。真剣な国際ディレクトリは、こうした複雑さをすべて一度に抱えながら、ノイズに崩れない必要があります。

Cannabivoは自らの掲載情報を検証済みとして提示しており、その検証はプラットフォームの中核的な約束です。軽々しく付けるラベルではありません。この規模では、その約束を守ることは編集上の規律だけでなく、システムの問題でもあります。新規開業、閉店、住所変更、詳細の変更など、掲載情報を継続的に正確かつ最新に保っています。目的はディレクトリを時点で固定することではなく、現実が動くのに合わせて現実を追従し続けることです。公開したその日に古くなるディレクトリは、ないより悪いのです。

掲載情報の周囲には、検索機能付きのインタラクティブマップ、専用のクラブ検索、そして新鮮さを重視して設計されたホームページがあります。最近追加されたクラブ、人気都市、国別ハブ、ニュースとクラブ更新のライブフィードが並びます。

ウィキ、教育、予防 — 広告的メッセージなしで

単純な掲載サイトは、どこに何があるかを教えてくれます。Cannabivoは、それが何を意味するのかを伝えるために作られています。

Cannabisウィキには、植物学、歴史、法、そして消費に関連する知識を扱う掘り下げた内容を含む、9カテゴリにわたる106本の記事があります。見かけだけ立派に見せるための用語集ではありません。独立して成立するように調査・執筆されたものです。その隣には教育と予防のページがあり、事実に基づき、広告を排し、製品を押し出すのではなく理解を支えるように作られています。

この一線は飾りではありません。Cannabivoは情報ディレクトリです。私たちは医療上の主張を行わず、消費も促しません。構造化された多言語の法的情報へのアクセスを提供し、その境界を意図的に守っています。なぜなら、プラットフォーム全体の信頼性がそこにかかっているからです。ウィキと教育・安全利用領域は今後も拡大し、記事も、画像も、動画も増えていきます。

ニュース、自動更新、そしてコミュニティ

ニュースセクションは新しく、すでに活発です。調査に基づく編集記事と、自動クラブ更新ニュースを組み合わせています。現在の本番スナップショットでは、Cannabivoには15本の公開済み編集記事275件の自動クラブ更新ニュースがあります。

この組み合わせは意図的です。編集記事は、政策の変化、法制度の動き、文化的な出来事といった広い文脈を提供します。自動クラブ更新ニュースが存在するのは、ディレクトリは決して静止していないからです。クラブは開き、詳細は修正され、住所は変わります。生きたフィードがあれば、黙ったまま変化していくデータベースに任せるのではなく、人々はその変化を見ることができます。

コミュニティフォーラムもあり、成長しています。これまでに1,216人の登録ユーザー170本のフォーラムスレッドがあります。フォーラムは付け足しではありません。CSC文化は、ローカルで、法的で、実用的で、社会的でもあるからです。ディレクトリは人々が情報を見つける助けになります。コミュニティは、それを議論し、比較し、互いに学び合う助けになります。両方とも、一つ屋根の下にあるべきなのです。

AIサポートチャットは実際のツールにつながっている

Cannabivoのサポートチャットは、ページの隅に付いた装飾的なチャットボットではありません。ウェブ版とアプリ版の両方にある、Cannabivoで学習したAIサポートエージェントであり、即興に任されたものではなく実際のプラットフォームツールにつながっています。

実際には、このエージェントは次のことができます。

1. 特定のCannabivoページを見つけて、ユーザーの言語で実際の正規リンクを渡す。捏造されたURLは返さない。 2. クラブを検索する。名称、都市、地域、距離で探せるほか、クラブが今開いているかどうかも含められる。 3. FAQナレッジベースから回答する。 4. सहायताできない場合は、カテゴリ、タイトル、説明付きで実際のサポートチケットを開く。人間が引き継げるようにする。

違いこそが要点です。推測するのではなく、エージェントは定義されたプラットフォーム境界の内側で動き、実在するリンクとクラブだけを返します。FAQが増えるにつれて、エージェント自身も洗練されていきます。FAQシステムは動的に保守され、自己改善するからです。私たちが埋めた穴の一つひとつが、次回にエージェントが参照できる知識になります。内部では、チャットは Redis の pub/sub とストリーミング応答を伴う WebSocket リレー上で動作し、モデルはデプロイごとに設定可能です。

思想は明快です。AIはブラックボックス化せずに摩擦を減らすべきです。エージェントが Cannabivo 自身のデータから確実に答えられるなら、そうすべきです。できないなら、静けさを埋めるために答えを創作するのではなく、実際のサポート手続きに質問を渡すべきです。

ひとつのプラットフォーム、18言語

Cannabivoは初日から18言語すべてで公開されました。容易な道ではありませんでしたが、正しい道でした。

異なる世界言語での挨拶がそれぞれ表示された小さな同一の看板が、整然と格子状に並ぶ壁。
同じページが18言語すべてでネイティブに存在し、それぞれに独自のきれいなURLがあります。ローカライズは付け足しではなく、インフラに組み込まれています。

サイトは現在225,792ページを運用しており、そのすべてが18言語すべてに存在します。データベース層では、およそ400万件のページ翻訳行に相当します。ベースの `pages` テーブルに加え、言語ごとの17テーブルがあり、完全に同期した状態で検証されています。プラットフォームはさらに211,397件のジオロケーションページ—都市と地域—を抱えており、それらもすべて18言語に完全翻訳されています。

これはURLプレフィックスによる翻訳ではありません。英語のURLの前に `/de/` を付けてローカライズ済みと呼ぶことはしません。すべての言語に、すべてのページごとのローカライズされたURLスラッグがあります。例えば:

  • `/news/2`
  • `/de/nachrichten/2`

この構造には、完全な `hreflang` 対応と、アラビア語のための真の右から左へのレイアウトが備わっています。ここでのアラビア語は「英語テキストをアラビア語の単語に置き換えただけ」ではありません。言語に合った RTL レイアウトが与えられ、ページ、SEOヘッド、UI のすべてに組み込まれています。

プラットフォームは精神的にも構造的にも英語優先ですが、英語だけではありません。言語の全体像は、英語、ドイツ語、フランス語、スペイン語、イタリア語、ポーランド語、アラビア語、チェコ語、ヒンディー語、ハンガリー語、日本語、韓国語、ポルトガル語、ポルトガル語(ブラジル)、ロシア語、トルコ語、中国語をカバーし、アラビア語は右から左で扱われます。

なぜここまで重要なのか。CSCコミュニティは、ひとつの言語、ひとつの国、ひとつの法制度に閉じていないからです。ドイツのユーザー、スペインのクラブオーナー、スイスのパイロットプログラムの違いを比較する読者、ウルグアイの法的文脈を確認する旅行者——彼らの誰もが、率直な答えを得るために英語だけの体験を強いられるべきではありません。

多言語インフラは、クラブができることも変えます。オーナーは説明文を一度書き、必要なら AI ライティングアシスタントで磨き、保存し、ワンクリックで18言語すべてに翻訳できます。それは単なる便利さではありません。小さなローカルクラブでは本来届かなかった国際的な発見可能性なのです。

翻訳は Cannabivo の端に置かれた機能ではありません。データベース、URL、SEO層、UI、そしてクラブオーナーの作業フロー全体に通っています。

クラブ向け:Club Managerはすでに提供済み

Cannabivoはコミュニティのために作られており、そのコミュニティには実際にクラブを運営する人たちも含まれます。Club Manager はすでに提供済みです。これはメンバーアカウント内にある完全なセルフサービス編集機能であり、オーナーは技術知識をまったく必要とせずに自分の掲載情報を管理できます。

暖かい部屋の木製デスクで、クリーンなクラブ管理ダッシュボードを表示するノートPCを使う人物の手。
クラブ運営者は、提供済みのセルフサービスダッシュボードから自分の掲載情報、営業時間、詳細を管理します。スプレッドシートも仲介業者も不要です。

モバイルファーストなのは、多くのクラブオーナーが机の前から自分の公開情報を管理しているわけではないからです。必要なのは、手元にある電話機から、1分で詳細を直せることです。

Club Manager が扱うのは、掲載情報を本当に役立つものにする実務的な要素です。

  • 説明文とタグライン、下書きと推敲を助ける AI ライティングアシスタント 付き
  • 18言語へのワンクリック翻訳
  • ロゴ、ヒーロー画像、並べ替え可能なギャラリー、画像トリミング
  • 営業時間
  • 位置情報とドラッグ可能な地図ピン
  • 連絡先情報
  • およそ11項目のソーシャルチャネル欄
  • 会員情報
  • 22項目のアメニティ選択

各セクションは個別に保存されます。生のJSONも、SEOの宿題も、オーナーに画像比率の計算も求めません。保存のたびに所有権はサーバー側で強制され、プラットフォームはクライアントから渡された識別子を決して信用しないため、あるオーナーが別のクラブに手を伸ばすことはできません。

ここで Cannabivo のディレクトリと多言語アーキテクチャは、クラブ運営の毎日の現実に接続します。良い掲載情報にウェブ制作会社は必要ありません。オーナーが SEO、画像比率、翻訳パイプライン、構造化データを理解する必要もありません。エディタは、良い見せ方を技術スキルへの報酬ではなく、標準にするために存在します。

プレミアムクラブ・マイクロサイトはバックログにあります

この構想の次の段階は、プレミアムクラブ・マイクロサイトです。現在はバックログにあり、まだ構築されていません。

考え方は単純です。すべてのプレミアムで認証済みのクラブが、自分の Cannabivo サブドメイン上に、洗練されたファーストパーティのホームページを持てるようにすることです。

{club}.cannabivo.com

私たちが目指す基準は「最初から見栄えがする」ことです。厳選されたプリセット、18言語での完全なSEO、そしてクラブが手作業で同期を保つ必要のある別システムではなく、同じ掲載データに接続されたサイト。情報を一度更新すれば、ディレクトリもマイクロサイトも同じ唯一の正しいソースを反映します。

ここでは時制に注意を払っています。Club Manager は提供済みです。プレミアムクラブ・マイクロサイトは計画中の構想です。この線を明確に保つこと自体が製品の一部です。なぜなら、信頼性こそが重要だからです。

内部構造:Cannabivoが本当に最先端である理由

この規模のプラットフォームが、速く感じられ、多言語を維持し、プライバシーを守り、ネイティブアプリを支えるのは偶然ではありません。Cannabivoは、公開ディレクトリとしては異例なほど厳格なエンジニアリング判断のもとで、ゼロから内製構築されています。

暗い画面にコードが表示された開発者のワークステーションと、やわらかく光る小型ネットワーク機器のラックを間近から捉えた दृश्य。
親しみやすい表層の下には、手作りで型安全なスタックがあります。永続PHP、HTTP/3、ネイティブアプリ、そして各プラットフォームを貫く単一の型付き契約です。

私たちは「最先端」という言葉を慎重に使います。いま流行のライブラリを何でも追うという意味ではありません。実際の製品課題を解決する場面では最新標準を採用し、そのうえでシステムが内部から静かに腐らずに拡張を続けられるよう、十分に厳しく品質を強制する、という意味です。

ウェブフレームワークの中核なしでゼロから構築

Cannabivoは、ウェブフレームワークの中核を持たない、完全な内製構築です。基盤に Laravel や Symfony のアプリケーション骨格はありません。Symfony は、実際にその価値がある場面で使う、いくつかの個別ライブラリとしてのみ登場します。

この判断によって、ルーティング、レンダリング、キャッシュ、ローカライズ、契約、セキュリティポリシー、実行時の挙動まで、完全に制御できます。初期コストは高くなります。その代わり、プラットフォームはフレームワークの既定値やライフサイクルに製品を合わせるのではなく、製品のほうに合わせて曲がるようになります。

アーキテクチャはひとつのコードベース、複数の製品です。共通コアにプロジェクト別の層を載せたもので、内部では Common/Projects モデルとして知られています。これは重要です。Cannabivo は、同じページテンプレートを何千回も打ち出すだけのものではありません。ディレクトリであり、ウィキであり、FAQシステムであり、ニュースシステムであり、サポートシステムであり、クラブオーナー向けエディタであり、コミュニティ表層であり、分析プラットフォームであり、自動化エンジンであり、ネイティブアプリのバックエンドでもあるのです。共有コアは共通ルールをどこでも強制し、プロジェクト別の層は、プラットフォームを丸ごとコピー&ペーストしなくても済むように、製品固有の挙動を担います。

最新の実行環境:永続PHP、HTTP/3、そして速度のために組み込まれた圧縮

バックエンドは PHP 8.5.7FrankenPHP の worker モード で動いています。これは単なる既定値ではなく、本当のアーキテクチャ上の選択です。従来のPHPは通常、リクエストごとにライフサイクルがあり、アプリケーションを起動し、1件処理し、すべてを破棄し、また同じことを繰り返します。Cannabivoはその代わりに、Unixソケット越しに永続ワーカーを温かい状態で保ち続けるため、アクセスのたびにコールドスタートの負担を支払う必要がありません。

データベースは MariaDB 12.3.2 です。フロントエンドのツールチェーンは TypeScript 7 で、Goネイティブのコンパイラ(`tsgo`)でコンパイルし、Vite 8 でバンドルしています。システムの一部では、Node と TypeScript もサーバーサイドで動作します。

ウェブサーバーとエッジ層では、Cannabivo は HTTP/3(QUIC)対応の nginx0-RTT を伴う TLS 1.3、動的な zstd 圧縮、事前圧縮された brotli 静的アセットを用い、公開ドメインの前段には Cloudflare を置いています。それぞれに役割があります。

  • QUIC 上の HTTP/3 は、現代的で損失の多いモバイルネットワークでの転送摩擦を下げます。
  • 0-RTT を伴う TLS 1.3 は、条件が安全に許すときにハンドシェイクコストを削減します。
  • zstd は、動的レスポンスに対して効率的なオンザフライ圧縮を提供します。
  • brotli(静的) は、事前に構築したアセットを可能な限り小さく圧縮します。
  • FrankenPHP の worker モード は、PHP が毎回コールドスクリプトのように振る舞うのを防ぎます。

ここに魔法の一撃はありません。小さなレイテンシ削減の判断を積み重ね、それらが相乗的に効いています。

即時SPA:Navigation API、View Transitions、そしてプログレッシブエンハンスメント

製品としての問いは率直です。リンクをクリックして待つのが好きな人がいるでしょうか。

Cannabivoは、体験を改善する場面では最新のシングルページアプリのように振る舞いながら、あくまでサーバーレンダリングを第一にしています。最新の Navigation APIView Transitions API を使って、ページ遷移を完全なドキュメント破棄ではなく、ネイティブで、まとまりがあり、アニメーションし、即時に感じられるものにしています。ブラウザがそれをサポートするなら、Cannabivo内を移動する感覚はアプリを使う感覚に近くなります。

しかし、これは JavaScript がなければ何も動かない設計ではありません。Cannabivo は真のプログレッシブエンハンスメントの上に作られています。JavaScript をオフにするか、最新APIのないブラウザで開いても、素のサーバーレンダリングリンクはそのまま動きます。アクセシビリティ、耐障害性、SEO、そして技術的な誠実さのために、それは重要です。レンダリングはサーバーから始まり、インタラクションは既にあるものを強化するだけです。

キャッシュ済みページでは、Cannabivo はさらに踏み込みます。4つのテーマバリアント(自動、ダーク、ライト、純黒モード)による事前レンダリング済み静的HTMLキャッシュを、nginx が PHP を完全に迂回して直接配信します。キャッシュヒットではアプリケーション層は一切起きません。nginx はすでに描画済みのHTMLを返し、それを静的ヒットとして刻印します。4つのバリアントがあるのは、見た目が普遍的なひとつの形ではないからです。それぞれを事前レンダリングすることで、デザインシステムを単一の妥協に潰さずにページを高速化できます。各バリアントはレンダリング時に一度だけ書き出され、ファイルシステム監視デーモンによってオフパスで圧縮されるため、リクエスト経路はその負担を負いません。

フロントエンドのパフォーマンス層には、さらに次のものが含まれます。

  • Critical CSS のインライン化 と Content Security Policy へのハッシュ固定
  • AVIF 画像 と明示的な寸法指定によるレイアウトシフトゼロ
  • ファーストビューのヒーローは高優先度で即時読み込み、それ以外は低優先度の遅延読み込み
  • 次の遷移候補への hover および touch prefetch
  • ローディング戦略の一部としての Early Hints

通常経路では、Early Hints は Cloudflare を介して配信されます。これは、実際に大半の訪問者がそれらに触れる仕組みを正直に表した説明です。動的キャッシュミス経路では、真の HTTP 103 が送出されます。私たちは、あらゆる訪問者があらゆる経路で文字どおりの103を受け取るとは主張しません。ただし、システムが最新のヒントモデルを中心に設計されており、ページごとの LCP 画像プリロードがエッジで注入されるところまで含めてそうだとは主張します。

ここで押さえるべき点は、パフォーマンスがバンドルサイズのダッシュボードに外注されていないことです。レンダリング、キャッシュ、転送、画像、CSS、プリフェッチ、プログレッシブエンハンスメントに組み込まれており、すべての層が同じ方向を向いています。

多言語URLは装飾ではなくインフラです

多言語層がエンジニアリング面からもう一度登場するのは、それが大規模運用で最も難しいことの一つだからです。Cannabivo のローカライズは、コンテンツ翻訳だけではありません。ローカライズされたスラッグ、同期されたページ行、`hreflang`、RTL レイアウトを含み、仕上げではなくプラットフォームの第一級の次元として扱われています。

225,792ページ × 18言語 という規模では、どんな弱さも見た目の問題ではなく構造の問題になります。翻訳行の欠落は単なるタイプミスではありません。SEO、ナビゲーション、内部リンク、あるいはサイト全体へのユーザーの信頼を壊しかねないのです。だからこそ、ベースの `pages` テーブルと17の言語別テーブルは完全かつ検証済みの同期状態に保たれ、クラブページ、ジオページ、ウィキ記事、FAQ項目、ニュースは、横に付け足した翻訳テーブルではなく、同じ国際構造の中に収まっています。

コード品質:最高レベルのPHPStan、超厳格なTypeScript、そしてポリシーを強制するルール

Cannabivo は PHPStan を Level 10 — 最高レベル で走らせ、さらに 121本のカスタム静的解析ルール を併用しています。フロントエンドでは、TypeScript が超厳格モードで動作し、14本のカスタム lint ルール と9つのエラーレベルのプラグインが入っています。

これは美的純度のためではありません。そもそも、ある種のミスを出荷できないようにするためです。

カスタムルールは、コードとして埋め込まれたポリシーです。実例をいくつか挙げます。

  • `RequireRateLimitOnEveryRouteRule` — レート制限が宣言されていないAPIルートはビルドに失敗します。セキュリティ姿勢は、レビューで誰かがチェックリストを思い出すかどうかに依存しません。
  • `NoRawIdInResponseDtoRule` — 外部レスポンスはUUIDを使う必要があり、内部の整数DB IDをそのまま返すことはできません。内部識別子がクライアントに漏れないようにするためです。
  • `NoInlineStylesRule` — インラインスタイルはビルド時に拒否され、厳格な Content Security Policy を実効的に保ちます。
  • DTO規律 — ハンドラは型付きのリクエストDTOを受け取り、型付きのレスポンスDTOを返さなければなりません。生配列は拒否されます。これが、下で説明するクロスプラットフォームの型パイプラインを可能にしているのです。

同じ思想がコードベース全体を貫いています。生成された契約は手編集できず、バックエンドとフロントエンドの形は黙ってずれていくことができず、セキュリティ上重要な前提は、機械が検査できる場所では機械的に検査されます。静的解析は華やかな作業ではありませんが、動きの速いプラットフォームが信頼性を保てる大きな理由の一つです。私たちはほぼ毎日出荷しています。厳格な解析があるからこそ、「速く動く」が「混乱を受け入れる」という意味にならずに済むのです。

単一の型付き契約:1,518個のPHP DTO → 1,518個のTypeScript型 → 1,518個のDart型

Cannabivo における最も強力なエンジニアリング判断の一つが、型付きAPI契約です。

バックエンドのデータ形状は PHP DTO として一度定義され、TypeScript と Dart の両方へ自動生成されます。対応は 1 対 1 です。

1,518 PHP DTOs ↔ 1,518 TypeScript types ↔ 1,518 Dart types

ウェブサイトとネイティブアプリは、バックエンドと同じ生成済み契約を利用します。バックエンドの形が変わっても、TypeScript と Dart の利用側が別の現実へずれていくことはできません。生成されたファイルは読み取り専用でロックされているため、人が手で編集することはできず、ソースDTOと生成型の間にずれがあれば、それはユーザーが本番で見つける実行時の驚きではなく、ビルドを止めるエラーになります。

これが重要なのは、Cannabivo がウェブサイト以上の存在だからです。ネイティブアプリも並行して構築されており、ウェブとモバイルで API の形を共有することで、典型的な失敗モードを避けています。バックエンドが進化し、ウェブチームがその解釈の一つを修正し、モバイルアプリは別の解釈を保ち、その境目にバグが静かに積み上がる——そうした事態です。私たちはあえて厳しいモデルを選びました。唯一の真実の源を一度定義し、そこからプラットフォーム契約を生成し、ずれをユーザー向けの問題ではなくビルド時の問題に変えるのです。

プライバシー第一の分析:Google Analytics なし、第三者トラッカーなし

Cannabivo は Google Analytics を使わず、第三者トラッカーも使いません。代わりに、実ユーザーの Core Web Vitals を含む、完全カスタムのファーストパーティ分析システムを構築しました。独自の取り込みパイプラインと、生のイベント、時間別・日別集計、ボットを除外した人間のみのビューのための数十の専用テーブルに支えられています。訪問者データは、テック大手の側へ出ていきません。

これはプライバシー上の判断であると同時に、製品上の判断でもあります。ページが実地で本当に速いのかを知る必要はあります。テスト環境で速いだけでは意味がありません。ただ、訪問者の行動を他人の監視機構に食べさせるのではなく、自分たちで測ることにしたのです。法的CSC情報のディレクトリはプライバシーを真剣に扱うべきですし、基本機能のために閲覧コンテキストを差し出すよう求められるべきではありません。

銀行水準のセキュリティを、計測し、強制する

Cannabivo は、銀行水準の多層セキュリティアーキテクチャを採用しています。

  • Content Security Policy: 個別にハッシュ許可されたもの以外のインラインスクリプトやスタイルは使いません
  • Trusted Types による DOM インジェクションの大分類の無効化
  • 多段階のレート制限: IP とユーザーの両方に対して。制限のないルートはビルドに失敗するというルール付き
  • 機微な内部エンドポイントでの HMAC リクエスト署名
  • 認証済みの状態変更リクエストに対する CSRF 保護
  • HSTS preload
  • AI支援セキュリティテスト

プラットフォームは、Mozilla Observatory で A+ — 135点中135点 を獲得しています。これは確認済みの結果であり、到達するウェブサイトはごくわずかです。

CSP は特に注目に値します。多くのサイトは CSP を掲げながら、その下では広範なインライン実行を許しています。Cannabivo の姿勢はより厳格です。インラインスクリプトとスタイルは広く許可されておらず、それぞれハッシュ許可が必要で、Trusted Types と組み合わせることで、ブラウザ側の注入の大分類をはるかに難しくしています。レート制限も同じ扱いです。任意のミドルウェアではなく、ビルドがなければ出荷を拒むアーキテクチャです。繰り返し現れる考え方は同じで、セキュリティ上の前提をシステムそのものに埋め込み、うっかり忘れられないようにすることです。

エンドツーエンド暗号化されたダイレクトメッセージ

Cannabivo には、ゼロ知識サーバー設計による エンドツーエンド暗号化されたダイレクトメッセージ が含まれています。サーバーが保存するのは公開鍵と不透明な暗号文だけで、メッセージの内容は決して保存しません。

暗号化は Signal 級で、マルチデバイス対応、libsodium ベースです。検証済みのプリミティブ群には次が含まれます。

  • X25519 の鍵交換
  • XChaCha20-Poly1305 認証付き暗号化
  • Ed25519 署名
  • BLAKE2b の鍵導出
  • BIP-39 のニーモニック鍵バックアップ
  • グループ会話向けの Sender Key スキーム

マルチデバイスモデルが面白い部分です。メッセージは、1通ごとのコンテンツ鍵で一度だけ暗号化され、その鍵が一時的な鍵交換を通じて受信者の各デバイスごとに別々にラップされ、配信されます。つまり、サーバーが平文に触れることなく、同じメッセージをスマートフォン、タブレット、ウェブへ届けられるのです。実装はプラットフォーム間で共有されています。ウェブでは、暗号処理、鍵保存、ソケット処理のすべてが、鍵を IndexedDB に保持した Web Worker 上でメインスレッド外で動きます。ネイティブアプリでは、同じプリミティブが sodium の FFI バインディングを通り、鍵は安全なデバイスストレージに置かれます。

用語には注意を払っています。これは Signal 級の、libsodium ベースの、マルチデバイス E2E 暗号化です。私たちはこれを「Signal Protocol」とは呼びませんし、Double Ratchet やメッセージごとの forward secrecy も主張しません。それでも強度は十分です。サーバーはメッセージを読めず、暗号モデルはすべてのクライアントで同一です。CSCコミュニティのプラットフォームにとって、プライベートな通信は装飾的な機能ではありません。メッセージ機能がある以上、コードの最初の一行から、真剣なプライバシー境界を前提に設計されなければならないのです。

ネイティブアプリ:Flutter、オフラインファースト、高リフレッシュの規律

ネイティブアプリは Flutter で構築されています。ひとつの共通コアを共有する3つのアプリで、オフラインファーストのローカルデータベースと、ウェブサイトと同じ 生成済みの型付き契約 の上に載っています。状態管理とローカルストアは、ウェブビューを薄くかぶせただけのラッパーではなく、応答性が高く、オフライン対応の体験のために設計されています。

パフォーマンスの規律は厳格で、カスタム lint ルールによって強制されます。高リフレッシュ、120fps の挙動が目標であり、jank を引き起こすことが知られているパターン—上限なしの画像デコード、重いぼかし効果、builder を使わないリスト描画—は lint で禁止されるため、人間が気づく前にルールが回帰を捕まえます。モバイルのパフォーマンスは平均ロード時間だけではないからです。タッチ応答、アニメーションの安定性、リストの滑らかさ、そして人が一日中持ち歩く端末でアプリが信頼できるかどうかが問題になります。

アプリの構想は実用的です。近くで最良のクラブが、まもなくボタンひとつで、いつもポケットの中にある。最初は Android アプリで、その後に iOS が続きます。

自動化:コンテンツ、翻訳、更新、メディア、サイトマップ

Cannabivo には、運用者が有効化できる 自律的なコンテンツエンジンがあります。この言葉には意味があります。ボットが監視なしに24時間出稿する、という主張ではありません。運用者がオンにもオフにもできるシステムです。

有効化されると、エンジンは複数の情報源から Cannabis ニュースを調査し、自身のストーリー記憶と突き合わせて重複を排除し、構造化記事を生成し、公開前に17の他言語すべてへ翻訳します。しかもアトミックに処理するので、半分だけ翻訳された記事が公開されることはありません。さらに、16のソーシャル/配信チャネル——Telegram、X、Bluesky、Mastodon、LinkedIn、Reddit、Discord、Matrix、Facebook、Instagram、Threads、WhatsApp、Web Push、ニュースレター、汎用webhook、ブラウザ自動化チャネル——へ配信します。公に名前を出している展開は Telegram、Instagram、X から始まり、さらに追加予定です。

自動化層はまた、大規模な多言語ディレクトリを生かし続ける地味な仕組みも動かしています。

  • 自動クラブ更新ニュース
  • 画像と動画の最適化ワーカー(レスポンシブ AVIF/WebP/JPEG レイヤー、アダプティブ動画)
  • 毎晩の多言語サイトマップ再生成
  • 壊れやすい cron ジョブではなく systemd タイマーで動く多数のスケジュール済みワーカー

数十万ページ規模のプラットフォームが最新の状態を保てるのは、こうした仕組みのおかげです。コンテンツには構造が必要です。翻訳には順序が必要です。サイトマップは英語ではなく、多言語という現実を反映しなければなりません。クラブ更新は、編集者が小さな変更のたびに承認しなくても表に出る必要があります。ここで自動化は判断を置き換えるのではありません。反復的な摩擦を取り除き、人が本当に必要な部分に集中できるようにするのです。

いまの立ち位置

Cannabivo のウェブプラットフォームは本番稼働中で、継続的に保守されています。現在のフェーズは、2つの軸で同時に進んでいます。

1つ目は 安定化、微調整、検証 です。既存のクラブコンテンツを更新し、詳細を修正し、プラットフォームを着実に引き締めています。13,573件のクラブ掲載211,397件のジオページを継続的に正確かつ最新に保つディレクトリは、「完成した」とは扱えません。情報は変わり、現地の詳細も変わり、プラットフォームもそれに追いつく必要があります。

2つ目は、ネイティブモバイル開発を並行して進めること です。同じ Flutter コア、オフラインファースト、同じ型付き契約、同じパフォーマンス規律です。目標は、単純であると同時に野心的です。近くで最良のクラブが、まもなくボタンひとつで、いつもポケットの中にあること。

その両方に並行して、ソーシャルメディアチャネルと Cannabivo ニュースレターを通じて、自動化されたクラブ情報も展開しています。ホームページはすでに、最近追加されたクラブ、人気都市、国別ハブ、そしてニュースとクラブ更新のフィードによって、プラットフォームが生きていることを示しています。

10カ国すべては、いまも進行中です。これは謝るべき弱点ではなく、正直なスコープ管理です。国際カバレッジは、静的なデータベースに付けるバッジではありません。運用上のコミットメントであり、毎日更新し続けなければならないのです。

次に来るもの

Cannabivo のロードマップは段階的であり、私たちは出荷済みのもの、計画中のもの、そしてまだ議論中のものを厳密に分けています。

明るい窓の前で、Cannabisクラブディレクトリアプリを表示した現代的なスマートフォンを持ち上げている様子。背後には都市のスカイラインがやわらかくぼけている。
次に来るのはネイティブアプリとメンバーツールです。まず Android、次に iOS、その後に管理機能と周辺シーン向けのマーケットプレイスです。
期間ロードマップ
1〜2か月Play Store での Android アプリ公開。Telegram、Instagram、X などを含むさらなるソーシャルチャネル
2〜3か月App Store での iOS アプリ公開
3〜12か月以降すべてのクラブ向けのクラブ・会員管理。機材、栽培スペース、関連ニーズのためのマーケットプレイス
バックログ`{club}.cannabivo.com` 上のプレミアムクラブ・マイクロサイト。厳選プリセットと18言語でのSEO
議論中アプリ経由での高速なクラブチェックインのための Cannabivo-ID
議論中収益化モデル

Android先行、その後iOS

Androidアプリは1〜2か月以内に Play Store で公開予定で、iOSアプリは2〜3か月以内に App Store で続きます。どちらも同じ技術戦略に属しています。ひとつのコアを共有する Flutter アプリ、オフラインファーストのローカルデータベース、高リフレッシュ性能の規律、そしてウェブサイトと同じ生成済み型付き契約です。この契約を共有しているため、アプリはバックエンドの正しさを再実装ではなく継承します。そして、再実装こそがクロスプラットフォームのバグの大半が生まれる場所なのです。

クラブと会員の管理

3〜12か月の時間軸以降、Cannabivo はすべてのクラブ向けにクラブと会員の管理機能を提供することを目指しています。これは、提供済みの Club Manager を公開掲載編集から、より深い運用ツールへと拡張するものです。目的は、各クラブがすでに直面している管理上の現実に応えつつ、各クラブが自分専用のソフトウェアをゼロから作り直す必要をなくすことです。

マーケットプレイスの構想

マーケットプレイスも3〜12か月の時間軸にあり、機材、栽培スペース、そしてCSC運営に関わる関連ニーズを対象としています。これが何であり、何ではないかを正確に言うと、これはCannabis販売の主張でもなければ、消費の呼びかけでもありません。エコシステムが運営のために依存するインフラと備品に焦点を当てた、プラットフォームの方向性です。

Cannabivo-IDは現在評価中です

Cannabivo-ID は議論中です。アプリを通じて会員が迅速にクラブへチェックインできるようにするデジタルIDです。クラブにとっては手続きが少なく、会員にとっては到着がよりスムーズになります。私たちはこれを技術的にも法的にも実現可能だと考えており、現在積極的に評価しています。まだ出荷はしていませんし、その区別は明確に保ちます。

収益化はまだ未定

収益化は依然として未解決の課題です。検討中の可能性には、無料のクラブ閲覧を制限すること、プレミアム会員、広告、vape や CSC 機材ショップとの提携、そしてクラブが Cannabivo を会員管理に使うことが含まれます。現時点で最終モデルは提示していません。どの案を採るにしても、透明で、法的で、多言語で、CSCコミュニティに本当に役立つ国際情報ディレクトリというプラットフォームの役割に忠実でなければなりません。

Cannabivoの目的は、CSCコミュニティがこれまで持っていなかった国際的インフラになることです。透明で、法的で、多言語で、長く使えるように作られています。 ディレクトリは正面玄関です。その背後にある建物が、すべてを支えています。ウィキ、教育と予防のページ、ニュースシステム、FAQ、フォーラム、Club Manager、AIサポートエージェント、ネイティブアプリ、暗号化メッセージ、自動化エンジン、型付き契約、ファーストパーティ分析、そしてセキュリティアーキテクチャです。どれも単独では成り立たず、法的なCannabis情報を見つけやすくし、誤りにくくするために存在しています。 私たちは、ドイツとスペインで見えたひとつの明白なギャップから始めました。いまでは10カ国、18言語、本番規模で、成長し続けることを前提に設計されたエンジニアリング基盤の上で構築しています。ここに完了したものは何もありません。そして、ディレクトリが完成したなどと装うより、そのことを率直に伝えるほうを私たちは選びます。 最も簡潔に言える野心は、世界でその種の最良のポータルになることです。 挑戦は受けました。続報をお待ちください。

Install · one tap

Cannabivo.com
Clubs, coffeeshops & news — on your home screen.
Instant load
Saved offline
News alerts
Adds to your home screen — no store needed
Tap Share, then Add to Home Screen to install Cannabivo.
or get the native app
Google PlayApp StoreSoon