Re:placement

  • TOP
  • WORKS
  • ABOUT
  • WebGL

den

このページでは、これまでに習得した技術スタックをもとに試作したページを紹介しています。
実際に触れていただくことで、具体的な機能や表現をご覧いただけます。

den
『巣穴』転じて『隠れ家』『書斎』『趣味の部屋』
prot
『試作品』を意味するプロトタイプの略
dev frame
dev
library frame
library

prot01

「prot01」のメインビジュアル
https://replacement.jp/den/prot01/
Node.jsNode.js
ReactReact
Next.jsNext.js
FirebaseFirebase
HighChartsHighCharts
fullPage.jsfullPage.js

HighChartsとfullPage.jsを利用した、データ連携型チャートサイト(サンプル)

prot05

「prot05」のメインビジュアル
https://replacement.jp/den/prot05/
Node.jsNode.js
Vue.jsVue.js
ViteVite
fullPage.jsfullPage.js
GSAPGSAP

fullPage.jsを利用したビジュアル重視のWebサイト(サンプル)

prot06

「prot06」のメインビジュアル
https://replacement.jp/den/prot06/
Node.jsNode.js
Vue.jsVue.js
ViteVite
FirebaseFirebase
axiosaxios

Firestoreを利用した掲示板(サンプル)

prot08

「prot08」のメインビジュアル
https://prot08.replacement.jp/
Node.jsNode.js
ReactReact
Next.jsNext.js
GitHubGitHub
VercelVercel
Tailwind CSSTailwind CSS
microCMSmicroCMS

Next.jsとmicroCMSを組み合わせた、カフェ風のWebサイト(サンプル)

prot09

「prot09」のメインビジュアル
https://replacement.jp/den/prot09
Node.jsNode.js
Vue.jsVue.js
ViteVite

OpenWeather APIを利用した、都市の現在の気温を表示する機能

prot10

「prot10」のメインビジュアル
https://prot10.replacement.jp/
Node.jsNode.js
ReactReact
Next.jsNext.js
GitHubGitHub
VercelVercel
RenderRender
Google Apps ScriptGoogle Apps Script
ExpressExpress
JWTJWT
corscors

フロントエンドとバックエンドが独立した、セキュアな音楽ストリーミングサービス(サンプル)

prot11

「prot11」のメインビジュアル
https://prot11.replacement.jp/
Node.jsNode.js
ReactReact
Next.jsNext.js
GitHubGitHub
VercelVercel
FirebaseFirebase
Chart.jsChart.js

FirebaseとChart.jsを組み合わせた、インタラクティブなグラフ表示アプリケーション

prot12

「prot12」のメインビジュアル
https://prot12.replacement.jp/
Node.jsNode.js
ReactVue.js
NuxtNuxt
GitHubGitHub
NetlifyNetlify
LottieLottie
SwiperSwiper

SwiperとLottieアニメーションを組み合わせた、スライド型Webサイト(サンプル)

prot13

「prot13」のメインビジュアル
https://replacement.jp/den/prot13
Node.jsNode.js
Vue.jsVue.js
ViteVite
UnsplashUnsplash
axiosaxios

スケルトンスクリーンとUnsplash APIを組み合わせた、ギャラリー形式の写真表示サイト(サンプル)

prot14

「prot14」のメインビジュアル
https://replacement.jp/den/prot14
Node.jsNode.js
Vue.jsVue.js
ViteVite
GSAPGSAP
Three.jsThree.js

GSAPとThree.jsを組み合わせた、モダンなコーポレートサイト(サンプル)

prot15

「prot15」のメインビジュアル
https://replacement.jp/den/prot15
Node.jsNode.js
Vue.jsVue.js
ViteVite
Tailwind CSSTailwind CSS
GSAPGSAP
Three.jsThree.js

GSAPとThree.jsを活用した、ページ遷移アニメーションを備えたSPA

prot17

「prot17」のメインビジュアル
https://replacement.jp/den/prot17
WordPressWordPress
DockerDocker
Node.jsNode.js
SassSass

開発にDockerを活用したWordPressサイト(サンプル)

prot19

「prot19」のメインビジュアル
https://replacement.jp/den/prot19
Node.jsNode.js
gulpgulp
SassSass

gulpとesbuildで構築した、クライアントサイド完結型のWebP画像変換・ダウンロードツール

prot20

「prot20」のメインビジュアル
https://replacement.jp/den/prot20
Node.jsNode.js
WebpackWebpack
EJSEJS
SassSass
SwiperSwiper
FancyboxFancybox

株式会社フロム・ソフトウェアのコーポレートサイトを模倣し、PC/SP対応UIやロードモアを再現した静的サイト(サンプル)

prot21

「prot21」のメインビジュアル
https://prot21.replacement.jp/admin/login Claudeバイブコーディング
Node.jsNode.js
Vue.jsVue.js
NuxtNuxt
GitHubGitHub
VercelVercel
PostgreSQLPostgreSQL
SupabaseSupabase
CloudinaryCloudinary
Google Apps ScriptGoogle Apps Script
Chart.jsChart.js
JWTJWT

バイブコーディングで構築した、店舗情報を管理できる小規模飲食店向けWebアプリ(Nuxt 3 + Supabase + Cloudinary)

prot22

「prot22」のメインビジュアル
https://replacement.jp/den/prot22

カラーフォント(COLRv1)技術を用いて、日本の自治体の市章をフォント化し、ブラウザ上で好きな文章を入力して表示・体験できるWebページ

prot23

「prot23」のメインビジュアル
https://replacement.jp/den/prot23 Claudeバイブコーディング
Node.jsNode.js
Cloudflare WorkersCloudflare Workers

バイブコーディングで構築した、野球実況配信者向けのリアルタイムOBSオーバーレイサービス(Cloudflare Workers + Durable Objects)

prot01

Node.jsNode.js
ReactReact
Next.jsNext.js
FirebaseFirebase
HighChartsHighCharts
fullPage.jsfullPage.js

HighChartsとfullPage.jsを利用したデータ連携型チャートサイト(サンプル)

「prot01」のメインビジュアル

このプロジェクトは、データ連携型のインタラクティブ・チャートサイトです。各ページには異なるチャートコンポーネントが配置され、ユーザーがページを移動するときにFramer Motionによるアニメーション演出が滑らかに再生されるよう設計されています。ページ構成はfullpage.jsによる縦スクロール遷移で構成され、セクションごとの動作やアニメーションが動的に制御されます。

チャート描画にはHighchartsを採用しており、各グラフ(例:折れ線グラフ、円グラフなど)は独立したReactコンポーネントとして実装されています。データはFirebase Realtime Databaseと連携しており、グラフ上のポイントをクリックすると数値がランダムに更新され、その変更がリアルタイムでFirebaseに反映されます。また、リセットボタンを押すことで、Firebase上のデータを初期状態に戻すこともできます。これにより、動的なデータ操作と可視化を簡潔なUIで実現しています。

フロントエンドはNext.js(Pages Router構成)とReactで構築されており、サーバーレス環境にも対応しています。各ページはpages/ディレクトリ配下で管理され、_app.jsや_document.jsで全体設定や共通レイアウトを制御しています。ビルド時には**Next.jsの静的エクスポート機能(output: export)**を利用して静的ファイルとして出力され、ホスティング環境に依存せず軽量に配信できる構成になっています。

prot05

Node.jsNode.js
Vue.jsVue.js
ViteVite
fullPage.jsfullPage.js
GSAPGSAP

fullPage.jsを利用したビジュアル重視のWebサイト(サンプル)

「prot05」のメインビジュアル

JavaScriptライブラリページのfullPage.jsと、GSAP(GreenSock Animation Platform)を組み合わせたスライド型Webサイト(サンプル)です。ページをスクロールするとともに、セクションごとにコンテンツが遷移する設計になっています。セクション遷移時にアニメーションが開始されるため、視覚的なインパクトを提供することができます。

また、このサイトはVue.jsを使用して構築されています。Vue.jsは、リアクティブなUIを作成するための強力なフレームワークであり、コンポーネントベースのアーキテクチャを活用しています。開発効率を高めるため、Viteをビルドツールとして使用しており、Viteの高速なビルドとホットリロード機能により、開発中の作業がスムーズに進みます。

prot06

Node.jsNode.js
Vue.jsVue.js
ViteVite
FirebaseFirebase
axiosaxios

Firestoreを利用した掲示板(サンプル)

「prot06」のメインビジュアル

Firestore (Cloud Firestore) は、Google Firebaseが提供するNoSQLデータベースです。クラウド上にデータを保存し、モバイルやWebアプリケーションでよく利用されます。

axiosは、HTTP通信(データの更新・取得)を簡単に行うことができる、JavaScriptのライブラリです。axiosを使ってFirestoreのREST APIを呼び出すことで、柔軟なデータ操作が可能です。

スケーラブルでリアルタイムなバックエンドを提供するFirestoreと、HTTPリクエストをシンプルに行うaxios、そして直感的なフロントエンドフレームワークであるVue.js。この組み合わせは、効率的でスムーズなWebアプリケーションを構築する際に非常に有効です。

prot08

Node.jsNode.js
ReactReact
Next.jsNext.js
GitHubGitHub
VercelVercel
Tailwind CSSTailwind CSS
microCMSmicroCMS

Next.jsとmicroCMSを組み合わせた、カフェ風のWebサイト(サンプル)

「prot08」のメインビジュアル

Next.jsは、Reactをベースに開発された、フロントエンドフレームワークです。
レンダリング手法にSSGを用いて、ビルド時にすべてのページを事前に生成することで、ユーザーがページにアクセスした際にサーバーからのデータ取得を待つ必要がなく、非常に迅速にコンテンツが表示されます。

microCMSは、ヘッドレスCMS(Content Management System)の一種で、コンテンツ管理とAPIベースのデータ配信に特化したクラウド型サービスです。
Webhookを利用することで、microCMSでコンテンツの更新や作成があったときに、自動でビルドを開始しサイトを更新することができます。ユーザー側は技術的な作業を意識せずに管理画面のみで操作が完結します。

Tailwind CSSは、ユーティリティファースト(Utility-First)のCSSフレームワークです。 ビルドプロセスでPurgeCSS(パージ機能)が実行され、不要なCSSが含まれずに、軽量・コンパクトなファイルが生成されます。

prot09

Node.jsNode.js
Vue.jsVue.js
ViteVite

OpenWeather APIを利用した、都市の現在の気温を表示する機能

「prot09」のメインビジュアル

都市名をクリックするとその都市の天気情報を表示します。都市名を入力して追加することもできます。追加した都市は削除も可能。

OpenWeather APIという外部APIを利用して、都市の天気情報(温度、天気アイコンなど)を取得。fetchを使ってAPIからデータを取得し、その結果を表示します。

観光情報サイトにも使えそうな機能です。

prot10

Node.jsNode.js
ReactReact
Next.jsNext.js
GitHubGitHub
VercelVercel
RenderRender
Google Apps ScriptGoogle Apps Script
ExpressExpress
JWTJWT
corscors

フロントエンドとバックエンドが独立した、セキュアな音楽ストリーミングサービス(サンプル)

「prot10」のメインビジュアル

ユーザーに音楽を安全にストリーミング配信することを目的としたサービスです。特定の音楽トラックをクリックすることで、ブラウザ上で直接再生できる仕組みを提供しています。このサービスの特徴は、セキュリティとユーザー体験の両方を重視した設計にあります。

まず、技術スタックとしては、Next.js(Vercelが開発したフレームワーク)を用いてフロントエンドを構築しています。また、バックエンドにはNode.jsとExpress.jsを採用し、音楽ファイルへのセキュアなアクセスを提供するAPIを構築しました。このAPIは、Renderというクラウドホスティングサービス上で動作します。フロントエンドとバックエンドが独立して運用されるため、それぞれの役割に特化した最適化が可能です。技術選定に関してはAIアシスタントの助けを借りながら行いました。

安全性に配慮した設計が、このプロジェクトのもう一つの特徴です。ユーザーが音楽トラックを選択すると、フロントエンドはバックエンドにリクエストを送信し、音楽ファイルへの一時的なセキュアリンクを生成します。このリンクはJWT(JSON Web Tokens)を用いて署名されており、トークンにはリクエストされた音楽トラックの情報や有効期限が含まれています。この仕組みにより、リンクが不正に共有されたり、長期間にわたって悪用されたりすることを防ぎます。また、CORS(Cross-Origin Resource Sharing)を適切に設定することで、不正なクロスオリジンリクエストからAPIを保護しています。

VercelとRenderを併用した理由も、このプロジェクトの設計思想を反映しています。Vercelはフロントエンドのホスティングを担当し、特にNext.jsアプリケーションとの親和性が高いため、デプロイやパフォーマンス最適化が簡単に行えます。一方、RenderはバックエンドのAPIをホスティングしています。このAPIは音楽ファイルへのリンク生成やストリーミングを管理する重要な役割を果たします。Renderを選択した理由は、持続的なサーバー動作を保証し、特に音楽ストリーミングのような継続的なリクエストに対応できるからです。(無料で出来る幅が広いのも理由の一つ)

また、開発者体験も考慮されています。フロントエンドとバックエンドが独立しているため、別々の環境で開発・テストが可能です。例えば、フロントエンドの変更がバックエンドに影響を与えることなくデプロイできます。Vercelのプレビュー環境やRenderのAPIログ機能を活用することで、チームでの効率的な開発も実現可能です。

prot11

Node.jsNode.js
ReactReact
Next.jsNext.js
GitHubGitHub
VercelVercel
FirebaseFirebase
Chart.jsChart.js

FirebaseとChart.jsを組み合わせた、インタラクティブなグラフ表示アプリケーション

「prot11」のメインビジュアル

ユーザーがデータを直感的に操作し、視覚的なフィードバックを得られるように設計されたインタラクティブなアプリケーションです。特に、月ごとにデータを追加、更新、削除し、それを視覚化する機能を提供します。この機能は、データの変化を即座に反映するリアルタイム性を重視しており、どのデバイスからアクセスしても最新の情報を正確に確認できるという利便性が特徴です。

このWebアプリケーションは、モダンなフロントエンド技術スタックを基盤としており、開発フレームワークとしてはNext.jsを採用しています。そして、バックエンドには軽量なNode.jsサーバーを利用し、データの保存にはFirebaseのRealtime Databaseを採用しました。

Realtime Databaseは、クラウドベースでスケーラブルなデータストレージを提供するだけでなく、リアルタイムのデータ同期機能を備えています。この仕組みにより、ユーザーがデータを更新すると、他のユーザーの画面にも即座に反映されるため、データの一貫性を維持しながら高いインタラクティブ性を実現できます。

また、アプリケーションの視覚化には、グラフ描画ライブラリであるChart.jsを組み合わせて使用しています。これにより、ユーザーは入力した数値データをわかりやすいグラフ形式で確認でき、データの変化や傾向を視覚的に把握することが可能です。

さらに、フロントエンドのホスティングにVercelを利用することで、迅速かつ効率的なデプロイ環境を実現できます。セットアップは簡単で、GitHubのリポジトリにコードをプッシュするだけで自動的にデプロイが完了します。こうした機能により、リアルタイムのデータ更新が重要なこのアプリケーションにおいて、開発効率とユーザー体験を大幅に向上させることができます。

prot12

Node.jsNode.js
ReactVue.js
NuxtNuxt
GitHubGitHub
NetlifyNetlify
LottieLottie
SwiperSwiper

SwiperとLottieアニメーションを組み合わせた、スライド型Webサイト(サンプル)

「prot12」のメインビジュアル

JavaScriptライブラリのSwiperと、Lottieアニメーションを組み合わせたスライド型Webサイト(サンプル)です。各スライドはアニメーションとコンテンツが調和し、視覚的に魅力的なエクスペリエンスを提供することを目指しています。

このサイトは、Vue.jsを基盤としたフレームワークであるNuxtを採用して開発されています。Nuxtは、サーバーサイドレンダリング(SSR)や静的サイト生成(SSG)など、多彩な機能を備えており、効率的でスケーラブルなWebアプリケーションを構築するための強力なツールです。

また、軽量で多機能なライブラリであるSwiperを利用して、フルスクリーンの縦方向スライダーの実装を行っています。これにより、スムーズでインタラクティブなユーザー体験を提供しています。

さらに、Lottieアニメーションを活用し、SVG形式で軽量かつパフォーマンスに優れたアニメーションを実現しています。アニメーションは初回ロード時に停止した状態で表示され、ユーザーがスライドを変更する際に対応するアニメーションが再生される仕組みです。

このプロジェクトはGitHub上で管理され、Netlifyを利用してデプロイされています。Netlifyは、高速かつ信頼性の高いホスティングソリューションを提供しており、このサイトの迅速なデプロイとスムーズな運用を支えています。

prot13

Node.jsNode.js
Vue.jsVue.js
ViteVite
UnsplashUnsplash
axiosaxios

スケルトンスクリーンとUnsplash APIを組み合わせた、ギャラリー形式の写真表示サイト(サンプル)

「prot13」のメインビジュアル

写真とその説明を手軽に閲覧できるギャラリー形式の画像表示サイトです。写真はすべてUnsplash APIを使用して取得しており、初回ロード時には20枚の写真が一度に表示され、その後スクロール操作によって10枚ずつ新しい写真が追加されます。無限スクロールのような機能により、途切れることなく最大で100枚まで写真を表示します。

このプロジェクトの開発環境には高速なビルドツールであるViteを採用し、軽量で直感的なフレームワークであるVue.jsを使用して構築されています。また、Unsplash APIからのデータ取得にはaxiosを活用して非同期通信を簡潔かつ効率的に実現しました。さらに、ユーザー体験を向上させるため、画像の読み込み中にはスケルトンスクリーン(プレースホルダー)を表示し、画像への切り替えを滑らかに行う工夫をしています。

スケルトンスクリーンやスクロール連動のロード機能を駆使することで、読み込みの遅延や中断をなるべく感じさせずに、技術的にも視覚的にも満足度を高めることを目指しました。

prot14

Node.jsNode.js
Vue.jsVue.js
ViteVite
GSAPGSAP
Three.jsThree.js

GSAPとThree.jsを組み合わせた、モダンなコーポレートサイト(サンプル)

「prot14」のメインビジュアル

コーポレートサイトをイメージしたサンプルデザインで、スクロール操作に応じてコンテンツが動的に表示・遷移します。3D表現にはThree.jsを活用し、インタラクティブで立体感のあるビジュアルを提供。また、GSAP ScrollTriggerを用いてスクロール操作に同期したアニメーションを実現しています。

技術スタックには、軽量かつ高性能なビルドツールであるViteを採用しています。モジュール化と再利用性を重視してVue.jsで構築されており、各コンポーネント間のアニメーションが自然でスムーズに感じられる設計が可能になっています。

サイト構成としては、最初にスクロール連動型のアニメーションセクションが登場し、次にThree.jsを活用した3Dカルーセルが続きます。最終セクションでは、左右から入ってくるテキストとともにコピーライトがフェードインし、黒背景の落ち着いた印象で締めくくられます。

prot15

Node.jsNode.js
Vue.jsVue.js
ViteVite
Tailwind CSSTailwind CSS
GSAPGSAP
Three.jsThree.js

GSAPとThree.jsを活用した、ページ遷移アニメーションを備えたSPA

「prot15」のメインビジュアル

動的な背景色と滑らかなページ遷移を組み合わせたシングルページアプリケーション(SPA)です。3ページで構成されており、それぞれのページに特有の背景色が設定されています。ユーザーがページを移動する際、背景色がシームレスに変化するだけでなく、Three.jsを用いたインタラクティブな3Dオブジェクトが各ページに配置され、視覚的な魅力を高めています。

Three.jsを使用して構築された3Dコンテンツは、ブラウザ内でリアルタイムにレンダリングされ、ページごとに異なるデザインやアニメーションを提供します。また、アニメーションの管理にはGSAP(GreenSock Animation Platform)を採用し、ページ遷移時の動きや3Dオブジェクトのトランスフォーメーションをスムーズに制御しています。GSAPのパワフルなタイムライン機能を活用することで、複雑なアニメーションシーケンスを直感的に実装しました。

開発には、Vue.jsをフレームワークとして採用し、Vue Routerでページ間のルーティングを実現しました。<router-view>と<transition>を組み合わせることで、各ページへの切り替え時に背景色やコンテンツのアニメーションが連動する仕組みを構築しています。また、ビルドツールにはViteを使用し、モジュールバンドルを効率化しています。CSSフレームワークとしてTailwindCSSを活用し、ヘッダーやレイアウトのデザインを効率よく実現しました。

prot17

WordPressWordPress
DockerDocker
Node.jsNode.js
SassSass

開発にDockerを活用したWordPressサイト(サンプル)

「prot17」のメインビジュアル

コーポレートサイトとして機能するWordPressのオリジナルテーマの開発を目的としたプロジェクトです。開発環境の構築にはDockerを活用しています。開発環境の構築においてwp-envを使用する方法もありますが、本プロジェクトではdocker-compose.ymlを採用しています。これにより、ローカル環境でも本番環境と同じ構成を再現でき、開発の効率と再現性を向上させています。

また、CSSの管理にはSassを導入し、スタイルの記述を効率化しました。SassのコンパイルにはNode.js(npm)を利用し、以下のスクリプトをpackage.jsonに追加しています。

"scripts": {
  "watch": "sass --watch wp-content/themes/prot17/assets/scss/style.scss wp-content/themes/prot17/style.css",
}

このスクリプトを実行することで、Sassの変更が即座にCSSへ反映される仕組みを構築しています。圧縮CSSを生成する場合、以下のスクリプトをpackage.jsonに追加。

"scripts": {
  "build": "sass assets/scss/style.scss assets/css/style.css --style=compressed",
}

投稿やページにカスタムフィールドを追加できるプラグインMeta Boxを使用しています。functions.phpに記述を追加し、投稿ページや固定ページで『キービジュアル画像(アイキャッチとは別)』『導入テキスト』『よくある質問(FAQ)』を設定できるようにしました。管理画面からすぐに入力・更新ができるようになるなど、運用の担当者がHTMLを意識せずに作業できる設計を目指しました。

デプロイ環境について、サイトがレンタルサーバーで運用され、FTPでのファイルアップロードが行われることを想定しています。また、ドキュメントルート直下ではなくサブディレクトリ(https://replacement.jp/den/prot17/)に設置されることを前提に構築されています。

prot19

Node.jsNode.js
gulpgulp
SassSass

gulpとesbuildで構築した、クライアントサイド完結型のWebP画像変換・ダウンロードツール

「prot19」のメインビジュアル

JPGやPNG形式の画像をWebP形式に変換し、個別またはZIPで一括ダウンロードできるツールです。画像の変換はすべてクライアントサイドで完結し、アップロードされた画像が外部に送信されることはありません。そのため、セキュリティやプライバシーの面でも安心して利用できる構成となっています。

開発においては、CSSプリプロセッサとしてSASSを導入し、保守性と記述性の高いスタイル設計を実現しました。JavaScriptのモジュール管理にはES Modulesを採用し、バンドルには高速なビルドが可能なesbuildを使用しています。WebpackやViteといった主流のバンドラーを使用せず、gulpとesbuildの組み合わせにより構築しています。

gulpは、開発フローを自動化するタスクランナーとして導入し、SASSファイルのコンパイルやCSS/JSのminify、esbuildによるモジュールのバンドルといった処理を担っています。特に、gulp単体ではES Modulesに対応しきれない課題があったため、esbuildと連携させる構成にすることで、軽量かつ柔軟な開発環境を実現しました。また、CSSについても、SASSで記述したスタイルをgulp経由でビルドし、最終的に圧縮されたCSSとして出力しています。

なお、本アプリケーションでgulpを使用していることを明確に示すため、gulpタスクやesbuildの設定を含めたソースコードをGitHub上に公開しています。

https://github.com/test-20240925/prot19

prot20

Node.jsNode.js
WebpackWebpack
EJSEJS
SassSass
SwiperSwiper
FancyboxFancybox

株式会社フロム・ソフトウェアのコーポレートサイトを模倣し、PC/SP対応UIやロードモアを再現した静的サイト(サンプル)

「prot20」のメインビジュアル

このサイトは、株式会社フロム・ソフトウェアのコーポレートサイトの仕組みを参考に、リバースエンジニアリングのような形で模倣して制作したサンプルです。実際のサービスやデータを利用しているわけではなく、技術的な検証・ポートフォリオ用の学習成果物として構築しています。登場する名称等は架空のものです。

株式会社フロム・ソフトウェア
https://www.fromsoftware.jp/jp/index.html

トップページは、PCとスマートフォンで異なるUIを採用しています。PC版では、ゲームタイトルの一覧から項目をクリックすると、右側にその詳細情報や動画が切り替わって表示される仕組みになっています。ページ遷移を伴わず、シングルページ的に情報を展開できるため、ユーザーは途切れのない体験を得られます。スマートフォン版では、Swiperを用いたスライドUIを実装しています。各スライドをタップするとFancyboxのモーダルが開き、動画や説明をそのまま閲覧できます。

ニュースページは「ロードモア方式」を採用していて、最初は記事が6件だけ表示されます。「もっと見る」ボタンをクリックすることで、次の6件が段階的に追加表示されていきます。記事データはすでにJavaScript内に用意されており、サーバーへの追加リクエストは発生しません。つまり、非同期通信(Ajaxなど)は行わず、すべてクライアントサイドで動的に描画しています。

さらにこのページでは「カテゴリ切り替え機能」も備わっています。画面上部にあるタブやセレクトボックスからカテゴリ(「NEWS」「EVENT」「RELEASE」など)を選ぶと、該当する記事だけが一覧に再構成されます。これもサーバー通信を伴わないクライアントサイド処理であり、あらかじめ読み込まれた記事データの中から条件に一致するものだけを抽出・再描画しています。そのため、カテゴリを切り替えても瞬時に表示が切り替わり、スムーズなユーザー体験が実現されています。

本番環境ではサブディレクトリ(/den/prot20/)に配置しても正しく動作するよう、構成を工夫しています。開発時はWebpack Dev Serverのルートで動作しますが、本番ではURL階層が異なるため、それに対応できるようにしました。具体的には、WebpackのpublicPathを環境ごとに切り替え、本番用には絶対パス(/den/prot20/)を設定しています。これにより、出力されるHTML内のJS/CSSの参照パスが常に正しくなるよう制御されています。

また、テンプレートエンジンとしてEJSを導入し、HTMLテンプレート内で <%= PUBLIC_PATH %> のように変数を埋め込むことで、環境に応じた動的なパス指定が可能になっています。これにより、手動で相対パスを修正する手間を省き、保守性が向上しました。さらに、_sidemenu.html のような共通部品のパス指定にも同じ仕組みを活用し、開発環境でも本番環境でも同じHTMLテンプレートで共通UIを正しく読み込むことができます。

アクセスいただきありがとうございます。青く光っている部分が、一番見ていただきたいページです。

このモーダルウィンドウを閉じてご確認ください。

prot21

Claudeバイブコーディング
Node.jsNode.js
Vue.jsVue.js
NuxtNuxt
GitHubGitHub
VercelVercel
PostgreSQLPostgreSQL
SupabaseSupabase
CloudinaryCloudinary
Google Apps ScriptGoogle Apps Script
Chart.jsChart.js
JWTJWT

バイブコーディングで構築した、店舗情報を管理できる小規模飲食店向けWebアプリ(Nuxt 3 + Supabase + Cloudinary)

  • メールアドレス:
  • パスワード:

上記のアカウント(メールアドレス・パスワード)で、画像アップロード・メニュー編集・お知らせ投稿・各種設定など、すべての機能を実際に操作してご確認いただけます。データはダミーですので、自由に編集していただいて構いません。

「prot21」のメインビジュアル

小規模な飲食店が自分たちでメニューや店舗情報を管理できるWebアプリです。管理者がログインして操作する管理画面と、お客様向けの公開ページの両方を備えており、一つのアプリで店舗の情報発信を完結できる構成になっています。開発はAIアシスタントとの対話を中心に進めるバイブコーディング(Claude Code)で行い、設計判断・実装・デバッグまで一貫してこの手法で完成させました。

技術スタック

フロントエンドとAPIサーバーをNuxt 3に統合したフルスタック構成を採用しています。データベースはSupabase(PostgreSQL・東京リージョン)、画像ストレージはCloudinary、デプロイ先はVercelで、いずれも無料枠で運用できるよう設計しています。カスタムドメイン(サブドメイン)はVercelのCNAME設定で対応済みです。認証はJWTをCookieに保存する方式で、APIアクセスのたびにサーバー側でトークンを再発行することで、操作中は24時間ログアウトされない仕組みになっています。

環境構成

本番(mainブランチ)と開発(devブランチ)の2環境をVercelで管理しています。それぞれ別のSupabaseプロジェクトに接続しており、同一GitHubリポジトリからブランチごとに自動デプロイされます。Cloudinaryは共通で使用しています。Supabaseのスリープ防止にはGoogle Apps Scriptで毎日9時にAPIを叩く仕組みを設定済みです。

画像管理

CloudinaryのURLはVercelのルートプロキシで /images/** にマスクし、外部ストレージを使っていることをURLから隠しています。表示時はCloudinaryの変換パラメータ(w_、q_、f_auto)でサムネイルを軽量配信します。

画像管理はImagePicker(画像選択用)とImageManager(画像管理用)の2つのコンポーネントで構成しています。各画面で「画像を選ぶ」ためのモーダルUIはImagePickerに統一され、画像管理ページではImageManagerが一覧表示・削除・アップロードを統合的に扱います。

レイアウトにはJustified Layout(均等行高レイアウト)を実装しており、縦横比がバラバラな画像群を自然なグリッドで表示できます。初回24件表示・「もっと読み込む」で追加取得する方式で、サムネクリックで詳細モーダル(Splideでの矢印・キーボード・スワイプ切替対応)に対応しています。

同名ファイルの重複排除には独自の連番採番方式を採用しました。同じファイル名で別画像を上げた場合、menu/1/photo.png、menu/2/photo.png のようにフォルダ単位で連番を採番してCloudinary側でも別画像として保存します。URLにランダム文字列を含めず、意味のある番号で識別できる設計です。

ファイル名の日本語対応もしており、お肉ステーキ.jpg のような日本語ファイル名でもCloudinaryに保存・表示できます。表示時はURLデコードして読みやすく表示します。

SVGアップロードにも対応しており、サーバー側で <script> タグ・イベントハンドラ属性・javascript: スキームなどを除去するサニタイザを通してから保存します。

画像削除には使用中チェック機能があります。削除前にsettings・menus・postsテーブルを検索し、使用中の場合は警告メッセージを表示したうえで確認を求めます。削除実行後はsettingsの hero_image_url・hero_image_urls・footer_logo_url などからも該当URLを自動除去します。複数画像の選択削除モードにも対応しており、削除中は「削除中…」のドットアニメーション、削除完了時にはクリップパスで上から削れていく砂崩れ風アニメーションが表示されます。

白いロゴSVGなど透過画像との視認性を確保するため、管理画面のすべての画像プレビューには #d8d8d8 の薄いグレー背景を統一して当てています。

ヒーローセクション

トップページの設定を /admin から行います。設定項目はカードパネル形式でセクション分けされており、5つのカード(表示タイプ/背景メディア/ロゴ/テキスト・ボタン/その他オプション)で整理されています。

表示タイプは「画像1枚・画像スライダー・動画」の3択で、それぞれ専用のwebpイラストアイコンで視覚的に選択します。さらにパララックス表示のON/OFFをトグルで切り替えられます。

画像1枚では「なし」または「ゆっくりズームイン」のエフェクトを選べます。画像スライダーでは横スライド・フェードの切り替え方式、切り替え間隔、インジケーター(ドット)の表示/非表示を設定できます。インジケーターはクリック操作不可の表示専用です。スライダーは常に左方向にスライドします。動画はMP4 URLとYouTube動画IDの2種類に対応しています。

キャッチコピー・サブテキストのフォントサイズも clamp() ベースで設定でき、それぞれ最小・推奨・最大を rem/vw 単位で指定することで、画面幅に応じた可変フォントサイズを実現しています。

ヒーローの高さは4段階から選択でき、キャッチコピー・サブテキスト・ボタンテキスト・ボタンリンクも設定できます。

表示時はClientOnlyでラップしてSSRによるhydrationミスマッチを防止し、最初の画像をプリロードして読み込み完了後にフェードインで表示します。ローディング中はグレーのプレースホルダーとスピナーを表示します。

メニュー管理

カテゴリー・名前・説明・価格・画像・スラッグURLをCRUDで管理できます。SortableJSで並び替えにも対応しています。新規メニューは常に先頭(左上)に挿入される仕様で、最新の追加が見つけやすくなっています。「おすすめ」フラグ(最大4件)を設定でき、トップページにカード形式で表示されます。

お知らせ・ブログ管理

タイトル・本文・サムネイル・スラッグURLを管理でき、予約投稿に対応しています。本文はMarkdown風の画像挿入記法(![](url))をサポートし、表示時に <img> タグへ変換します。管理画面でプレビュータブによる事前確認が可能です。

SEO・SNS設定

/admin/settings の「SEO・SNS設定」セクションで、サイト全体のメタ情報を一元管理できます。設定項目は以下のとおりです。

  • サイトタイトル(各ページのタイトルは「ページ名 | サイトタイトル」の形式)
  • サイトURL(OG・canonical用の絶対URL生成に使用)
  • ディスクリプション(120〜160文字目安)
  • OG画像(推奨1200×630px、ImagePickerで選択)
  • Twitterカード形式(summary/summary_large_image/app/player から選択。app・playerには審査・承認が必要な旨の警告表示)
  • noindex,nofollow トグル

サイト全体設定をデフォルト値とし、ニュース詳細ではニュースタイトル・本文の冒頭・サムネイル画像、メニュー詳細ではメニュー名・説明・画像で個別に上書きされる仕組みです。og:title / og:description / og:image / og:url / og:type / og:site_name、twitter:card / twitter:title / twitter:description / twitter:image、canonical URL を全ページで自動出力します。

設定ページ

設定ページは各セクションがアコーディオン形式(開閉アニメーション付き)で整理されています。実装済みのセクションは以下のとおりです。

  • 価格フォーマット(14種類・税率・文字サイズ・カラー)
  • 画像アスペクト比
  • SEO・SNS設定
  • フッター(店名・住所・電話・Googleマップ・コピーライトなど)
  • プライバシーポリシー(テンプレート自動生成・プレビュー・表示ON/OFF)
  • GTM・GA4連携(同意モード)
  • Cookieバナー(GTM連動で出し分け)
  • メンテナンスモード
  • 利用規約(テンプレート自動生成・プレビュー・表示ON/OFF)
  • 操作ログ(before/after形式・ページネーション)

URL構成

ユーザー向けは /・/menu・/menu/[slug]・/news・/news/[slug]・/privacy・/terms・/maintenance。管理系は /admin(トップページ設定)・/admin/menu・/admin/news・/admin/images・/admin/settings・/admin/login・/admin/setup です。

その他の実装済み機能

  • 入力値サニタイズ(stripHtml)
  • Cloudinaryアップロード制限(10MB・MIMEタイプ、クライアント+サーバー両側)
  • スラッグのリアルタイム重複チェック(デバウンス付き)
  • JWT認証(Cookie・APIごとに自動延長)
  • 長文字列の自動折り返し(英数字連続文字列がレイアウトをはみ出さないようグローバルCSSで対応)
  • 固定ヘッダー・ハンバーガーメニュー
  • トースト通知
  • ログイン時のみ表示される「管理画面」リンク(/admin/settings へのリンク)

prot22

カラーフォント(COLRv1)技術を用いて、日本の自治体の市章をフォント化し、ブラウザ上で好きな文章を入力して表示・体験できるWebページ

「prot22」のメインビジュアル

「自作フォントを作ってみたい」という思いと、以前から好きだった市町村章への興味を組み合わせて生まれた実験的なWebページです。ひらがな1文字ごとに、その読みを名称に持つ自治体の紋章を割り当て、自作のカラーフォント「Emblem」として収録しています。テキストボックスに文章を入力すると、入力された文字が対応する自治体の紋章へリアルタイムに置き換わって表示される仕組みになっており、ページ下部の五十音表からは各文字に割り当てられた紋章をクリックして、その自治体名を確認することができます。

紋章の選定にあたっては、現在も存続している自治体の章を優先しつつ、対応する自治体が見つからない文字については、市町村合併などにより廃止された旧自治体の章も採用しました。「き・ぐ・じ・に・は・ほ・め・も・ろ」の各文字には、こうした廃止自治体の章が割り当てられています。また、「ぬ・ね・ら・る・れ・を」については、ひらがなを図案化した紋章が見つからなかったため、カタカナを図案化したものを採用しています。たとえば「ぬ」の場合は、カタカナの「ヌ」を図案化した静岡県沼津市の市章が表示されます。市章だけでは50音すべてを揃えることが難しかったため、県章・市章・町章・村章・区章の中から幅広く選定していますが、それでも対応するものが見つからない一部の文字は空欄としています。

制作工程としては、まず1文字ずつの紋章データをIllustratorでトレース・整形し、SVG形式で書き出しました。フォント化の工程では、ブラウザ上で手軽に自作フォントを作成できるサービス『Calligraphr』を活用し、用意したSVGをひらがなの各グリフに割り当てる形でベースフォントを生成しています。その後、複数色の表現を可能にするため、COLRv1形式のOpenTypeカラーフォントとしてビルドし直し、最終的なフォントファイル「Emblem」として仕上げました。COLRv1はベクター情報と色情報を保持したまま拡大・縮小ができるため、市章特有の繊細な曲線や複数色の構成をどのサイズでも忠実に再現できる点が大きな特徴です。

実装面では、生成したフォントを@font-faceでブラウザに読み込ませ、入力テキストにそのまま適用しています。フォント読み込み時のレイアウトシフトを抑えるためfont-display: swapを指定し、表示までの待機時間にも配慮しました。収録した紋章には現在も使用されている自治体のものに加え、市町村合併などにより廃止された旧自治体の章も含まれており、紋章デザインのアーカイブ的な側面も持たせた構成としています。

prot23

Claudeバイブコーディング
Node.jsNode.js
Cloudflare WorkersCloudflare Workers

バイブコーディングで構築した、野球実況配信者向けのリアルタイムOBSオーバーレイサービス(Cloudflare Workers + Durable Objects)

「baseballcast」のメインビジュアル

野球の試合をテレビなどで観ながら「実況・解説」を行う配信者のために、OBSにそのまま重ねて使えるスコアボードや各種オーバーレイを提供するWebサービスです。試合映像そのものは扱わず、選手名や成績は配信者が手入力する設計とすることで、公式データの自動取得や球団ロゴの利用といった権利上のリスクを避けています。これは「映像を映さない実況解説スタイル」という配信者の使い方に最適化した、意図的な設計判断です。開発はAIアシスタントとの対話を中心に進めるバイブコーディング(Claude Code)で行い、技術選定・アーキテクチャ設計・実装・デバッグまで一貫してこの手法で完成させました。

技術スタック

バックエンドは Cloudflare Workers と Durable Objects を採用し、サーバーコードは TypeScript で記述、デプロイは Wrangler で行っています。フロントエンドはフレームワークやビルドツールを一切使わず、単一のHTMLと素のJavaScript(Vanilla JS)だけで構成した軽量な作りです。リアルタイム通信には WebSocket、状態の永続化にはDurable Objects内蔵の SQLite を利用し、フォントには Adobe Fonts、QRコード生成には外部の画像API(goQR)を組み合わせています。いずれもCloudflareの無料枠を中心に、低コストで運用できるよう設計しています。

アーキテクチャ・リアルタイム同期

各配信ルームを1つのDurable Object(GameRoom クラス)として表現し、ルームごとに状態を完全に分離しています。クライアントとの接続には WebSocket Hibernation を用いることで、アイドル時にメモリを解放しつつ接続自体は維持し、課金とリソースを抑えながら常時接続を実現しています。操作画面での入力はWebSocketを通じて、すべてのオーバーレイと他のオペレーター画面へ即座に反映されます。状態はSQLiteへ永続化しているため、サーバーが一時停止・再開しても直前の試合状況がそのまま復元されます。常駐サーバーを持たないエッジ環境に全面的に寄せることで、スケーラビリティと運用コストの両立を図りました。

共同操作・権限管理

複数人で1つの配信を支える運用を想定し、オペレーターは承認制としています。最初に入室した人がホストとなり、後から参加した人のリクエストをホストが承認することでルームに加わる仕組みです。ホストが退出した場合には、残っているオペレーターへ自動的にホスト権限が移譲されるため、配信の途中で誰も操作できなくなる事態を防いでいます。現在の操作可能人数(ホスト・承認済みのみ)も管理し、共同運用の状況を把握できるようにしています。

OBSへの組み込みを前提としたオーバーレイ設計

スコアボード(ボール・ストライク・アウト)、ラインスコア、打順表、塁上の走者表示といった各表示物は、それぞれ独立したURLを持つ個別のオーバーレイとして提供しています。URLパラメータ(?view=overlay&widget=bso|score|lineup|bases)で表示するウィジェットを切り替えられ、配信者は必要なものだけをOBSの「ブラウザソース」として追加し、画面上の好きな位置・大きさに自由に配置できます。

カウント表示と走者表示を1つにまとめた組み合わせモードも用意しており、レイアウトの作り込み方に応じて単体表示と一体表示を選べます。打順オーバーレイでは、URLパラメータでどちらのチームを表示するかも指定できます。各オーバーレイが独立しているため、ある要素だけを画面の隅に小さく置いたり、シーンごとに異なる組み合わせを使い分けたりと、配信者が自分のシーン設計に合わせて自由にレイアウトを組める点が、実運用での大きな利点になっています。

表示機能

野球中継に必要な表示物を幅広くカバーしています。実装済みの主な機能は以下のとおりです。

  • ボール・ストライク・アウトのカウント表示(即時反映/手動確定の2モード、長押しリセット対応)
  • 表裏に対応したラインスコア(イニングごとの得点、H/安打・E/失策の表示切り替え、現在の半回ハイライト、未入力セルの空欄表示)
  • 塁上の走者表示(一・二・三塁のダイヤモンド表示)
  • 現在の打者表示(打順表と連動)
  • 打順表に紐づく打席成績(ヒット系・四死球・その他のアウトをカテゴリごとに色分けし、打点を丸数字で付与)

打席成績は、操作画面ではポップアップから成績用語を選んで入力する方式とし、入力した結果はオーバーレイ上で文字数に関わらず同じ大きさの色付きチップとして整然と並ぶようにしています。野球というドメインに固有の「表裏」や「すでに行われた回」の判定をスコアボードへ正確に反映している点も、見た目の正確さに直結する作り込みです。

操作ミスに強いグローバルUndo

ライブ運用で重要になる「操作のやり直し」を、全パネル横断のグローバルUndo(Ctrl+Z)として実装しています。サーバー側で操作前の状態スナップショットを履歴スタックとして保持し、カウント・スコア・打順・走者・現在打者といった複数領域をまとめて1手戻せます。クライアントへは履歴の件数だけを軽量に送ることで、Undoボタンの活性状態を制御しつつ通信量を抑えています。配信中の入力ミスを即座に取り消せることは、生放送ならではの安心感につながっています。

カスタマイズ性・UI

配信者が自分の画面づくりに合わせて細かく調整できるよう、多数の日本語フォント(Adobe Fonts・計24種)の選択、要素ごとにアクセントカラーを変えられる配色カスタマイズに対応しています。操作画面はPCでは1画面にスコア・両チームの打順・カウントをまとめて表示し、タブ切り替えなしで素早く操作でき、狭い画面ではタブとハンバーガーメニューへ自動的に切り替わるレスポンシブな統合UIとしています。設定はモーダルにまとめ、共有用のリンクとQRコードもワンタッチで取り出せます。

使い方

実際の配信での利用の流れは次のとおりです。

  • 操作画面を開いてルームを作成し、打順・スコア・カウントなどを入力します。
  • 共同で操作したい場合は、表示される共有リンクやQRコードを渡し、参加者のリクエストをホストが承認します。
  • スコアボード・ラインスコア・打順・走者などのオーバーレイURLをOBSの「ブラウザソース」として追加し、配信画面の好きな位置に配置します。
  • あとは操作画面でカウントやスコアを動かすだけで、配信に乗ったオーバーレイがリアルタイムに更新されます。
  • フォントや配色は設定からいつでも変更でき、操作を間違えても Ctrl+Z で素早く取り消せます。