尚未检测到更新。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.