尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗OpenSummary turns your photos into two things you can post: a clean summary image showing the EXIF data (aperture, shutter speed, ISO, focal length, date, camera, lens), and a set of equal slices of the same photo for carousel posts.
It runs entirely in your browser. There is no server, no account and no upload: your photos are read and processed on your own device.
Live at opensummary.app.
<original>_summary.jpg and <original>_<n>of<total>.jpg.There is no build step, no framework and no package manager. The whole app is static files.
index.html The app: markup, CSS and JavaScript in one file
onboarding.html One-time intro page, shown on first visit
exif.js EXIF reader (fork of exif-js, see Credits)
icons/ SVG icons used on the summary image
huey.jpg Example photos used on the onboarding page
b747.jpg
Inside index.html, the script is organised roughly in this order:
Image.getExif reads the file with exif.js, a fork of exif-js. buildInfo formats the values and splits them into a top group (exposure settings and date) and a bottom group (camera, lens, copyright). Values that are missing or invalid are skipped rather than printed as NaN.drawSummary paints the blurred photo onto a canvas, then the icons and text. drawPiece crops slice i of n out of the original. All sizes are relative to the image's shorter side, so a preview and a full-resolution render look the same.render runs when the files or options change. It produces a small preview for the screen and defers the full-quality render until the user downloads, using the same parameters. Output is capped at 16 megapixels to stay within mobile canvas limits. Rapid slider changes are debounced, and a run counter cancels stale renders.Three small pieces of state are kept in localStorage: whether the onboarding page has been seen, the theme choice, and the last copyright text you typed (so it is autofilled next time). Nothing else is stored. Crawlers skip the onboarding redirect.
The only external request the app makes is for context-filter-polyfill, loaded from jsDelivr. It makes the canvas filter property (used for the blur) work on iOS, where it is not supported natively. Fonts and styles for the app itself are local.
Any static file server works. For example:
git clone https://github.com/LetsPlaySimi/OpenSummary.git
cd OpenSummary
python3 -m http.server 8000
Then open http://localhost:8000. Opening index.html directly from disk mostly works too, but a local server is more reliable.
The site is deployed at opensummary.app as plain static files. To host your own copy, upload the contents of the repository to any static host. No configuration is needed.
Issues and pull requests are welcome. Keep changes small and focused where you can, and test with a few real photos, including ones with missing EXIF data.
Vibecoding is 100% allowed. Code written with an AI assistant is welcome here, and you do not need to disclose it. The only standard is that the change works and you have run it yourself.
By contributing, you agree that your contribution is released under the same license as the project (see below).
OpenSummary builds on two open source libraries:
exif.js.ctx.filter (the canvas blur) work on iOS.Thanks to their authors and contributors.
OpenSummary is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0). In plain terms:
The full text is in LICENSE. The libraries listed under Credits are not covered by this license and keep their own.