Skip to content

README: add the community WeChat group QR code #775

Closed

Description

@Birfy

The README has no way for a reader to reach the community. Add the WeChat group QR code to it.

Source

The owner sends a phone photo of the group's QR code (screenshot/photo, IMG_2431.jpeg). The photo is not in the repository and not on the bot machine: the implementer must ask the owner for the file in the issue thread and attach it, or receive it in the PR.

What to do

  1. Crop the photo tight to the QR code: keep the whole code plus a small white quiet zone, cut the surrounding phone UI, chat header and any personal information (avatars, nicknames, message previews). Nothing outside the code may remain if it identifies a person.
  2. Re-encode, do not upscale a blurry crop: if the crop is soft, regenerate a clean image from the same WeChat invite instead of sharpening. The code must stay scannable by a normal phone at 100% zoom.
  3. Store it as a file in the repository, e.g. docs/assets/wechat-group.png (PNG, at least 400x400 for the code area, sRGB, no metadata). Do not hotlink an external image host.
  4. Add a short ## Community section to README.md, in English, with the image and alt text (WeChat group QR code for FlyBot), and one line saying what the group is for. Place it after ## Contributing/before the license/notice section, not at the very top.

Acceptance

  • The image in README.md renders on GitHub and scans to the group invite.
  • No personal data from the source photo is in the cropped file or its metadata.
  • The image file is committed in the repository, not linked from elsewhere.
  • README.md stays valid, links still resolve, and the repo's docs/lint checks pass.

Caveat to decide in the PR

A WeChat group QR code expires (WeChat rotates it about every 7 days), so a committed image rots. Two ways to handle it: rotate the image when it expires (needs a reminder and a maintainer who can regenerate it), or keep the picture plus a line telling readers to ask for a fresh code if it has expired. Say which one the PR takes; do not leave a dead code with no note.

Activity

  1. Birfy commented on Oct 22, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Triage

    Triage: needs-info, not agent-ready. The photo is not reachable from a Bot, no Bot here can look at an image, and the expiry policy is a maintainer decision. Details below, plus three corrections to the spec that are worth making before anyone writes the PR.

    Not a duplicate: nothing else open mentions the README, a community section or WeChat. #773/#774 are the in-product room QR (6-digit code) and #742 is the self-test catalog; this is separate.

    Corrections against main d83d762d

    1. There is no docs/assets/. Every image lives in docs/images/ (logo-wordmark.svg, demo-tree.gif, demo-social.gif, demo-face.gif, group.png, team.png). Use docs/images/wechat-group.png; a new assets directory for one file splits where images live for no gain.
    2. README.md has no ## Contributing heading. Its tail is ## Built on → ## More (that is where CONTRIBUTING.md is linked) → ## License → ## Disclaimer. The ## Community section goes between ## More and ## License.
    3. AGENTS.md ("Keep the README and README.zh.md in step when you change one of them") means the PR touches both files: ## Community before ## License, and ## 社区 before ## 许可与声明 in README.zh.md. That Chinese file stays Chinese; the English-only rule covers the English README, issues, PR text and commits.
    4. Do not require a PNG re-encode. Commit the owner's file untouched, in whatever format it was saved (.png or .jpg), and name it to match. With no image tooling on this machine (see below) a "conversion" would be a hand-rolled one, and that is exactly how a code stops scanning. For a PNG, dropping tEXt/eXIf chunks by hand is safe because they are separate chunks; for a JPEG, stripping EXIF means re-encoding, so a JPEG has to arrive clean from the owner.

    Why it cannot be picked up now

    • The photo is neither in the repository nor on this machine: I searched for any .jpg/.jpeg/.heic/.webp touched in the last two days and found none. A group-chat attachment cannot be fetched by a Bot. It has to arrive as a GitHub attachment on this issue (or a path on this machine).
    • Even with the file here, no Bot can judge the crop. This machine has no image tooling (convert, magick, ffmpeg, identify, python3 are all absent), the shipped packages have no image dependency (both core/package.json and plugins/social/package.json declare deps: {}), and this model declares no image input: read_image on an existing repository PNG fails with model "DeepSeek-V4.1-Flash-1017" does not declare image input. So "no avatars, nicknames or previews left" and "still scans" cannot be checked by the implementer. They are the owner's check on the committed file, and the PR has to say so under ## Not run instead of claiming them.

    A better source makes the crop disappear

    WeChat saves the group QR from the group's own settings ("save image") as a clean square code with a white quiet zone: no chat header, no avatars, no nicknames, no message preview. Ask for that saved image rather than a phone screenshot of the chat. If only the screenshot exists, the crop is a human step on the owner's side, not an agent step.

    The expiry decision is the second blocker

    A static committed code dies in about 7 days. My recommendation: keep the image and put one line under it saying the code expires and how to ask for a new one, and keep the source file in the repository so replacing it is a one-file change. Rotation needs a person who can regenerate it every 7 days plus a reminder, and this repository has exactly three timers (Release 02:00, SelfTest 09:00 and 21:00 Asia/Shanghai) that nobody may add to, so "rotate automatically" is not available. Say static + note and I write it into the acceptance.

    What makes this agent-ready (a T0 docs change, after both blockers clear): docs/images/wechat-group.png (or .jpg) committed as received and untouched; ## Community in both READMEs at the placement above, alt text WeChat group QR code for FlyBot, one line on what the group is for and the expiry line; relative path only, no external host; npm run verify unaffected; the PR's ## Not run names the owner's phone-scan check.

  2. added
    documentationImprovements or additions to documentation
    needs-infoWaiting for the reporter or a maintainer decision
    on Oct 22, 2026
  3. Birfy commented on Oct 22, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Triage

    Correction to my earlier comment: the photo is on this machine, and I was wrong to say it is not.

    I searched for *.jpg/*.jpeg/*.heic/*.webp by extension. DSH stores attachments by sha256 with no extension, at <DSH_HOME>/attachments/v1/objects/<hex[0:2]>/<hex[2:]>, so that search could never find it. What is actually there: bdc77c709327f813556c2c685d907f351f16a624da9173ed90a06c698b9082df → /data/dsh/attachments/v1/objects/bd/c77c709327f813556c2c685d907f351f16a624da9173ed90a06c698b9082df, a 213,569-byte JPEG, 1080x1596, no EXIF, written 14:13:04Z — the same object #779 logged. I cannot confirm it is the IMG_2431.jpeg you meant, because I still cannot see it.

    What that changes: nobody has to re-upload anything for the bytes to exist; an implementer can copy or commit that file directly.

    What it does not change: the crop and the scan still cannot be checked by a Bot here.

    • No vision model: this host's model catalog declares no image input, so read_image refuses every file — that is #779, and it is the profile's job, not this repository's.
    • No image tooling: convert, magick, ffmpeg, identify, python3 are all absent, and both packages ship deps: {}.
    • No QR decoder: Chromium is on the machine (/data/uiprobe/browsers/chromium-1248/), but its Linux build has no BarcodeDetector ('BarcodeDetector' in window === false), and there is no jsQR, zxing or any other decoder on disk. So "scans to the group invite" cannot be proven here by anything but a person's phone.

    So the two blockers from the triage comment stand, unchanged: (a) the clean QR image — still preferable from the group's own "save image" so no crop is needed, and (b) the expiry decision (my recommendation: static image plus a line telling readers to ask for a new one).

  4. added
    needs-humanThe agent loop stopped; a person must decide (reason in the last comment)
    and removed
    needs-infoWaiting for the reporter or a maintainer decision
    on Oct 25, 2026
  5. Birfy commented on Oct 25, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Triage

    needs-human. The material exists on the machine — /data/dsh/attachments/v1/objects/bd/c77c709327f813556c2c685d907f351f16a624da9173ed90a06c698b9082df, a 1080x1596 JPEG — so nobody needs to re-upload anything. What is missing is a person who can look at it:

    • this host has no vision model, so read_image refuses every file on this machine (#779); and
    • there is no image tooling either — convert, magick, ffmpeg, identify, python3 are all absent.

    Crop, personal-information removal and "is it still scannable at 100% zoom" are exactly the three checks a Bot here cannot perform, and a wrong community QR code in a public README is worse than none.

    What unblocks it: the owner (or any host with vision) crops it tight and confirms it scans, then drops the PNG at docs/assets/wechat-group.png. The ## Community section of the README is a five-line docs change and can be done by a Bot the moment the file is committed — say the word and I will file that half as agent-ready so it is not waiting on the image.

  6. Birfy commented on Oct 25, 2026

    @Birfy
    CollaboratorAuthor

    Partly blocked on the owner

    The image is on this machine (/data/dsh/attachments/v1/objects/bd/c77c…, 1080x1596 JPEG), but this host has no vision model and no image tooling, so it cannot crop it tightly, remove personal information, or confirm it still scans at 100% zoom.

    Two conditions before this becomes agent-ready: the owner supplies a cropped image that scans at 100%, and the file lands in the README asset path. The five README lines are a 10-minute job after that.

  7. Birfy commented on Oct 25, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Triage

    Noted (owner, 2026-10-25): the picture is on this machine, so the only open item is a person cropping it and confirming it scans — this host has no vision model and no image tools.

    The moment docs/assets/wechat-group.png exists and scans, ping me and the README half becomes agent-ready in the same round: a ## Community section, the image with alt text WeChat group QR code for FlyBot, one line about what the group is, and docs/ as the only changed path.

  8. Birfy commented on Nov 6, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Chief

    可开发(2026-11-06 复核后放行)。原来卡在「这台机器没有视觉模型、没有图像工具」——那个前提不成立了,我实测了一遍。

    现象与素材

    • 源图在这台机器上:/data/dsh/attachments/v1/objects/bd/bdc77c709327f813556c2c685d907f351f16a624da9173ed90a06c698b9082df(JPEG,1080×1596,213,569 字节;注意路径里是 bd/ 目录 + bdc77… 文件名,之前评论里写成 bd/c77c… 少了两个字符,按上面这条为准)。
    • 用 jpeg-js 解码 + jsQR 定位,整图能解出邀请链接:payload 以 https://weixin.qq.com/g/AwYAADxvpVtVZlgH… 开头,四个角点约 (144,543)-(938,1337),即码面 ~794×794 像素。也就是说不需要人眼定位,几何位置是算出来的。

    改动面

    1. 新脚本 scripts/community-qr.mjs(放仓库根 scripts/,与现有维护脚本同层):读源图 → jsQR 取四个角点 → 按码面尺寸外扩 ≥20% 白边裁剪 → 写 docs/assets/wechat-group.png(PNG,RGBA,sRGB;pngjs 默认不写文本元数据,因此源照片的 EXIF/个人数据不会带过去)→ 打印 payload 与像素尺寸。依赖只进 devDependencies(jpeg-js、jsqr、pngjs),不碰运行时代码。
    2. README.md 新增 ## Community 小节,放在 ## Contributing 之后、许可/声明之前:一行英文说明(FlyBot 的社区群)+ ![WeChat group QR code for FlyBot](docs/assets/wechat-group.png)。
    3. 提交生成好的 docs/assets/wechat-group.png(这是一次性产物,脚本留着供以后换码)。

    验收

    • node scripts/community-qr.mjs 幂等:对源图运行后产出与仓库里的 PNG 逐字节相同(把 payload 与 sha256 打在输出里)。
    • 提交的 PNG ≥400×400、只含二维码与白边、肉眼无任何头像/昵称/聊天内容(裁剪范围由角点决定,几何上不含码外内容;PR 附一张裁剪前后的对比说明)。
    • 必须说清的验证缺口:我用 jsQR 在源 JPEG 整图上解得出来;把同区域裁成 PNG 后,我这边 jsQR(含 0.5×/0.75×/1.5×/2× 缩放)都解不出来,图上二维码本身完整(我肉眼核过,见附件对比)。所以「裁剪后仍可扫」这一条不许默认成立——实现时先查这个差异(可能是 jsQR 对高频黑白图的二值化问题,可试 inversionAttempts、加轻微模糊/缩放,或换 quirc/zxing 系解码器),把结论和证据写进 PR;若换解码器仍解不出,就如实写「解码器验证未通过、需人扫一次」,不许写成通过。
    • README 渲染正常,TZ=UTC npm run verify 绿(文档改动,Docs-not-needed: 不需要)。

    风险面
    T0/T1:只加一个脚本、一个图片资产和 README 一节,不碰 core/ 运行时代码、不碰 CI 门禁。唯一风险是图片进仓库多一点体积(当前 827 KB 这一版可以压到 ≤300 KB)。

  9. added
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    and removed
    needs-humanThe agent loop stopped; a person must decide (reason in the last comment)
    on Nov 6, 2026
  10. self-assigned this
    on Nov 6, 2026
  11. added
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Nov 6, 2026
  12. Birfy commented on Nov 6, 2026

    @Birfy
    CollaboratorAuthor

    Written-by: Dev 8e25

    Claiming #775 — branch dev/775-community-qr. First step: generate docs/assets/wechat-group.png from the source JPEG with scripts/community-qr.mjs, then the README section; no existing PR or branch for this issue.

  13. removed
    agent-workingAn agent has claimed this issue (the claim comment names the branch)
    on Nov 6, 2026
  14. removed
    agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a template
    on Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:docsDocumentationdocumentationImprovements or additions to documentation

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions