この記事は freee Developers Advent Calendar 2025 の 14 日目の記事です.
freee でエンジニア兼 Dev Branding をやっているけむりだま (@_kemuridama) です. なんだかんだで新卒で入社した 2018 年以来, 毎年 Advent Calendar に参加させてもらってます✌️
今回は先日 11/30 に行われた freee 主催の技術カンファレンス「freee 技術の日 2025」を支えた技術について書いていこうと思います.
目まぐるしく変わるセッション情報
「freee 技術の日」は 2023 年から開催して 3 回目になるんですが, 毎年起こるのがセッション情報の変更依頼です. 登壇者からはあらかじめタイトルやセッション概要, プロフィールなどを集めているのですが, どうしても期限ギリギリまで変更されるのが恒例行事になっています.
セッション情報はいろいろな場所で使われるので, 変更が起きると大量の書き換えの作業が発生します. 「freee 技術の日」は社内の運営メンバーだけではなく, 外部のイベント会社にも協力をしてもらっているので, 情報が正確でないとコミュニケーションが煩雑となりミスが起きやすくなる状況になってしまいます.
- イベントサイトのタイムテーブル
- connpass ページのタイムテーブル
- SNS 投稿用の OGP 画像
- セッション間の差し込みスライド画像
- 配信レイアウト上のテロップ
- リーフレットやタイムテーブルのポスターなどの印刷物
昨年まではこれらを手動で更新し続けていました. しかし「イベントサイトは直っているが, connpass ページは古い」といった不整合が起こりやすく, 確認などのオペレーションコストがとても高くなります. 特にイベントサイトやリーフレットやタイムテーブルのポスターなどはイベント会社に制作を依頼しているので変更が大変になります.
JSON ファイルを Single Source of Truth に
今年の「freee 技術の日」ではタイムテーブルに関係するデータを構造化し Single Source of Truth (SSOT, 信頼できる唯一の情報源) として 1 つの JSON ファイルに情報の集約を行いました.
ざっくり JSON ファイルには以下のようなものが書かれています.
- 種別
- タイトル
- 概要
- ステージ
- 登壇者情報 (名前, 役職, プロフィール, 登壇者画像)
- タグ
- 開始時間
- 終了時間
TypeSpec を使ったスキーマ定義
JSON のスキーマ定義には TypeSpec を採用しました. TypeSpec は Microsoft が開発を進めている API を設計するための言語 (DSL) で, 一般的には OpenAPI Schema を定義するために使われています. Emitter と呼ばれる出力機構を入れ替えることで様々な出力を得ることが可能になっています.
「freee 技術の日」では 1 つの TypeSpec のスキーマ定義から JSON Schema と OpenAPI Schema の 2 つが出力されるようにしました.
JSON Schema
SSOT となる JSON ファイルの信頼性が損なわれると色々なところに問題が生じます. そこで TypeSpec から出力した JSON Schema と Ajv というツールを使って JSON ファイルのバリデーションを行いました.
基本的に登壇者自身に GitHub で Pull Request を出してもらうことでセッション情報を変更する運用にしました. GitHub Actions で自動的にバリデーションを行うようにして必須項目の欠落やスキーマ違反を未然に防ぎ, JSON ファイルの構造が壊れないようにしました. (もちろん登壇者の中には非エンジニアの方もいたのでその場合は運営メンバーで変更を代行することもしていました.)
OpenAPI Schema
JSON ファイルはイベントサイトと同様にホスティングを行い, Web API のようにアクセスできるようにしました. この API の Schema を TypeSpec から OpenAPI Schema として出力しました.
社内外の実装者とは OpenAPI Schema をベースにコミュニケーションが行えるため, この API を活用してなにか実装をするときに連携がとても楽になります.
JSON を SSOT として使い倒す
JSON はプログラムで扱いやすいため, データの加工や連携が容易です. また Web API のようにアクセスができるため, 非同期で JSON ファイルを取得して処理を行うということも可能になっています.
最近だとコーディングエージェントによって, 加工や連携の処理をサクッと書くことができるので便利です ✌️ スキーマが明確に決まっているので, エージェントに指示を出すときも「スキーマ定義に従って JSON ファイルを〇〇に変換して」と伝えるだけである程度正確なコードが出てくるのが良かったです.
制作会社との連携
イベントサイトの制作は外部の会社に依頼をしています. 制作会社にはデザインや実装に集中してもらうため OpenAPI Schema を渡して, サイト上から非同期に JSON を取得してタイムテーブルを描画するように実装してもらいました. OpenAPI Schema によってインターフェースが明確になるので, データの構造に関する問い合わせが減り, 手戻りがなくなりました.

昨年まではセッション情報を含む形でサイトの制作を依頼し納品を行ってもらっていたため, freee 側でセッション情報を確定するまでサイトの制作を完了できないという問題が発生していました. ですが, 動的にタイムテーブルを更新し続ける体制を作ることができたため, セッション情報が定まり切らない状態でもサイトの制作が完了でき, freee 側も余裕を持ってセッションを整理する時間もできました.
実際に昨年のタイムテーブルのデータを使って実装を進めてもらい, 情報が固まったタイミングで今年のものに入れ替える方式を使って, イベントサイト制作とセッション情報の整理を並行して行うことができました.
また, 他にリーフレットやタイムテーブルのポスターなどの印刷物の制作も外部の会社に依頼をしています.
こういった制作物はプログラマティックに作るのが難しいため, どうしても手動で情報をデザインに反映する必要があります.
そこで JSON ファイルを CSV ファイルに変換し, IMPORTDATA() 関数を使ってインポートすることで常に最新のセッション情報が見られるスプレッドシートを社内外向けに提供しました.
社内制作物との連携
connpass のイベント説明欄は HTML や一部の CSS を書くことができるため, いい感じにマークアップして connpass ページにもタイムテーブルを掲載しました.
JSON ファイルを hastscript を使ってタイムテーブルに加工し, すぐにタイムテーブルを更新できるようにしました. (残念ながら connpass にはイベントを操作する API がないので, 加工後のデータの反映は手動になります…)

SNS 投稿用の OGP 画像やセッション間の差し込みスライド用の画像も JSON ファイルと @vercel/og を使って自動で生成できるようにしました.

また, NodeCG を使った配信レイアウトで使うセッションテロップも JSON ファイルを元に動的に描画することができました.

技術で支えた「freee 技術の日 2025」
JSON ファイルを Single Source of Truth (SSOT) として運用することで, これまで手動で行っていたセッション情報の更新作業の多くを自動化することができました. 特に外部のイベント会社との連携で情報の受け渡しミスや確認の手間を減らせたことはとても大きなメリットとなりました.
「freee 技術の日」だけにかかわらず, 技術カンファレンスの運営は泥臭い作業が多いです. 一部にはなりますが, その裏側の運営プロセスをエンジニアリングで解決し, 技術で「freee 技術の日」を支えられたのはとても良かったんじゃないかなと思っています.
来年はさらにこの仕組みをブラッシュアップして, もっと本質的なコンテンツ企画に時間を使えるようにしていきたいです. 一緒に「freee 技術の日」を盛り上げたい人は入社もお待ちしてます🙌
明日の freee Developers Advent Calendar 2025 は「freee 技術の日 2025」の企画や当日の YouTube 配信を一緒にやってくれた pon さんの記事が投稿される予定です. お楽しみに!!
