投稿ガイドライン
最終更新日:2026-09-11
frank htmlは投稿前の審査を行いません。 その代わり、機械的に判定できる条件を先に明示し、満たさない作品は投稿時点で弾きます。 このページは「何が通り、何が通らないか」を投稿前に把握するためのものです。
1. 技術要件(満たさないと投稿できません)
1-1. HTML 1ファイルで完結していること
❌ index.html + style.css + game.js + sprite.png
✅ index.html (CSS・JS・画像をすべて内包)
画像や音は data URI(data:image/png;base64,...)で埋め込んでください。 外部URLを参照した画像・音源は読み込まれません(次項の理由による)。ライブラリ・CSS・フォントだけは、次項の許可されたCDNから読み込めます。
1-2. 外部への通信は一部のCDNを除いてできません
配信時に Content Security Policy を適用しており、作品からの外部通信は ブラウザがほとんどブロックします。cdnjs / jsDelivr / unpkg / Tailwind CDN / Google Fonts からのライブラリ・CSS・フォント読み込みは使えます。それ以外の外部URL、外部画像・音声、fetch等の通信は使えません。以下は動きません。
fetch/XMLHttpRequest/WebSocket/EventSource/navigator.sendBeacon- 上記のCDN以外の外部URLを指す
<link href><script src>、および外部URLの<img src><audio src><video src>(上記のCDNでも、画像・音声・動画は読み込めません) - 上記以外のCDN
<form>の送信
上記以外のCDNのライブラリを使っている場合は、ソースを本文に貼り付けてください。
1-3. localStorage は使えます(自動セーブ)。Cookie は使えません
作品は隔離された環境(opaque origin)で実行されるため、本物の localStorage / sessionStorage / Cookie には触れません。そのかわり、配信側が localStorage / sessionStorage の代用品(メモリ上の偽物)を用意しているので、ふつうに localStorage.setItem() などで使えます。
- localStorage:書き込んだ内容は、遊んでいる人のこのブラウザ・この端末に自動で保存されます(変更の約0.3秒後)。次に同じ作品を開くと元に戻ります。ハイスコアやセーブデータに使えます。
- sessionStorage:その回の間だけ使えます。閉じると消え、保存はされません。
- Cookie(
document.cookie):使えません。触ると SecurityError が発生して作品全体が停止します。
// ✅ そのまま使える(自動セーブされる)
localStorage.setItem('highScore', score)
// ❌ これだけで作品が止まる
document.cookie = 'a=1'
// ✅ どうしても使うなら必ず囲む
try { document.cookie = 'a=1' } catch (e) { /* 無視する */ }
保存の制限と注意:
- 保存されるのは1作品あたり合計約512KB(文字数で524,288文字)までです。超えた分は保存されません(作品は動き続けます)。
- 保存は端末・ブラウザごとです。別の端末・別のブラウザには引き継がれません。ブラウザのデータを消すと保存も消えます。
- 値は文字列だけです(
localStorageと同じ)。他の作品の保存データは見えません。保存データはサーバーには送られず、遊んでいる人のブラウザの中にだけ置かれます。 - 保存データが無い場合(初回・データを消した・別の端末)でも遊べるように作ってください。
getItemがnullを返す前提で書きます。
セーブ機能を使いたい作品向け(作り方・送り方)
- ふつうは
localStorageをそのまま使うだけで足ります。書き込みは自動で保存され、次に開いたときは、起動の時点でlocalStorageに前回の内容が戻っています。location.hashなどから自分で読み出す必要はありません(配信側が読み取り、作品のコードが動く前に消します)。 - frank html の外(自分のPCで直接開く、など)でも動くよう、
localStorageの読み書きはtry-catchで囲んでおくと安全です。 - 自分で親ページへ送りたい場合(上級者向け):
sandbox の中ではオリジンがparent.postMessage({ type: "frank-save", data: JSON.stringify({ save: JSON.stringify(state) }) }, "*")"null"なので、送り先は"*"と書きます。dataは値がすべて文字列のオブジェクトをJSON.stringifyした文字列です(入れ子のデータは、値の側でさらにJSON.stringifyしてください)。送った内容は、次に開いたときlocalStorageの中身としてそのまま戻ります(上の例ならlocalStorage.getItem('save'))。送るたびに保存内容の全体が置き換わるので、localStorageへの書き込みとは併用せず、どちらか一方に決めてください。 - 上限は512KB(524,288文字)です。
dataがこれを超えると保存されません。
プレイヤー上部の「⋯」メニューの「この作品のセーブを消す」で、遊ぶ人はその作品のセーブを消せます(確認のあと、作品を最初から読み込み直します)。
1-4. ファイルサイズ上限:10MB
画像を data URI にすると容量が跳ねます。超える場合は、 解像度を落とす、色数を減らす、PNGをJPEGやWebPに変えるなどで調整してください。
1-5. 縦長・タッチ操作で遊べること
作品はPCで見る場合も、実機のスマホと同じ縦長の枠の中に表示されます(PCでは「縦画面」ボタンでこの表示に切り替えられます)。 見ている人がPCかスマホかにかかわらず、操作はタップ・スワイプなどタッチ操作を基本に設計してください。
| 使えるもの | 使えないもの |
|---|---|
| タップ、スワイプ、長押し、ドラッグ | キーボード入力(WASD、矢印キー、スペース) |
| 端末の傾き(DeviceOrientation) | マウスホバー、右クリック |
| 画面上に描いたボタン | 物理キーが前提の操作 |
投稿画面にはスマホと同じ縦長サイズのプレビュー枠があります。 投稿ボタンを押す前に、必ずそこで一度遊んでみてください。
PC専用の作品も投稿できます。その場合は投稿画面で「📱 スマホで遊べる」のチェックを外してください(一覧の絞り込みで区別されます)。
1-6. その他
alert()confirm()prompt()は動作しません(ブロックされます)- カメラ、マイク、位置情報は利用できません
- 全画面API、ポインターロックは利用できます
- 重い処理は閲覧者の端末で動きます。発熱・電池消費に配慮してください
2. 内容の要件
2-1. 権利について
投稿できるのは、あなたが権利を持っているか、正当に使用許諾を得ているものだけです。
よくある見落とし:
- 既存ゲームのスプライト・BGM・効果音を流用している
- 実在のキャラクター、ロゴ、商標が画面に出ている
- フリー素材だが、ライセンスに再配布不可やクレジット表記義務がある
- AIで生成した画像だが、特定の作品や人物が明確に再現されている
素材のライセンスを確認し、クレジット表記が必要なものは説明文に記載してください。
2-2. 投稿できないもの
- 第三者の権利を侵害する作品
- マルウェア、閲覧者の端末に意図しない損害を与えるコード
- 本物のサービスを模したログイン画面・決済画面・支援要請画面 (ネタであっても不可。外部通信を遮断していても、 画面を撮影して別の場所で使われる危険があるため)
- 過度に暴力的・性的な内容、差別を助長する内容
- 自殺・自傷を誘引する内容
- 法令に違反する内容
2-3. 年齢層について
年齢確認の仕組みはありません。子どもが開く前提で作ってください。 不安がある内容は、タイトルと説明文の冒頭に注意書きを入れてください。
3. 投稿時の自動チェック
投稿ボタンを押すと、以下が自動で判定されます。
| 項目 | 判定 |
|---|---|
| ファイル形式 | .html のみ |
| ファイルサイズ | 10MB以下 |
| 外部リソース参照 | 検出した場合は警告(動作しない旨を表示。投稿自体は可能) |
Cookie(document.cookie)の使用 |
検出した場合は警告 |
| 縦長プレビューでの動作確認 | 一度も再生していない場合は確認ダイアログ |
外部リソースと Cookie の検出は警告であって拒否ではありません。 コードを読んで判定する方式は、文字列を分割されれば回避できるため、 これを合否の基準にはしていません。実際の遮断は実行環境側で行っています。 警告は「動かない作品を出す前に気づいてもらう」ためのものです。
4. 投稿後
4-1. 編集と削除
投稿した作品はいつでも差し替え・非公開・削除ができます。 差し替えても、アクセス数・評価・コメントは引き継がれます。
4-2. コメント
コメントはログインなしで誰でも書けます。 自分の作品に付いたコメントは、作者が個別に非表示にできます。 対応に困る書き込みがあった場合は、非表示にした上で通報してください。
4-3. 一覧での並び順
「高評価順」の並び順は、票が少ないうちはサイト全体の平均に寄る計算をしています。 1票だけの満点が首位に来ないようにするためで、票が集まるほど その作品自身の平均点に近づきます。
投稿直後に高評価順で中位に見えるのは正常な挙動です。
4-4. 削除される場合
以下に該当すると運営者が判断した場合、事前の通知なく非公開になることがあります。
- 本ガイドラインの「2. 内容の要件」に反する場合
- 権利者から申立てがあった場合
- 閲覧者の安全上、緊急に止める必要がある場合
異議がある場合は【連絡先】までご連絡ください。
5. 投稿前チェックリスト
□ HTML 1ファイルにまとまっている
□ 許可されたCDN(cdnjs / jsDelivr / unpkg / Tailwind CDN / Google Fonts)以外の外部URLの読み込みがない(画像・音は例外なく data URI)
□ Cookie を使っていない(または try-catch で囲んである)。localStorage は使ってよい(自動セーブされる)
□ 10MB以下
□ 縦長プレビューで最後まで遊べた
□ スマホで遊べない場合は投稿画面で「📱 スマホで遊べる」のチェックを外した(投稿はできます)
□ 使った素材のライセンスを確認した
□ 権利者のあるキャラクター・ロゴ・音源が入っていない
Posting Guidelines
Last updated: 2026-09-11
frank html does not review works before they are posted. Instead, we state up front the conditions that can be checked mechanically, and works that don’t meet them are rejected at posting time. This page is here so you can tell, before posting, what will and won’t pass.
1. Technical requirements (you can’t post unless you meet them)
1-1. Everything must be in a single HTML file
❌ index.html + style.css + game.js + sprite.png
✅ index.html (CSS, JS, and images all included)
Please embed images and audio as data URIs (data:image/png;base64,...). Images and audio that reference external URLs will not be loaded (for the reason in the next section). Only libraries, CSS, and fonts can be loaded, from the allowed CDNs in the next section.
1-2. No external network access, except for a few CDNs
We apply a Content Security Policy when serving works, and the browser blocks almost all external requests from a work. Loading libraries, CSS, and fonts from cdnjs / jsDelivr / unpkg / Tailwind CDN / Google Fonts works. Other external URLs, external images and audio, and requests such as fetch do not. None of the following will work.
fetch/XMLHttpRequest/WebSocket/EventSource/navigator.sendBeacon<link href><script src>pointing to external URLs other than the CDNs above, and<img src><audio src><video src>pointing to any external URL (even on the CDNs above, images, audio, and video are not loaded)- CDNs other than those above
- Submitting a
<form>
If you use a library from a CDN other than those above, paste its source into your file.
1-3. localStorage works (autosave). Cookies do not
Works run in an isolated environment (an opaque origin), so they can’t touch the real localStorage / sessionStorage / cookies. Instead, the hosting side provides a stand-in for localStorage / sessionStorage (an in-memory replacement), so you can simply use localStorage.setItem() and the like.
- localStorage: what you write is saved automatically in the player’s own browser on that device (about 0.3 seconds after a change). When the same work is opened again, it comes back. You can use it for high scores and save data.
- sessionStorage: works for that play session only. It is cleared when closed and is not saved.
- Cookies (
document.cookie): not available. Touching them throws a SecurityError and the whole work stops.
// ✅ Works as-is (saved automatically)
localStorage.setItem('highScore', score)
// ❌ This alone stops the work
document.cookie = 'a=1'
// ✅ If you really must use it, always wrap it
try { document.cookie = 'a=1' } catch (e) { /* ignore */ }
Limits and notes:
- Up to about 512 KB in total per work (524,288 characters) is saved. Anything over that is not saved (the work keeps running).
- Saves are per device and browser. They don’t carry over to another device or browser. Clearing the browser’s data also clears the saves.
- Values are strings only (just like
localStorage). A work can’t see another work’s saved data. Saved data is not sent to the server; it is kept only inside the player’s browser. - Make your work playable when there is no saved data (first play, data cleared, a different device). Write it assuming
getItemreturnsnull.
For works that want a save feature (how to build it and send it)
- Usually, just using
localStorageas-is is enough. Writes are saved automatically, and the next time the work is opened, the previous contents are already back inlocalStorageat startup. You don’t need to read anything yourself fromlocation.hashor the like (the hosting side reads it and removes it before your code runs). - So that your work also runs outside frank html (for example, opened directly on your own PC), it is safest to wrap reads and writes of
localStorageintry-catch. - If you want to send saves to the parent page yourself (advanced):
Inside the sandbox the origin isparent.postMessage({ type: "frank-save", data: JSON.stringify({ save: JSON.stringify(state) }) }, "*")"null", so write"*"as the target.datamust be theJSON.stringifyof an object whose values are all strings (for nested data,JSON.stringifyit again on the value side). What you send comes back as the contents oflocalStoragethe next time the work is opened (in the example above,localStorage.getItem('save')). Each send replaces the whole saved content, so don’t combine it with writes tolocalStorage; pick one or the other. - The limit is 512 KB (524,288 characters). If
dataexceeds it, it is not saved.
Players can delete a work’s save data from the “⋯” menu at the top of the player, using “Delete this work’s save data” (after a confirmation, the work is reloaded from the start).
1-4. File size limit: 10 MB
Turning images into data URIs makes the size jump. If you go over, adjust by lowering the resolution, reducing the number of colors, or switching PNG to JPEG or WebP.
1-5. Must be playable in portrait with touch controls
Even when viewed on a PC, a work is shown inside the same portrait frame as a real phone (on PC you can switch to this view with the “Portrait” button). Whether the viewer is on a PC or a phone, please design controls around touch: tapping, swiping, and so on.
| Available | Not available |
|---|---|
| Tap, swipe, long-press, drag | Keyboard input (WASD, arrow keys, space) |
| Device tilt (DeviceOrientation) | Mouse hover, right-click |
| Buttons drawn on the screen | Controls that assume physical keys |
The posting screen has a portrait preview frame the same size as a phone. Please play your work there at least once before pressing the post button.
PC-only works can be posted too. In that case, uncheck “📱 Playable on mobile” on the posting screen (they are distinguished in the list filter).
1-6. Other
alert()confirm()prompt()do not work (they are blocked)- Camera, microphone, and location are unavailable
- The Fullscreen API and Pointer Lock are available
- Heavy processing runs on the viewer’s device. Please be mindful of heat and battery use
2. Content requirements
2-1. About rights
You may only post things you own the rights to, or have properly obtained permission to use.
Commonly overlooked cases:
- Reusing sprites, music, or sound effects from existing games
- Real characters, logos, or trademarks appearing on screen
- Free assets whose license forbids redistribution or requires credit
- AI-generated images that clearly reproduce a specific work or person
Please check the licenses of your assets, and write any required credits in the description.
2-2. What you can’t post
- Works that infringe third-party rights
- Malware, or code that causes unintended damage to a viewer’s device
- Login, payment, or donation-request screens that imitate real services (not allowed even as a joke. Even with external requests blocked, there is a risk that a screenshot gets used elsewhere)
- Excessively violent or sexual content, or content that encourages discrimination
- Content that induces suicide or self-harm
- Content that violates the law
2-3. About age groups
There is no age verification. Please make your work assuming children may open it. If you are unsure about some content, put a warning at the start of the title and description.
3. Automatic checks when posting
When you press the post button, the following are checked automatically.
| Item | Check |
|---|---|
| File type | .html only |
| File size | 10 MB or less |
| References to external resources | A warning if detected (it tells you it won’t work; posting itself is still allowed) |
Use of cookies (document.cookie) |
A warning if detected |
| Checking it works in the portrait preview | A confirmation dialog if you haven’t played it even once |
The detection of external resources and cookies is a warning, not a rejection. A method that reads the code can be evaded by splitting strings, so we don’t use it as the pass/fail criterion. The actual blocking is done by the runtime environment. The warnings are there so you notice before publishing a work that won’t run.
4. After posting
4-1. Editing and deleting
You can replace, unpublish, or delete a work you posted at any time. Even if you replace it, plays, ratings, and comments carry over.
4-2. Comments
Anyone can write comments without logging in. Authors can hide comments left on their own works individually. If there is a post you find hard to deal with, hide it and then report it.
4-3. Order in the list
The “Top rated” order is calculated so that, while a work has few votes, it is pulled toward the site-wide average. This is so a single perfect-score vote doesn’t take first place; the more votes come in, the closer it gets to the work’s own average.
It is normal for the rating order to look middling right after posting.
4-4. When works are removed
If the Operator judges that any of the following applies, a work may be made private without prior notice.
- When it violates “2. Content requirements” of these Guidelines
- When a rights holder has filed a claim
- When it must be stopped urgently for the safety of viewers
If you have an objection, please contact [Contact].
5. Pre-posting checklist
□ Everything is in one HTML file
□ No external URLs are loaded other than the allowed CDNs (cdnjs / jsDelivr / unpkg / Tailwind CDN / Google Fonts); images and audio are always data URIs
□ Doesn’t use cookies (or they are wrapped in try-catch). localStorage is fine to use (it is saved automatically)
□ 10 MB or less
□ I was able to play it to the end in the portrait preview
□ If it can’t be played on mobile, I unchecked “Playable on mobile” on the posting screen (you can still post it)
□ I checked the licenses of the assets I used
□ No copyrighted characters, logos, or music are included