All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- HTTP URLs (
http://) are now permitted; HTTPS is strongly recommended but no longer enforced. Use HTTP only on trusted local networks or for development.
2.0.8 - 2025-02-01
decrypt_data_blob_async()method for non-blocking decryption in async contexts- Exported
Location,PhotoResult, andRateLimitErrorfrom package root CHANGELOG.mdfollowing Keep a Changelog format- Comprehensive exception documentation (Raises sections) for all public API methods
- Improved lock message sanitization to re-collapse whitespace after removing special characters
- Simplified
get_history()signature by removing unusedstart/endparameters - Improved docstrings for helpers.py functions
- Dead code:
_parse_location_blob()function that was never called - Placeholder comment from helpers.py
- Lock messages containing only special characters now correctly fall back to plain "lock" command
2.0.7 - 2025-01-15
- Cleanup release to trigger new PyPI deployment
- No functional changes from 2.0.6
2.0.6 - 2025-01-10
- 100% test coverage achieved
- Full type safety with strict mypy checks
- Improved method signatures with precise return types
2.0.5 - 2025-01-08
- Strict typing enforcement (Phase 1)
- Comprehensive edge case tests for
Locationparsing docs/strict_typing_enforcement_plan.mdroadmap
- Updated community instance URL to https://server.fmd-foss.org/
2.0.4 - 2024-11-09
- Password-free authentication via
export_auth_artifacts()andfrom_auth_artifacts() drop_password=Trueoption to discard raw password after onboardingDevice.get_picture_blobs()andDevice.decode_picture()methodsDevice.lock(message=...)with sanitization (quotes, backticks, semicolons removed)- Wipe PIN validation (alphanumeric ASCII only, no spaces)
- PNG detection via magic bytes in
export_data_zip()
- 401 handling now supports hash-based token refresh
- Private key loading supports both PEM and DER formats
- Test coverage increased to ~98%
Device.take_front_photo()- usetake_front_picture()Device.take_rear_photo()- usetake_rear_picture()Device.fetch_pictures()- useget_picture_blobs()Device.download_photo()- usedecode_picture()
2.0.0 - 2024-10-01
- Async client with
FmdClient.create()factory method - Async context manager support (
async with) - HTTPS enforcement (plain HTTP rejected)
- Configurable SSL validation (
ssl=Falsefor dev, customSSLContextfor production) - Request timeouts on all HTTP calls
- Retry logic with exponential backoff and jitter for 5xx errors
- 429 rate-limit handling with Retry-After support
- Client-side ZIP export (locations + pictures)
Devicehelper class for convenience actionspy.typedmarker for PEP 561 compliance- GitHub Actions CI (lint, type-check, tests, coverage)
- Codecov integration with badges
- Complete rewrite from sync to async API
- Python 3.8+ required (3.7 dropped)
- Legacy synchronous
FmdApiclass
- Sanitized logging (no sensitive payloads exposed)
- Token masking in debug output
Previous synchronous implementation. See git history for details.