Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true

[*.py]
indent_size = 4
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Public configuration only. Never prefix secrets with PUBLIC_.
# Leave blank until the separate feedback Worker is configured and approved.
PUBLIC_FEEDBACK_API_URL=
PUBLIC_TURNSTILE_SITE_KEY=
# Local development automatically uses a clearly labeled loopback mock.
# Set true only for a non-indexable build used for review.
PUBLIC_PREVIEW=false
# Telegram/Cloudflare credentials belong to their separate services, never here.
11 changes: 11 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## What changes for visitors

Describe the visible behavior and the reason for it. Link representative desktop/mobile screenshots when the interface changes.

## Validation

List commands actually run, measured results, and remaining limitations. Distinguish fixtures from authenticated service tests.

## Deployment and privacy

State whether credentials, content synchronization, third-party requests, public URLs or hosting settings are affected. Keep secrets and personal feedback out of this description. Merging or deploying requires the owner's explicit approval.
40 changes: 40 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Quality checks
on:
push:
branches-ignore:
- main
pull_request:
workflow_dispatch:
permissions:
contents: read
env:
ASTRO_TELEMETRY_DISABLED: 1
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- run: npm ci
- run: npm run check
- run: npx playwright install --with-deps chromium firefox webkit
- run: npm run test:browsers
- uses: actions/upload-artifact@v4
if: always()
with:
name: browser-quality-results
path: artifacts/final/
retention-days: 7
profile-sync-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.13'
- run: python -m pip install -r services/profile-sync/requirements.txt
- run: python -m unittest discover -s services/profile-sync -p "test_*.py" -v
- run: python -m unittest discover -s services/posts-sync -p "test_*.py" -v
46 changes: 46 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Approved Pages deployment
on:
workflow_dispatch:
inputs:
approval:
description: 'Type DEPLOY_WIZARDLOOP only after explicit owner approval'
required: true
type: string
permissions:
contents: read
concurrency:
group: pages-production
cancel-in-progress: false
env:
ASTRO_TELEMETRY_DISABLED: 1
jobs:
build:
if: github.ref == 'refs/heads/main' && inputs.approval == 'DEPLOY_WIZARDLOOP'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- run: npm ci
- run: npm run check
env:
PUBLIC_FEEDBACK_API_URL: ${{ vars.PUBLIC_FEEDBACK_API_URL }}
PUBLIC_TURNSTILE_SITE_KEY: ${{ vars.PUBLIC_TURNSTILE_SITE_KEY }}
- uses: actions/upload-pages-artifact@v3
with:
path: dist
deploy:
needs: build
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy approved static artifact
id: deployment
uses: actions/deploy-pages@v4
19 changes: 19 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
node_modules/
.env
.env.*
!.env.example
*.session
*.session-journal
artifacts/
.preview.log
.preview.err
dist/
.astro/
test-results/
playwright-report/
.wrangler/
.dev.vars
__pycache__/
.venv/
*.pyc
*.log
12 changes: 12 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"singleQuote": true,
"plugins": ["prettier-plugin-astro"],
"overrides": [
{
"files": "*.astro",
"options": {
"parser": "astro"
}
}
]
}
32 changes: 32 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Changelog

This file records repository changes. A heading does not mean a Git tag, GitHub Release or production deployment exists.

## 1.0.0-rc.1 - Unreleased

### Website

- Rebuild the personal portfolio with Astro static output and the selected Spectrum Circuit direction, developed with comic framing and the owner's wizard illustrations.
- Add Home, About, Selected Work, Projects, Posts, Community, Feedback, Privacy, Cookies, Security, Accessibility and a custom 404 page.
- Add responsive navigation, light and dark themes, persistent preferences, keyboard controls, motion pause and reduced-motion behavior.
- Return the hero to a still preview when a native decoder stops unexpectedly, while preserving intentional user and visibility pauses.
- Detect a frozen native-video clock even when the decoder still reports playback, and avoid false failures after delayed timer callbacks.
- Include 30 original wizard animations and six flag samples, unchanged source TGS files, transparent posters and provenance manifests.
- Add page-specific metadata, structured data, static social artwork, favicons, sitemap output and domain-preserving builds.

### Services and tooling

- Add an isolated profile synchronization service with active-photo identity matching, video/still selection, cache, fallback and offline fixtures.
- Add consent-gated Telegram posts and a separately configured supported-update ingestion path. Original Telegram links remain available when embedded media is incomplete.
- Add a feedback Worker and local mock, server validation, Turnstile verification, private-chat setup and provider-mocked tests.
- Add source/build checks, browser coverage, accessibility checks, quality CI and an approval-gated manual Pages workflow.
- Correct the canvas media fixture, measure native loop capability independently from application code, and record actual encoded AVC metadata.
- Document setup, content editing, service limitations, asset rights, contribution, security reporting and release/rollback procedures.

### Review status

This is an unreleased review candidate. Measured browser, accessibility, performance and offline-service results are documented in [the quality review](docs/QA.md). Authenticated Telegram/profile media tests, live feedback delivery, native Safari and human screen-reader review, production validation, merge approval and release approval remain separate steps. Complete legal/accessibility conformance is not asserted.

## Earlier baseline

The original four-file website remains in Git history at `658ed667c173f861cd16e6048126de12ec3648b9` from 2025-07-20. The initial audit found no Git tags or GitHub Releases. Do not assign a historical semantic version retrospectively. Phase 1 tooling used `0.1.0-preview.1` while three local concepts were evaluated; it was not a production release.
13 changes: 13 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Code of Conduct

This is a personal open-source project. Everyone participating in its issues, pull requests and discussions should be able to contribute without harassment.

Be respectful and specific. Discuss the work and its effects, explain disagreements, welcome questions and credit contributions. Respect privacy, accessibility needs and different backgrounds or levels of experience.

Harassment, discriminatory abuse, threats, sexualized comments, impersonation, deliberate disruption and publishing another person's private information are not acceptable. Do not use project spaces for spam, unwanted solicitation or attempts to obtain credentials.

Report a concern privately to WizardLoop through [Telegram](https://t.me/wizardloop) or the published email, [wizard@wizardloop.com](mailto:wizard@wizardloop.com). Share only what is needed to understand the incident. Do not publish private evidence in an issue or circulate it unnecessarily.

The maintainer may request changes, remove inappropriate material or restrict participation to protect the project. The response should consider the conduct, its impact and whether it continued after a request to stop. No fixed response time or confidential reporting platform is promised by this document.

These expectations apply to this repository and project spaces managed by its maintainer, and when someone explicitly represents the project elsewhere. This document does not claim authority over unrelated communities.
36 changes: 36 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Contributing to WizardLoop

This repository is the source of one creator's personal website. Contributions should improve that website while preserving the owner's identity, verified content and control over publication.

For a small correction, open a focused pull request. Discuss substantial visual changes, new services or dependencies in an issue first. Never disclose credentials, personal submissions or a vulnerability in a public issue or pull request; use [SECURITY.md](SECURITY.md).

## Working locally

1. Read the [README](README.md), relevant service guide and [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
2. Use a dedicated branch or fork. Do not work directly on `main` or alter another repository as part of this project.
3. Install locked dependencies with `npm ci` using Node 22.23.4 or newer.
4. Run `npm run dev`. The frontend and optional `npm run dev:feedback` mock require no live credentials.
5. Make the smallest coherent change. Keep content, styles, browser interactions and private integrations in their existing locations.

Do not change `wizardloop.com`, either CNAME file, production settings or deployment behavior as incidental cleanup. Such changes need a specific proposal and owner approval.

## Content, design and accessibility

- Use English by default and preserve correct direction handling for Hebrew content.
- Verify project links and factual claims. Do not invent clients, achievements, personal details or social profiles.
- Use a regular hyphen instead of the em dash character U+2014 in controlled content, metadata and documentation.
- Keep keyboard access, visible focus, semantic headings, readable contrast and small-screen layouts. Honor reduced motion and the global motion control.
- Keep useful static content when JavaScript or a third party fails. Avoid heavy dependencies for effects that local CSS or existing components can provide.
- Preserve media attribution. MIT code contributions do not relicense the owner's artwork or third-party assets. Record the source and license of any new font, icon, media or dependency.

## Validation and pull requests

Run `npm run check`. For layout or interaction changes, build the site and run relevant Playwright checks, including `npm run test:browsers` when browser behavior changes. Follow service-specific tests for profile, posts or feedback changes. Do not write redundant tests for a simple text correction; existing content/build checks still apply.

A useful pull request describes the concrete problem, resulting behavior, validation and remaining limits. Include desktop/mobile screenshots for visual changes and both themes where relevant. Identify mocks and fixtures explicitly. Do not report an external integration as verified unless it was exercised with authorized credentials.

Keep lockfile changes with dependency changes. Do not commit `node_modules`, build output, test artifacts, `.env`, `.dev.vars`, sessions, private chat IDs, submitted messages or tokens. Check the diff for accidentally included local files before submitting.

Owner review governs design and content acceptance. A pull request does not authorize merging, deploying, enabling services, creating releases or changing DNS. Follow [DEPLOYMENT.md](docs/DEPLOYMENT.md) for those separate operations.

By submitting new source code, you offer it under the repository's MIT license. Only submit material you have the right to contribute, and identify any different asset license. Participation is subject to the [Code of Conduct](CODE_OF_CONDUCT.md).
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 WizardLoop

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading
Loading