PhotoArchive is an API-first personal photo archive platform focused on long-term preservation, archive navigation, and rich photo discovery experiences.
The project currently provides:
- A stable ASP.NET Core REST API
- Import tooling for legacy Jekyll photo galleries
- PostgreSQL-backed metadata storage
- Archive navigation by year/month/day
- Hypermedia-style API responses
- Generated OpenAPI/Swagger documentation
- Integration test coverage
- CI-based documentation generation
The current main branch represents the initial stable API surface (v1 candidate).
The API now includes:
- Stable routes
- Centralized querying
- Consistent pagination
- Integration tests
- Swagger/OpenAPI metadata
- XML-generated reference documentation
PhotoArchive is organized into several projects:
| Project | Purpose |
|---|---|
PhotoArchive.Api |
ASP.NET Core REST API |
PhotoArchive.Core |
Shared models, DTOs, link generation |
PhotoArchive.Data |
EF Core data access and services |
PhotoArchive.Tools |
Import and maintenance tooling |
PhotoArchive.Functions |
Azure Functions integration experiments |
PhotoArchive.Tests |
Integration and API tests |
Additional documentation lives under:
/docs/PhotoArchive
Browse photos by archive hierarchy:
/years
/years/{year}
/years/{year}/months/{month}
/years/{year}/months/{month}/days/{day}
/photos
/photos/{slug}
Supports filtering by:
- year
- month
- day
- source
- gallery
- postId
Example:
/photos?source=instagram&page=1&pageSize=25
/posts/{postId}
/posts/{postId}/photos
/galleries/{gallery}/photos
/on-this-day
/on-this-day?month=5&day=5
Photo collection endpoints use a shared paged response format:
{
"page": 1,
"pageSize": 25,
"totalCount": 352,
"totalPages": 15,
"items": [],
"links": {
"self": {},
"first": {},
"previous": {},
"next": {},
"last": {}
}
}Pagination links preserve active filters.
Each imported photo currently includes:
- Slug
- Title
- TakenAt
- Year / Month / Day
- Source
- OriginalUrl
- ThumbUrl
- Gallery
- PostId
- PostUrl
- SortIndex
- RawMetadata
PhotoArchive currently imports legacy Jekyll _gallery markdown content.
dotnet run --project src/PhotoArchive.Tools -- import-jekyll-gallery "<path>" --dry-rundotnet run --project src/PhotoArchive.Tools -- import-jekyll-gallery "<path>"The importer is idempotent and safe to re-run.
See the setup documentatoin in the docs folder
/docs/PhotoArchive
Generated from XML comments using xml2doc.
Regenerate locally:
./scripts/build-docs.ps1 -Configuration ReleaseThe repository includes workflows for:
- build validation
- test execution
- generated documentation
- documentation PR generation
The repository includes integration tests covering:
- archive navigation
- pagination
- filter preservation
- posts
- galleries
- on-this-day
- photo detail routes
- response consistency
PhotoArchive is intentionally:
- API-first
- archive-oriented
- resource-driven
- queryable
- frontend-agnostic
The API is designed to support future:
- React-based archive experiences
- gallery browsing
- timeline navigation
- social-style photo discovery
- media management workflows
- API stabilization
- frontend exploration
- archive browsing UX
- documentation quality
- React frontend
- authenticated management UI
- CRUD workflows
- first-class gallery entities
- cover photo selection
- richer search/filtering
- tagging/location metadata
- uploads and editing
See:
/docs/PhotoArchive
for detailed architecture, API, and generated reference documentation.