Releases: conanxin/artvee-gallery
Release list
Artvee Gallery v0.2.0
Release Notes · v0.2.0 (stable)
v0.2.0 is the first stable daily-operable release of
Artvee Gallery. It is identical in surface area to
v0.2.0-alpha (2026-06-13) and adds only the post-observation
hardening: a 3-day observation window, a Pages publish guard,
a fix for the daily health script's online-check signal
distortion, and the explicit "stable" tag.
See docs/RELEASE_NOTES_v0.2.0-alpha.md
for the full feature list and docs/STABLE_READINESS_v0.2.0.md
for the 15 / 15 readiness checklist that gates this release.
1. Summary
v0.2.0 is the first release of Artvee Gallery that has been
observed running unattended on a single host for 3 consecutive
days (2026-06-14 → 2026-06-16) without manual intervention, with
the daily health cron, the Telegram text + MEDIA delivery, and
both public demos all green at the end of the window. Everything
that was true of v0.2.0-alpha is still true of v0.2.0; what
changed in between is documented under
§ 6 "Upgrade notes from v0.2.0-alpha"
below.
The system is designed to be safe to run unattended: nothing
destructive is automatic, the publish step is always manual
(--approve is required), and the data surface is
machine-checked at every push by check_open_source_ready.py.
2. Stable readiness
| Gate | Result | Evidence |
|---|---|---|
| 3-day observation window | PASS | docs/V0_2_OBSERVATION_WINDOW.md |
| Day 1 (2026-06-14) | Green | reports/runtime/daily-health/artvee-daily-health-2026-06-14.md |
| Day 2 (2026-06-15) | Green (post-restore, with incident annotation) | reports/runtime/daily-health/artvee-daily-health-2026-06-15.md, docs/PROJECT_STATUS.md (P7E+1, P7E+2) |
| Day 3 (2026-06-16) | Green | reports/runtime/daily-health/artvee-daily-health-2026-06-16.md |
| Daily health cron | Installed, ran 03:00 daily | logs/daily-health-cron/daily_health_*.log |
| Telegram text | Delivered every day | message_ids 22919, 23150, 23707 |
| Telegram MEDIA | Delivered every day | message_ids 22921, 23151, 23709 |
| Public Gallery Demo | 6/6 endpoints HTTP 200 | live curl -I 2026-06-16 06:38 |
| Public Daily Digest | 6/6 endpoints HTTP 200 | live curl -I 2026-06-16 06:38 |
KNOWN_RETIRED |
4 (audited, not blocking) | reports/runtime/p6b-known-retired-urls.json |
blocking_unresolved |
0 | reports/runtime/artvee-status-report.md |
| Strict integrity | PASS | scripts/check_gallery_integrity.py --strict |
| Readiness CI | PASS (4/4) | scripts/check_open_source_ready.py |
| Readiness checklist | 15 / 15 PASS | docs/STABLE_READINESS_v0.2.0.md §6 |
3. Public demos
- Gallery Demo (curated thumbnail subset):
https://conanxin.github.io/projects/artvee-gallery-demo/ - Daily Digest (latest 5-pick + 30-day history):
https://conanxin.github.io/projects/artvee-gallery-digest/
Neither export contains the full local archive, the original
image assets, or any private metadata. The Pages publish guard
(P7E+2 follow-up, cross-repo) prevents the public GitHub Pages
repo from accidentally clobbering these subtrees during other
workstream publishes.
4. Key capabilities
Local-first gallery
- Local gallery browser (P1) with thumbnails at 256 / 512 px and
a search / filter / detail-modal UI shell. - Strict integrity gate (P4A+1, P4B) that fails the build on
duplicate ids, duplicate basenames, or one-id-many-URL
anomalies. KNOWN_RETIRED-aware status report (P6G) that distinguishes
audited retirees from blocking unresolved losers.
Daily inspiration digest
- Deterministic 30-day digest history (P6F) with
near-duplicate-aware selection. - Public Daily Digest page (P3E, P6F+1) on a separate GitHub
Pages surface.
Public demo publishing
- Approved-publish helper
(scripts/publish_demo_refresh_candidate.sh --approve) that
pre-stages the GitHub Pages bundle and waits the 90-second
CDN warm-up window. - No auto-publish: the helper refuses to run without
--approve.
Operations
- Daily health check (P7A) with a JSON report that distinguishes
integrity, readiness, candidate state, digest history, and
near-dup cluster counts, plus a 6-endpoint online probe. - Daily health Telegram cron at 03:00 Asia/Shanghai (P7B).
- Failure-only fallback (P7B+1): when health is PASS but MEDIA
delivery failed, a short text-only warning is sent. - Signal-distortion fix in
artvee_daily_health_check.py
(P7E+2): the online probe now distinguishesHTTPError
(real HTTP code) fromURLError(network error), so a
future Pages content drift is reported correctly within
24 h instead of masked as0, 0. - Open-source readiness CI (P3C, P3D) that fails the build on
path leaks, real secrets, tracked runtime files, or files1 MB.
5. Operational state at release time
| Metric | Value |
|---|---|
records |
835 |
known_retired |
4 (audited, not blocking) |
blocking_unresolved |
0 |
strict integrity |
PASS |
readiness |
PASS (4/4) |
public_demo_ready |
true |
digest_ready |
true |
| latest nightly batch | 2026-06-16 02:00 — 20 selected, 0 failed |
| digest history entries | 5 |
| near-dup clusters | 8 (23 records) |
| online gallery | 200 (all 3 endpoints) |
| online digest | 200 (all 3 endpoints) |
| Telegram text | sent (message_id 23707) |
| Telegram MEDIA | sent (message_id 23709) |
Daily cron rhythm
| Time (Asia/Shanghai) | What runs | Log |
|---|---|---|
| 01:30 | artvee_nightly_wrapper.sh refill |
logs/wrapper_refill.log |
| 02:00 | artvee_nightly_wrapper.sh batch |
logs/wrapper_batch.log |
| 02:30 | confirm_demo_refresh.sh --no-telegram |
logs/confirm_demo_refresh/cron_stderr.log |
| 03:00 | artvee_daily_health_check.sh --online --media |
logs/daily-health-cron/daily_health_YYYYMMDD_030000.log |
| manual | publish_demo_refresh_candidate.sh --approve |
(no auto-run) |
Refill and nightly batch are the only cron jobs that touch the
network; everything else is local. Publish to GitHub Pages is
always a manual --approve step, never a cron step.
6. Upgrade notes from v0.2.0-alpha
There is no in-place migration path, because the data
surface (images / metadata / thumbs / web/data) is intentionally
not tracked. The repo is regenerated from a working data
directory on the maintainer's local host and then pushed.
Forks or fresh clones should:
- Clone the repo.
- Populate their own
images/,metadata/, andindex/
directories (any data source that conforms to the
web/data/artworks.jsonschema in
docs/GALLERY_PUBLIC_USAGE.md —
see also docs/GALLERY_DATA_SCHEMA.md). - Run the daily wrapper, then
confirm_demo_refresh.sh, then
the public-demo export, then (optionally) the manual
publish_demo_refresh_candidate.sh --approve.
What changed in the tracked code between v0.2.0-alpha and v0.2.0:
| Change | Why | Files |
|---|---|---|
artvee_daily_health_check.py — split except Exception into HTTPError / URLError / TimeoutError / ConnectionError; new online.kind, online.gallery_error, online.digest_error; recommended_action branches by kind |
During Day 2 the health script masked real HTTP 404s as 0, 0. After this fix a future Pages content drift is reported with the correct code. |
scripts/artvee_daily_health_check.py (only) |
New docs/STABLE_READINESS_v0.2.0.md |
Documents the 15 / 15 readiness criteria that gate this release. | docs/STABLE_READINESS_v0.2.0.md (new) |
New docs/V0_2_OBSERVATION_WINDOW.md Day 3 log |
Closes the 3-day observation window. | docs/V0_2_OBSERVATION_WINDOW.md |
New docs/RELEASE_NOTES_v0.2.0.md (this file) |
The stable release notes. | docs/RELEASE_NOTES_v0.2.0.md (new) |
CHANGELOG.md — v0.2.0 section added |
Records the post-alpha hardening. | CHANGELOG.md |
README.md — Latest release bumped from v0.2.0-alpha to v0.2.0 |
Surfaces the new release. | README.md |
docs/PROJECT_STATUS.md — P7E+3 closed, P7F row added, v0.2.0 stable release row added |
Phase markers and release snapshot. | docs/PROJECT_STATUS.md |
docs/ROADMAP.md — P7F moved to completed, v0.2.0 stable moved to completed, next: P8 / content product polish |
Roadmap updated. | docs/ROADMAP.md |
Cross-repo follow-up (in the shared Pages repo, not in this
artvee repo): the new scripts/check-project-publish-guard.py
docs/PAGES_PUBLISH_GUARD.mdshipped in the Pages repo so
that future WBW SpaceX Mars publish runs cannot silently
clobber theprojects/artvee-gallery-*subtrees. The artvee
repo itself is not affected.
7. Safety boundaries
The same boundaries documented in
docs/OPEN_SOURCE_BOUNDARIES.md and
the v0.2.0-alpha release notes still apply. Quick recap:
- No network is opened by the readiness check, the syntax
checks, or the daily health cron offline modes. The
--onlineflag adds an HTTP HEAD-style probe; no auth, no
cookies. - No GitHub Pages push is automatic. The publish helper
refuses to run without--approveand writes its bundle to
dist/for inspection first. - No tokens, chat ids, or bot tokens are tracked. The
Telegram notifier resolves the chat id from the
ARTVEE_TELEGRAM_CHAT_IDenv var, then from the OpenClaw
config; resolution is hard-fail if neither is set. - MEDIA delivery failure is non-fatal. A failure-only
fallback sends a short text-only warning when health is
PASS but the Markdown attachment was rejected. - No destructive commands run unattended.
trashis
preferred overrmin dev scripts; the cron jobs are
append-only by construction. - No runtime data is tracked.
images/,metadata/,
thumbs/,dist/,digests/,logs/,inbox/,
web/data/*.json(except.gitkeep),index/,
reports/runtime/, andtmp/are git...
Artvee Gallery v0.2.0-alpha
Release Notes · v0.2.0-alpha
v0.2.0-alpha turns Artvee Gallery from an open-source local
gallery builder (v0.1.0-alpha) into a daily-operable local-first
visual archive system with public demos, curated daily digests,
status reporting, and Telegram health delivery.
1. Summary
This release consolidates P3D through P7B+1: a public GitHub
repository with a running CI gate, a public daily-digest page, a
content-healing pipeline, visual QA, near-duplicate review, a
30-day digest history, an approved-publish helper, a daily health
check, and a cron-installed Telegram delivery with MEDIA staging
and a failure-only fallback. The system is designed to be safe to
run unattended on a single host: nothing destructive is automatic,
the publish step is always manual, and the data surface is
machine-checked at every push.
2. Highlights
Public surfaces (live)
- Public Gallery Demo — curated thumbnails only, served from
GitHub Pages: https://conanxin.github.io/projects/artvee-gallery-demo/ - Public Daily Digest — a separate page that surfaces the
30-day digest history: https://conanxin.github.io/projects/artvee-gallery-digest/
Local capabilities
- Local-first gallery browser (P1) with thumbnails at 256 / 512 px
and a search / filter / detail-modal UI shell. - Daily inspiration digest with deterministic 30-day history and
near-duplicate-aware selection (P3B, P6F). - Filename collision healing (P4B) and audited KNOWN_RETIRED
handling for sources the upstream archive has removed (P6B,
P6G). - Visual QA contact sheets and curation filters (P5D, P5E).
- Near-duplicate review workflow with contact sheets and an
audit trail (P6C). - Approved-publish helper (P6F+1) that pre-stages the GitHub
Pages bundle and waits the 90-second CDN warm-up window.
Operations
- Daily health check (P7A) with a JSON report that distinguishes
integrity, readiness, candidate state, digest history, and
near-dup cluster counts. - Open-source readiness CI (P3C, P3D) that fails the build on
path leaks, real secrets, tracked runtime files, or files1 MB.
- Daily health Telegram cron at 03:00 Asia/Shanghai (P7B) with
a failure-only fallback (P7B+1): when MEDIA delivery fails but
health is PASS, a short text-only warning is sent. - Idempotent, marker-based cron installer (P7B) that bakes
PATHand the chat id env into the cron line so OpenClaw
resolves from the cron env.
3. Operational state at release time
| Metric | Value |
|---|---|
| records | 776 |
| known_retired | 4 (audited, not blocking) |
| blocking_unresolved | 0 |
| strict integrity | PASS |
| public demo ready | true |
| digest ready | true |
| latest nightly | 2026-06-13 02:00 — 20 selected, 0 failed |
4. Daily cron rhythm
| Time (Asia/Shanghai) | What runs | Log |
|---|---|---|
| 01:30 | artvee_nightly_wrapper.sh refill |
logs/wrapper_refill.log |
| 02:00 | artvee_nightly_wrapper.sh batch |
logs/wrapper_batch.log |
| 02:30 | confirm_demo_refresh.sh --no-telegram |
logs/confirm_demo_refresh/cron_stderr.log |
| 03:00 | artvee_daily_health_check.sh --online --media |
logs/daily-health-cron/daily_health_YYYYMMDD_030000.log |
| manual | publish_demo_refresh_candidate.sh --approve |
(no auto-run) |
Refill and nightly batch are the only cron jobs that touch the
network; everything else is local. Publish to GitHub Pages is
always a manual --approve step, never a cron step.
5. What is included vs. not included
Included
- Source code under
scripts/,web/,examples/,data/(small). - Documentation under
docs/. - CI workflow under
.github/workflows/. .gitignore,LICENSE(MIT),README.md,CHANGELOG.md.
Not included (by design)
images/— full original image archive (large; regenerable).metadata/— full scraped metadata (large; regenerable).thumbs/{256,512}/— generated thumbnails (regenerable).dist/— exported public bundles (regenerable).digests/— generated daily digest corpus (regenerable).logs/— runtime logs (regenerable; deliberately not
committed for privacy).reports/runtime/— runtime status and contact sheets
(regenerable).web/data/*.json(except.gitkeepplaceholders) — generated
gallery / digest / stats JSON.- Local machine paths, tokens, chat ids, or bot tokens.
The readiness CI enforces this boundary on every push; a
violation fails the build. See
docs/OPEN_SOURCE_BOUNDARIES.md.
6. Upgrade notes from v0.1.0-alpha
There is no in-place migration path because v0.1.0-alpha did
not include a corpus. The repo is regenerated from a working
data directory on the maintainer's local host and then pushed.
Forks should:
- Clone the repo.
- Populate their own
images/,metadata/, andindex/
directories (any data source that conforms to the
data/artworks.jsonschema in
docs/GALLERY_PUBLIC_USAGE.md). - Run the daily wrapper, then
confirm_demo_refresh.sh, then
the public-demo export, then (optionally) the manual
publish_demo_refresh_candidate.sh --approve.
The new wrapper path-agnosticism from v0.1.0-alpha still
applies; nothing in this release adds machine-specific paths
back into the tracked code.
7. Safety model
- No network is opened by the readiness check, the syntax
checks, or the daily health cron. The cron uses--online
to check the public demo and digest URLs, but only via HTTP
HEAD-style probes — no auth, no cookies. - No GitHub Pages push is automatic. The publish helper
refuses to run without--approveand writes its bundle to
dist/for inspection first. - No tokens, chat ids, or bot tokens are tracked. The
Telegram notifier resolves the chat id from the
ARTVEE_TELEGRAM_CHAT_IDenv var, then from the OpenClaw
config; resolution is hard-fail if neither is set. - MEDIA delivery failure is non-fatal. A failure-only
fallback sends a short text-only warning when health is
PASS but the Markdown attachment was rejected. - No destructive commands run unattended.
trashis
preferred overrmin dev scripts; the cron jobs are
append-only by construction.
8. Known limitations
- The Telegram notifier depends on a local OpenClaw CLI as the
message bridge. Users without that bridge can simply skip
the notify step (the wrapper isolates it with|| true). - The repo does not include a corpus. To exercise the
local UI shell, the user must populateimages/,
metadata/, andindex/locally. - The status report uses
KNOWN_RETIREDto mark the four
source URLs that have been removed from the upstream
archive. They are audited, not blocking, and they are
listed indata/p6b-known-retired-urls.jsonfor
transparency. - The
--simulate-media-failureflag on the daily health
check is a testing-only convenience. It is not used
in cron.
9. Next steps
- v0.2.0 observation window — let the cron run for a few
days and watch for any MEDIA delivery regressions, with the
failure-only fallback as the safety net. - P8 automation polish — small follow-ups: a pre-flight
--dry-runmode on the publish helper, a 02:55 pre-check
cron that runs the daily check in--no-telegrammode and
alerts only on FAIL, and a small CI matrix that exercises
the cron installer in a container. - v0.2.0 stable — after the observation window, cut a
stable release with theKNOWN_RETIREDtable moved into
the public demo's UI.
See docs/ROADMAP.md for the long-term
direction.
10. Acknowledgements
- Data source: artvee.com public-domain
art archive. - The local-first / open-source boundary pattern is inspired
by the standard "thin shell, fat scripts" approach for data
tooling. - The Telegram delivery state model is the project-private
"thin harness, fat skills" approach: each delivery track
reports its ownattempted/sent/message_id/
error, so partial failures stay observable.
Artvee Gallery v0.1.0-alpha
Release Notes · v0.1.0-alpha
The first open-source-facing release. The repository is now
self-describing, has a single canonical ignore file, a privacy
surface that is machine-checked, and a public MIT license.
1. What is in this release
Documentation
README.mdrewritten as a self-contained entry point with a
live demo link, a "what is and is not included" section, an
architecture diagram, a quick-start section, and a docs index.docs/ARCHITECTURE.md— end-to-end data flow, per-script
responsibilities, generated-vs-tracked boundary, nightly
wrapper post-batch flow, public demo flow.docs/OPEN_SOURCE_BOUNDARIES.md— what ships in the repo, what
does not, why the public demo is safe, the risk surface that
is checked at release time, and a migration note for forks.docs/ROADMAP.md— past phases (P1, P2, P3A, P3B, P3C, E2E
cron verification), near-term (P3D, P3E), mid-term, long-term.docs/DEVELOPMENT.md— local dev loop, syntax checks, the
smoke flow, what not to run in dev, the readiness check,
branch model, pre-commit checklist.docs/PROJECT_STATUS.md— current phase markers and the
last-known-good nightly snapshot.docs/RELEASE_NOTES_v0.1.0-alpha.md— this file.- Existing
docs/GALLERY_*.mdfiles retained for deep dives into
data schema, local usage, public demo, and digest builder.
License
LICENSE— MIT, full standard text.
Sample data
examples/artworks.sample.json— 3 synthetic records.examples/gallery_stats.sample.json— minimal stats object.examples/digest.sample.json— minimal digest index entry.
All sample paths are relative (./assets/thumbs/...) and reference
non-existent files; the samples are shape references, not usable
artworks.
Repo hygiene
.gitignoreconsolidated; placeholders (.gitkeep) preserved for
the emptydist/,digests/,thumbs/{256,512}/,web/data/
directories.- The legacy
.gitignore.local(identical content, outdated
comment) was removed.
Wrapper path-agnosticism
scripts/artvee_nightly_wrapper.shnow derivesBASE_DIRfrom
its own location via$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd),
replacing the previous hardcoded$HOME/...paths.PYTHONdefaults topython3fromPATH; can be overridden by
ARTVEE_PYTHONenvironment variable.
Safety check
scripts/check_open_source_ready.py— a pure-stdlib,
read-only, exit-coded check that fails the build on:- tracked files in gitignored directories,
- path leaks (absolute home path, user-home shorthand, workspace-name substring) in non-source text files,
- real-looking secrets (
password = "...",token = "...",
secret = "..."), - tracked files > 1 MB.
2. Verification status
| Check | Result |
|---|---|
py_compile on all shipped scripts |
✅ |
bash -n on shipped shell scripts |
✅ |
python3 scripts/check_open_source_ready.py |
✅ PASS |
git ls-files against gitignore surface |
✅ no generated data tracked |
| Public demo live at https://conanxin.github.io/projects/artvee-gallery-demo/ | ✅ |
| Nightly cron auto-run (2026-06-12 02:00) | ✅ PASS |
| Last-known-good nightly snapshot | 760 downloaded, 0 failed, 530 pending |
The most recent nightly verification report lives at
<workspace>/reports/artvee-nightly-auto-run-verification-2026-06-12.md
in the maintainer's local workspace; it is intentionally not
committed to this repository.
3. Limitations
- The repository does not include a corpus. To exercise the
local UI shell, the user must populateimages/,metadata/,
andindex/locally. This is by design — see
docs/OPEN_SOURCE_BOUNDARIES.md. - The Telegram notifier depends on a local OpenClaw CLI as the
message bridge. Users without that bridge can simply skip the
notify step (the wrapper isolates it with|| true). - Source-code privacy is verified by code review and the readiness
check; it is not enforced by.gitignore(which is correct:
source files are tracked). - The sample data uses fictitious IDs and categories; it is not
a working subset of any real archive.
4. Next steps
See docs/ROADMAP.md § "Near-term":
- P3D — Standalone public GitHub repository: initialise, push
only the open-source surface area, configure branch protection
and a CI job that runscheck_open_source_ready.pyon every PR. - P3E — Public daily-digest page, alongside the existing
public gallery demo.
5. Acknowledgements
- Data source: artvee.com public-domain art
archive. - The local-first / open-source boundary pattern is inspired by
the standard "thin shell, fat scripts" approach for data tooling.