諸君、集まってくれて感謝する。
私は、ただのツールマニュアルを読み解くだけの凡庸なエンジニアリングには興味がない。我々が求めるのは、そのツールの真髄を理解し、秘められた力を解放することで、チームのベロシティを劇的に加速させる『極限の知見』だ。
今日、我々が俎上に載せるのは「Notion」。
「万能のワークスペース」と謳われるこのツールは、その自由度と表現力で多くの開発チームに導入された。しかし、その一方で「データが重くなると動作が鈍い」「容量が尽きるのでは?」といった『成長の痛み』に直面しているチームも少なくない。
貴様らは、Notionを単なるメモ帳やタスクリストとしてしか使っていないのではないか?
それは、F-22 Raptorをただの荷物運搬機として使うようなものだ。
本日は、Notionのデータベースが数万件規模に達した際のパフォーマンス劣化の深淵を解き明かし、それを回避するための自動アーカイブ戦略、そして容量枯渇を過去のものとする外部ストレージ連携の自動化設計について、私の持つ全てを伝授しよう。
これは、マニュアルには決して載らない、現場で震えるほど役立つ実践テクニックだ。
—
Notionのデータ限界を突破せよ!数万件規模DBと爆速アーカイブ戦略、外部ストレージ連携の極意
1. データベースが数万件を超えた際のパフォーマンス劣化の深淵
Notionのデータベースは、その柔軟なビューと強力なフィルタリング機能で我々の情報管理を革新した。しかし、ページ数が数千、数万と増え、特に画像やファイル添付が増大すると、クライアントアプリケーションが重くなる、ページロードに時間がかかる、といった現象に見舞われる。これはNotionの設計思想に深く根差した理由がある。
Notionは基本的に「シングルページアプリケーション(SPA)」として動作し、データはクライアントサイドでレンダリングされる。ユーザーがデータベースビューを開くと、NotionのAPIを通じてサーバーから必要なデータがフェッチされる。このとき、数万件規模のデータベースでは以下の問題が発生する。
1. APIレスポンスの肥大化とレイテンシ:
NotionのAPIは、単一のリクエストで取得できるページ数に制限がある(デフォルトで100件、最大100件)。しかし、ビュー全体を構築するために必要なメタデータ(プロパティ定義、リレーション情報など)は、データベースの規模が大きくなるほど複雑になる。また、フィルタリングやソート条件が複雑化すると、サーバーサイドでの処理時間も増加し、結果的にクライアントへのデータ転送に時間がかかる。
2. クライアントサイドでのレンダリング負荷:
取得したデータをクライアントのブラウザやデスクトップアプリが解析し、表示するためのDOM(Document Object Model)を構築する。数万件のデータを扱う場合、仮に表示されるのが100件であっても、データベース全体からのフィルタリングやソート処理は、時にクライアントサイドでJavaScriptによって行われる部分もあり、CPUとメモリを大量に消費する。特にリレーションプロパティが多く、関連するデータベースへの参照が頻繁に発生すると、その負荷は指数関数的に増大する。
3. キャッシュの非効率化:
Notionはデータをキャッシュするが、更新頻度が高い大規模データベースではキャッシュの有効期限が切れやすく、常に新鮮なデータをフェッチする必要がある。結果として、キャッシュヒット率が低下し、毎回APIコールが発生する頻度が増える。
【テックリードからの警告】
Notionを「無限に書き込めるメモ帳」と誤解してはならない。それは、適切なインデックスを持たないRDBMSに全てのデータを突っ込むようなものだ。戦略なきデータ投入は、いずれ必ずパフォーマンスの壁にぶつかる。この壁を乗り越えるためには、データのライフサイクル管理と、適切なストレージ戦略が不可欠だ。
2. 古いデータを別のアーカイブ用データベースへ自動移行するワークフロー
パフォーマンス劣化の最も効果的な対策は、「必要なデータだけを、必要な時に、必要な場所で」 扱うことだ。そのためには、活動中のメインデータベースから、活動停止したアーカイブ対象データを定期的に分離する自動アーカイブ戦略が必須となる。
2.1. 設計思想:データベースの役割分離
- メインデータベース (e.g., `Tasks & Issues (Active)`): 現在進行中のタスク、進行中のプロジェクトに関するドキュメントなど、頻繁に参照・更新されるデータのみを保持する。
- アーカイブデータベース (e.g., `Tasks & Issues (Archived)`): 完了済み、終了済み、参照頻度が極めて低いが履歴として保持すべきデータを格納する。メインDBと同じプロパティ構造を持つことが重要。
2.2. 自動アーカイブワークフローの構築
このワークフローは、Notion APIを活用し、特定の条件を満たしたページをメインDBからアーカイブDBへ自動的に移動させることで実現する。
1. Notion APIのセットアップ:
- Notion Integrationを作成し、Internal Integration Tokenを取得する。
- メインDBとアーカイブDBの両方に、作成したIntegrationを招待する(`Share`ボタンから)。
2. アーカイブ条件の定義:
アーカイブのトリガーとなるプロパティをメインDBに設定する。
例:
- `Status` プロパティが `Done` になり、かつ `Updated at` (最終更新日時) がN日以上前。
- `Archive Flag` (チェックボックス) が `Checked` になっている。
- `Due Date` (期限) がM日以上過去であり、かつ `Status` が `Done`。
3. Pythonスクリプトによる自動移行:
Notion API (Python SDK) を使用して、定義した条件に合致するページを検索し、アーカイブDBへ移動させるスクリプトを作成する。
import os
from notion_client import Client
from datetime import datetime, timedelta
— 環境変数からNotion APIトークンとデータベースIDを取得 —
Notion Integration Token (Settings & members -> Integrations)
NOTION_TOKEN = os.environ.get(“NOTION_TOKEN”)
メインデータベースのID (URLの `notion.so/` の後、`?` の前)
ACTIVE_DB_ID = os.environ.get(“NOTION_ACTIVE_DB_ID”)
アーカイブデータベースのID
ARCHIVE_DB_ID = os.environ.get(“NOTION_ARCHIVE_DB_ID”)
if not all([NOTION_TOKEN, ACTIVE_DB_ID, ARCHIVE_DB_ID]):
raise ValueError(“NOTION_TOKEN, NOTION_ACTIVE_DB_ID, NOTION_ARCHIVE_DB_ID environment variables must be set.”)
notion = Client(auth=NOTION_TOKEN)
def archive_old_pages():
“””
指定された条件に合致するNotionページをアクティブDBからアーカイブDBへ移動します。
“””
print(f”— Notion Archiving Process Started —“)
# 例: 30日以上前に完了したタスクをアーカイブ
archive_threshold_date = datetime.now() – timedelta(days=30)
# フィルタリング条件の定義
# ‘Status’ プロパティが ‘Done’ で、かつ ‘Last edited time’ が指定日より古いページを対象
filter_condition = {
“and”: [
{
“property”: “Status”,
“status”: {
“equals”: “Done”
}
},
{
“property”: “Last edited time”, # Notion UIでは「最終更新日時」
“date”: {
“before”: archive_threshold_date.isoformat()
}
}
]
}
try:
# アクティブDBから条件に合致するページを検索
# notion-clientのsearchメソッドはデータベースIDによるフィルタリングが直接できないため、
# databases.queryメソッドを使用する
response = notion.databases.query(
database_id=ACTIVE_DB_ID,
filter=filter_condition,
page_size=100 # 一度に取得するページ数 (APIの最大値は100)
)
pages_to_archive = response.get(“results”, [])
print(f”Found {len(pages_to_archive)} pages to archive.”)
for page in pages_to_archive:
page_id = page[“id”]
page_title = page[“properties”].get(“Name”, {}).get(“title”, [{}])[0].get(“plain_text”, “No Title”)
print(f”Archiving page: ‘{page_title}’ (ID: {page_id})…”)
try:
# ページをアーカイブDBへ移動 (親を更新)
# 親の変更は、ページを別のデータベースへ移動する操作に相当します。
# この操作はページを物理的に移動させるのではなく、親データベースのリレーションを変更します。
# ただし、Notion APIのPageオブジェクトの親を直接別のデータベースに変更する機能は
# 現在(2023年末時点)は提供されていません。
# 正しいアーカイブ方法は、ページを「アーカイブ済み」としてマークするか、
# 既存のページを複製して新しい親データベースに作成し、元のページを削除する、などです。
# ここでは、最もシンプルな「ページをアーカイブする(ゴミ箱に入れる)」処理を実装します。
#
# !!! 注意 !!!
# ページをゴミ箱に入れる操作は元に戻せません(30日間の猶予はありますが)。
# 複製して移動する場合は、別途複製と削除のロジックを実装する必要があります。
# 実運用では、先にアーカイブDBに複製を作成し、成功したら元を削除するべきです。
# ここでは「Notionのアーカイブ機能(ゴミ箱へ移動)」を使用する
# is_archived: True に設定することで、ページをアーカイブ(ゴミ箱へ移動)します。
notion.pages.update(
page_id=page_id,
archived=True # ページをアーカイブ状態にする
)
print(f”Successfully archived page: ‘{page_title}’.”)
except Exception as e:
print(f”Failed to archive page ‘{page_title}’ (ID: {page_id}): {e}”)
print(f”— Notion Archiving Process Finished —“)
except Exception as e:
print(f”An error occurred during the archiving process: {e}”)
if __name__ == “__main__”:
archive_old_pages()
【重要補足とベストプラクティス】
上記のスクリプトは、Notionの「アーカイブ機能」(実質的なゴミ箱への移動)を使用している。これは最もシンプルな方法だが、アーカイブデータベースに「移動」させるというよりは「削除」に近い。
より堅牢なアーカイブ戦略としては、以下の手順を推奨する。
1. アーカイブ対象ページの複製: メインDBからアーカイブ対象ページを読み込み、その内容(タイトル、プロパティ、コンテンツ)をそのままアーカイブDBに新しいページとして作成する。
2. 元のページの削除: 複製が成功したことを確認後、メインDBの元のページを削除(`archived=True`)する。
3. リレーションの再構築: もしアーカイブ対象ページが他のアクティブなページとリレーションを持っていた場合、そのリレーションが壊れないように、アーカイブDB側のページにリレーションを再構築するか、リレーションプロパティをアーカイブDBでは無視する設計とする。
この「複製&削除」戦略はより複雑だが、データの完全性を保ちつつ、アーカイブDBでの独立した運用を可能にする。Notion APIの`pages.create()`と`blocks.children.append()`を組み合わせることで実現可能だ。
2.3. スケジューリングと自動実行
このスクリプトを定期的に実行するために、以下のツールを活用する。
- GitHub Actions:
CI/CDパイプラインの一部として、あるいは独立したワークフローとして定期実行させる。`.github/workflows/archive_notion.yml` の例:
name: Archive Old Notion Pages
on:
schedule:
# 毎日午前3時に実行 (UTC)
- cron: ‘0 3 ‘
workflow_dispatch: # 手動実行を可能にする
jobs:
archive:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: ‘3.9’ # 使用するPythonバージョンを指定
- name: Install dependencies
run: |
pip install notion-client
- name: Run Notion Archiving Script
env:
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }} # GitHub Secretsに登録
NOTION_ACTIVE_DB_ID: ${{ secrets.NOTION_ACTIVE_DB_ID }}
NOTION_ARCHIVE_DB_ID: ${{ secrets.NOTION_ARCHIVE_DB_ID }}
run: python your_archive_script.py # スクリプトのファイル名を指定
【チーム開発の共有化ルール】
- APIトークンはGitHub Secretsに登録し、コードに直接書き込まない。
- スクリプトはGitでバージョン管理し、Pull Requestベースで変更をレビューする。
- アーカイブ条件や実行頻度はチームで合意形成し、Notion上の共有ドキュメントに明記する。
- Zapier / Make.com (旧 Integromat):
GUIベースでNotionとの連携を容易にする強力なノーコード/ローコードツール。Notionのトリガー(例: `Database item updated`)とアクション(例: `Update a database item`, `Create a database item`)を組み合わせて、より複雑なワークフローも構築できる。
【神プラグインとしての活用】
これら連携ツールは、Notion APIを直接叩く手間を省き、非エンジニアでも自動化ワークフローを構築できる「神プラグイン」と呼べる存在だ。エンジニアは基盤を整え、非エンジニアがワークフローを最適化する。これが生産性向上の秘訣だ。
3. 重い画像や動画ファイルをNotion内に直接保存せず、外部ストレージ連携の自動化設計
Notionの容量制限は厳密には公開されていないが、Freeプランではブロック数の上限があり、ファイルアップロードサイズにも制限がある (5MB)。ワークスペースプランでは無制限となるが、それでもNotionに直接ファイルを大量にアップロードすることは避けるべきだ。
3.1. なぜ外部ストレージを利用するのか?
1. パフォーマンス: NotionはファイルをCDN経由で配信するが、大量の画像や動画をページ内に埋め込むと、ページのロード時間が著しく増加する。外部ストレージ(特にCDNと連携したS3など)は、より高速でスケーラブルなファイル配信を提供する。
2. コスト効率: Notionのストレージコストは間接的だが、S3のようなサービスは通常、より安価に大容量ストレージを提供する。
3. バージョン管理とアクセス制御: 外部ストレージでは、より高度なバージョン管理や詳細なアクセス制御(署名付きURLなど)が可能になる。
4. バックアップとリカバリ: Notionのバックアップ機能とは別に、ファイルレベルでのバックアップ戦略を独立して構築できる。
5. データ可搬性: Notionから別のツールへ移行する際に、ファイル資産を容易に移動できる。
3.2. 外部ストレージ連携の運用設計
Notionのデータベースに「ファイルURL」プロパティを追加し、そこに外部ストレージ上のファイルのリンクを保存する。
【Google Drive / Dropbox の場合】
- 運用: ファイルをGoogle DriveやDropboxにアップロードし、共有リンクを生成。そのリンクをNotionのデータベースのURLプロパティに貼り付ける。
- Notionでの表示: NotionはGoogle DriveのドキュメントやPDF、画像などを埋め込み(Embed)ブロックで表示できる。動画は直接再生可能な場合もある。
- 自動化: Google Drive APIやDropbox APIを活用すれば、特定のフォルダへのファイルアップロードをトリガーに、Notionデータベースに新しいページを作成し、ファイルURLを自動登録することも可能。しかし、これはS3と比べると複雑になりがちだ。
【AWS S3 + CloudFront の場合】
開発チームにとっては、S3とCloudFrontの組み合わせが最も堅牢でスケーラブルな選択肢となる。
1. S3バケットの準備:
- バージョン管理を有効にする。
- 適切なIAMポリシーでアクセスを制限する。
- クロスオリジンリソース共有 (CORS) 設定をNotionのドメインからのアクセスを許可するように構成する。
- バケットポリシー例 (YAML形式 – CloudFormationやCDKで管理する想定):
# S3バケットポリシー (例: CloudFormation Resource)
Resources:
MyNotionAssetBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: my-notion-assets-production
VersioningConfiguration:
Status: Enabled
PublicAccessBlockConfiguration: # 公開アクセスをブロックし、CloudFront経由でのみアクセスさせる
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
# CORS設定例: Notionからの埋め込みを許可
CorsConfiguration:
CorsRules:
- AllowedHeaders:
- “”
AllowedMethods:
- GET
- HEAD
AllowedOrigins:
- “https://www.notion.so”
- “https://notion.so”
ExposedHeaders: []
MaxAge: 3000
2. CloudFrontディストリビューションの設定:
- S3バケットをオリジンとして設定。
- Origin Access Control (OAC) を使用して、S3バケットへの直接アクセスをブロックし、CloudFront経由でのみアクセスを許可する。
- キャッシュポリシーを最適化し、画像や動画ファイルの配信を高速化する。
- 署名付きURL/Cookieが必要な場合は、CloudFrontで設定する。
3. Notionデータベースのプロパティ:
- `ファイルURL` (URLプロパティ)
- `ファイルタイプ` (Selectプロパティ: `Image`, `Video`, `Document`など)
- `アップロード日時` (Dateプロパティ)
- `S3パス` (Textプロパティ: S3上のオブジェクトキーを保存)
4. ファイルアップロードの自動化スクリプト:
ユーザーがファイルをローカルからNotionにアップロードするのではなく、専用のアップローダースクリプトやWebサービスを通じてS3にアップロードし、そのURLをNotionに登録する。
import os
import boto3
from notion_client import Client
from datetime import datetime
# — 環境変数から設定値を取得 —
AWS_ACCESS_KEY_ID = os.environ.get(“AWS_ACCESS_KEY_ID”)
AWS_SECRET_ACCESS_KEY = os.environ.get(“AWS_SECRET_ACCESS_KEY”)
S3_BUCKET_NAME = os.environ.get(“S3_BUCKET_NAME”)
CLOUDFRONT_DOMAIN = os.environ.get(“CLOUDFRONT_DOMAIN”) # e.g., d123abc456def.cloudfront.net
NOTION_TOKEN = os.environ.get(“NOTION_TOKEN”)
NOTION_DB_ID = os.environ.get(“NOTION_DB_ID”)
if not all([AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, S3_BUCKET_NAME, CLOUDFRONT_DOMAIN, NOTION_TOKEN, NOTION_DB_ID]):
raise ValueError(“All required environment variables must be set for AWS and Notion.”)
s3_client = boto3.client(
‘s3’,
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY
)
notion_client = Client(auth=NOTION_TOKEN)
def upload_file_to_s3_and_register_notion(local_file_path: str, notion_page_title: str, file_type: str = “Image”):
“””
ローカルファイルをS3にアップロードし、そのURLをNotionデータベースの新しいページに登録します。
“””
file_name = os.path.basename(local_file_path)
s3_object_key = f”notion-assets/{datetime.now().strftime(‘%Y/%m/%d’)}/{file_name}”
try:
# S3へアップロード
s3_client.upload_file(local_file_path, S3_BUCKET_NAME, s3_object_key)
# CloudFront URLを生成
file_url = f”https://{CLOUDFRONT_DOMAIN}/{s3_object_key}”
print(f”File uploaded to S3: {file_url}”)
# Notionデータベースに新しいページを作成し、情報を登録
new_page_properties = {
“Name”: { # データベースのタイトルプロパティ (通常は’Name’)
“title”: [
{ “text”: { “content”: notion_page_title } }
]
},
“ファイルURL”: { # NotionのURLプロパティ名
“url”: file_url
},
“ファイルタイプ”: { # NotionのSelectプロパティ名
“select”: { “name”: file_type }
},
“アップロード日時”: { # NotionのDateプロパティ名
“date”: { “start”: datetime.now().isoformat() }
},
“S3パス”: { # NotionのTextプロパティ名
“rich_text”: [
{ “text”: { “content”: s3_object_key } }
]
}
}
notion_client.pages.create(
parent={“database_id”: NOTION_DB_ID},
properties=new_page_properties
)
print(f”Notion page ‘{notion_page_title}’ created with S3 file URL.”)
except Exception as e:
print(f”Error during file upload or Notion registration: {e}”)
if __name__ == “__main__”:
# 実行例
# 仮のファイルを作成 (実運用では既存ファイルパスを指定)
with open(“test_image.jpg”, “w”) as f:
f.write(“dummy image content”)
upload_file_to_s3_and_register_notion(
local_file_path=”test_image.jpg”,
notion_page_title=”Project A – Screenshot X”,
file_type=”Image”
)
os.remove(“test_image.jpg”) # テストファイルを削除
【チーム開発で役立つ設定の共有化ルール】
- ファイル命名規則: S3にアップロードするファイルの命名規則を統一する(例: `project-name/feature-name/YYYYMMDD-description.jpg`)。
- フォルダ構造: S3バケット内のフォルダ構造を定義し、チーム全体で共有する。
- Notionテンプレート: ファイル添付が必要なNotionページテンプレートには、「S3にアップロード後、ここにURLを貼る」といったガイドラインを明記する。
- アクセス権限: S3バケットへのアップロード権限を持つIAMユーザー/ロールを最小限に絞り、必要に応じて署名付きURLの発行を自動化する仕組みを検討する。
- スクリプト管理: 上記のPythonスクリプトはGitで管理し、環境変数や設定ファイル(YAML/JSON)でAWSとNotionの情報を分離する。
【実用的な設定ファイル (YAML) のベストプラクティス】
スクリプトの実行に必要な設定は、コードにハードコードせず、外部設定ファイルに記述することで、環境ごとの切り替えや管理を容易にする。
config.yaml
aws:
s3_bucket_name: “my-notion-assets-production”
cloudfront_domain: “d123abc456def.cloudfront.net” # CloudFrontのドメイン名
notion:
database_id: “your_notion_database_id” # ファイルURLを登録するNotion DBのID
properties_mapping: # Notion DBのプロパティ名とスクリプト内のキーのマッピング
title_property: “Name”
url_property: “ファイルURL”
type_property: “ファイルタイプ”
upload_date_property: “アップロード日時”
s3_path_property: “S3パス”
archive_strategy:
active_db_id: “your_active_notion_db_id”
archive_db_id: “your_archive_notion_db_id”
archive_conditions:
status_property: “Status”
done_status_value: “Done”
last_edited_property: “Last edited time”
archive_after_days: 30 # N日以上前に完了したものをアーカイブ
この設定ファイルをPythonスクリプトから読み込むことで、柔軟な運用が可能になる。
(例: `import yaml; config = yaml.safe_load(open(‘config.yaml’))`)
開発スピードを劇的に高める隠れたキーボードショートカットと神プラグイン
我々は時間を金で買う。いや、時間そのものが我々開発チームの命だ。Notionの操作一つ一つを高速化することで、その命を最大限に燃焼させよう。
隠れたキーボードショートカット (Notionデスクトップ/Webアプリ)
- `Cmd/Ctrl + P`: クイックファインダー。これぞNotionの生命線。どんな深い階層にいても、これ一つでページを検索し、開く、または新規作成できる。マウスを握るな、キーボードから手を離すな。
- `Cmd/Ctrl + Shift + L`: ダークモード切り替え。作業環境を瞬時に最適化。これは集中力を保つための儀式だ。
- `Cmd/Ctrl + \`: サイドバーの表示/非表示切り替え。画面を広く使いたい時に。
- `Cmd/Ctrl + Shift + E`: エクスポート。データベースやページ全体をMarkdown, CSV, PDFなどで瞬時にエクスポート。バックアップや他のツールへの移行時に重宝する。
- `Cmd/Ctrl + Shift + N`: 新しいウィンドウで開く。リファレンスを見ながら作業する際に必須。
- `@` + (ページ名/日付/人): メンション。タスクの担当者、関連ページ、期限などを素早く指定。
- `/` + (ブロックタイプ): コマンドメニュー。あらゆるブロックをキーボードから呼び出す。`block`, `callout`, `code`, `table`… もはやタイピングゲームだ。
絶対に入れるべき「神プラグイン」
1. Notion Web Clipper (ブラウザ拡張機能): Webページを瞬時にNotionに保存。リサーチや参考資料のストックに必須。特定のデータベースに直接送る設定も可能だ。
2. Notion Enhancer (非公式だが強力): デスクトップアプリのカスタマイズツール。カスタムCSS、テーマ、フォント変更、サイドバーの自動非表示など、Notionをさらに自分の手に馴染ませる。ただし、非公式であるため、Notionのアップデートで動作しなくなるリスクは理解しておくべきだ。
3. Zapier / Make.com (再掲): Notin APIを抽象化し、他のサービス(Slack, GitHub, Google Calendarなど)との連携をノーコードで実現。これにより、Notionをチームのワークフローのハブとして機能させ、手動でのデータ転記作業を根絶できる。我々の時間は、創造的な問題解決のためにある。ルーティンワークに食い潰されるな。
終わりに:Notionを「生きるシステム」として運用せよ
Notionは、単なるドキュメントツールではない。それは、我々のプロジェクトの生命線であり、チームの集合知を司る「生きるシステム」だ。
データが増えれば増えるほど、そのシステムの血管は詰まり、動きが鈍くなる。今日の知見は、その血管を常に清潔に保ち、淀みなく情報を流し続けるための手術道具だ。
データベースのアーカイブ、外部ストレージとの連携、そして極限まで磨き上げられた操作速度。これら全ては、貴様らのチームが「情報洪水」に溺れることなく、常に最速で価値を生み出し続けるための基盤となる。
Notionを「なんとなく使う」フェーズは終わりだ。
今日から、貴様らはNotionを戦略的に、そして自動的に運用する。
その先に、開発ベロシティの劇的な向上と、真の情報共有、そして創造的なチームの未来が待っている。
行け、そして世界を変えろ。