Change log#
0.1.5 (unreleased)#
New features#
Added Dependabot config. #78
Added
CODEOWNERS. #28Added
SECURITY.md. #44Added
field_modessupport to Fernet live-proxy tokens so per-field UI choices are applied on fetch. #139Added Open Web Calendar tutorial at
docs/tutorials/open-web-calendar.rst. #93Added
docs/examples.rstwith real-world workflows. #59
Minor changes#
Adopted
sphinx_issuesextension for shorter changelog issue and pull request references.
Bug fixes#
0.1.4 (2026-04-20)#
New features#
Persisted per-field anonymization options across page loads via
localStorage. #116
Minor changes#
Bug fixes#
Fixed
DockerfileCMDto use JSON array form withsh -cwrapper, resolving theJSONArgsRecommendedlint warning while preserving shell variable expansion forHOST,PORT, andWORKERS.Preserved
X-WR-TIMEZONE. #112
0.1.3 (2026-04-02)#
New features#
Added automatic Docker build trigger on release via
gh workflow runin.github/workflows/release.yml. #77
Minor changes#
0.1.2 (2026-02-11)#
New features#
Added configurable per-field anonymization modes with four options: keep (preserve original), remove (strip property), randomize (hash - default), and replace (fixed placeholder). Supports 10 configurable fields:
SUMMARY,DESCRIPTION,LOCATION,COMMENT,CONTACT,RESOURCES,CATEGORIES,ATTENDEE,ORGANIZER, andUID. Newfield_modesparameter inanonymize()function. CLI flags:--summary,--description,--location, etc. Web API:configfield in request bodies and query parameters. Frontend: collapsible “Advanced Options” section in all three tabs. Backward compatible with existingpreserveparameter. Constraint:UIDcannot use remove mode (would break recurring events). #92Added Fernet-based encrypted links for live calendar proxying. Endpoints:
POST /fernet-generate(creates token) andGET /fernet/{token}(fetches and anonymizes on-the-fly). Token encrypts source URL and salt viaFERNET_KEYenvironment variable. Frontend radio buttons toggle between Fernet (live) and R2 (snapshot) modes. Vendors pure-Python Fernet implementation for Cloudflare Workers compatibility. #95Added
/anonymizedendpoint for curl-friendly anonymization. Supports GET withicsquery parameter and POST with raw ICS body. Returnstext/calendarwithoutContent-Dispositionheader for easy piping. #25Added shareable links with Cloudflare R2 storage. Users can generate time-limited public URLs for anonymized calendars with 30-day auto-expiry. New endpoints:
POST /share(generate link) andGET /s/{id}(retrieve file). Frontend checkboxes in all three tabs (upload, paste, fetch URL). R2 client wrapper with MockR2Client for local dev and WorkersR2Client for production. Health endpoint reports R2 availability. R2 bucket binding configured inwrangler.jsonc. #7Added Cloudflare Workers deployment support with Python FastAPI via Pyodide. Configured
wrangler.jsoncfor Workers Assets serving static files. Createdworker.pyentry point usingasgi.fetch()integration. Addedbuild.shto bundle local package intopython_modules/. GitHub Actions workflow deploys on main branch. Custom domain configured at https://icalendar-anonymizer.com. #19 #83Added Docker setup for self-hosting. Multi-stage
Dockerfilewith Python 3.13-slim, non-root user (UID 1000), and gunicorn with uvicorn workers. Health check endpointGET /healthreturns service status, version, and feature flags.docker-compose.ymlwith environment variables for host, port, workers, and file size limit. Documentation atdocs/usage/self-hosting.rst. #8Added frontend interface with file upload, paste, and URL fetch capabilities. Implemented drag and drop file upload with visual feedback. Added progressive enhancement for no-JavaScript environments. Provided WCAG AA compliant accessibility features (keyboard navigation, screen readers). Included mobile-responsive design for all device sizes. Zero external dependencies (vanilla HTML/CSS/JS). #5
Added FastAPI web service with three endpoints:
POST /anonymize(JSON),POST /upload(file),GET /fetch(URL). SSRF protection blocks private IPs, localhost, and invalid schemes. 10s timeout, 10MB limit. Install:pip install icalendar-anonymizer[web]. #4
Minor changes#
Added
REUSE.tomlfor fallback licensing of files without SPDX headers (auto-generated_version.py). In-file headers remain preferred. #58Improved test coverage for Cloudflare Workers integration. #90
Moved
fastapi,httpx, andpython-multipartfrom core dependencies to[web]extras. Base installation now only requiresicalendar. #23Updated documentation to use
python -m pipper best practices. #97
Bug fixes#
Fixed Fernet encryption for Cloudflare Workers by vendoring pyaes and fernet (MIT-licensed from
ricmoo/pyaesandoz123/python-fernet). Pyodide requires pure-Python or wasm32 wheels;cryptographyhas neither on PyPI. AddedFERNET_KEYenv copy from Workers toos.environ. #100 #101Fixed property iteration causing subcomponent corruption. Changed calendar property iteration from
property_items()toitems()to avoid copying subcomponent properties to calendar level, and added filtering ofBEGIN/ENDstructural markers in component property processing. This resolves malformed ICS output where event properties appeared at calendar level and were wrapped in spurious subcomponents during serialization/deserialization. #92Fixed Cloudflare Workers deployment issues including module bundling, build order, static asset serving, and wrangler configuration. #84 #85 #86 #87 #88
0.1.1 (2025-12-25)#
New features#
Added Sphinx documentation with PyData theme on Read the Docs. Includes installation guide, Python API reference with property table and autodoc, CLI usage guide, web service API documentation, and contributing guide with commit format reference. Changed bash to shell code-block lexer, converted lists to definition lists, added documentation standards section. Configured
docs/conf.pywithsphinx_design,sphinx_copybutton,sphinx.ext.intersphinx. Updatedpyproject.tomlwith doc dependencies. Added badge toREADME.md. Documentation at https://icalendar-anonymizer.readthedocs.io/stable/. #9 #60Added
.readthedocs.yamlconfiguration file with Ubuntu 24.04 build environment and Python 3.13 to enable automatic documentation builds on Read the Docs. #56Added command-line interface with icalendar-anonymize and ican commands. Supports stdin/stdout piping, file I/O, and verbose mode. Uses Click for argument parsing with built-in
-convention for Unix-style streams. Binary mode handling for ICS files. Comprehensive error handling with clear messages. Install withpip install icalendar-anonymizer[cli]. #3
Minor changes#
Commented out CHANGES.rst formatting guidelines to hide from rendered documentation. Added note in
CONTRIBUTING.mddirecting contributors to read the source file for formatting guidelines. Guidelines remain visible in source. #61
Bug fixes#
Fixed GitHub release notes to strip “v” prefix from PyPI version in install command. Added version extraction step in
.github/workflows/release.ymlto convert tagv0.1.0to0.1.0for pip install command, ensuring correct PyPI package installation.
0.1.0 (2025-12-05)#
New features#
Added
preserveparameter toanonymize()function. Accepts optional set of property names to preserve beyond defaults. Case-insensitive. Allows preserving properties likeCATEGORIESorCOMMENTfor bug reproduction when user confirms no sensitive data. Added 7 tests for preserve functionality. #53Added core anonymization engine with
anonymize()function using SHA-256 deterministic hashing. Removes personal data (names, emails, locations, descriptions) while preserving technical properties (dates, recurrence, timezones). Configurable salt parameter enables reproducible output. Property classification system with default-deny for unknown properties. Structure-preserving hash functions maintain word count and email format. UID uniqueness preserved across calendar. Special handling forATTENDEE/ORGANIZERwithCNparameter anonymization. Test suite with 35 tests achieves 95% coverage. #1 #2Added comprehensive CI/CD workflows with GitHub Actions: test matrix across Ubuntu/Windows/macOS with Python 3.11-3.13, Ruff to lint and check the format of code, Codecov integration with multi-platform coverage tracking, PyPI trusted publishing (OIDC, no tokens required), Docker multi-arch builds (AMD64/ARM64), and automatic GitHub releases with generated notes. Added
.github/workflows/tests.yml,.github/workflows/publish.yml,.github/workflows/docker.yml, and.github/workflows/release.yml. Configured hatch test matrix for local multi-version testing and coverage exclusions inpyproject.toml. Added CI/CD badges toREADME.md(tests, coverage, PyPI version, Python versions, Docker pulls). Added test structure with placeholder files referencing related issues. Docker images originally published to Docker Hub atsashankbhamidi/icalendar-anonymizer; migrated to GitHub Container Registry atghcr.io/pycalendar/icalendar-anonymizerin v0.1.3. #10Added
.gitattributesto normalize line endings across platforms (LF in repository, native line endings on checkout).Added comprehensive pre-commit hooks configuration with Ruff linting/formatting, file integrity checks, and commit message validation. Updated
CONTRIBUTING.mdwith setup instructions and usage documentation. Added Ruff badge toREADME.md. #20Added conventional commits configuration (
.cz.toml), pre-commit hooks, CI workflows, and documentation. #27Applied Sphinx best practices to
CHANGES.rstincluding proper RST roles, subheadings, and past tense verbs. #31Added project configuration files (
.gitignore,.editorconfig,.python-version,requirements-dev.txt). #16Added
LICENSEwith AGPL-3.0-or-later license. #14Added
CONTRIBUTING.mdwith development workflow, commit message format, testing requirements, and project structure. #15Added
README.mdwith installation instructions and usage examples for Python API, CLI, and web service. #13Added
pyproject.tomlwith hatchling build system, hatch-vcs version management, package structure, and dependencies. Tests included in package atsrc/icalendar_anonymizer/tests/. #12Added REUSE specification compliance with SPDX headers to all source files, configuration files, documentation, and workflows. Added
.github/workflows/reuse.ymlfor automated CI compliance checking andreusehook to.pre-commit-config.yamlfor local validation. DownloadedLICENSES/AGPL-3.0-or-later.txt. Project is fully compliant with REUSE 3.3 specification for clear licensing. #22
Minor changes#
Standardized docstring format to multi-line Google-style across all modules. Removed placeholder Examples sections. #52
Parametrized duplicate test patterns using
pytest.mark.parametrize()for datetime, recurrence, metadata, text anonymization, and word count tests. Reduced test duplication while maintaining coverage. #52Added doctest validation for core modules with
test_with_doctest.py. #52Updated
CONTRIBUTING.mdwith code style guidelines including docstring format, test organization patterns, and import conventions. #52