commits
Sync opam package metadata including x-maintenance-intent
and external dependency specifications.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rewrite bushel_typesense to use typed Typesense library APIs
- Use Typesense.Field.T.v and Typesense.CollectionSchema.T.v for schemas
- Use Jsont.Json module for document construction
- Add incremental sync that compares with existing documents
- Export existing document IDs from Typesense
- Only create/update changed documents
- Delete documents that no longer exist locally
- Implement proper dryrun mode that reports what would change
- Shows document IDs that would be created/deleted
- Reports counts per collection
- Add sync_stats tracking (created, updated, deleted, unchanged, errors)
- Update bushel_sync.ml to use new Typesense_auth.Client API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename Peertube module references to Peer_tube in client library
- Refactor bushel_peertube to use generated Peer_tube types
- Remove hand-coded JSON codecs in favor of generated ones
- Add helper functions to extract values from Jsont.json for untyped fields
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace curl-based HTTP client with ocaml-requests library
- Proper HTTP status code handling (was silently failing on errors)
- Connection pooling and TLS support via Eio
- Change ~proc_mgr parameter to ~http across all sync modules
- Fix PeerTube JSON parsing for nullable fields
- Add nullable_string and nullable_ptime Jsont combinators
- Handle null values in description, originallyPublishedAt, thumbnailPath
- Reorder sync pipeline: images -> thumbs -> faces -> videos -> srcsetter
- Srcsetter now runs last to process all fetched images
- Thumbnails now go to local_source_dir for srcsetter processing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Normalize slugs to match Jekyll behavior (dots → dashes)
so geotessera-python-0.7 becomes geotessera-python-0-7
- Add filesystem PDF check to JSON feed attachments
matching arod_papers.ml behavior for static/papers/*.pdf
- Add DOI cache infrastructure for external references:
- New bushel_doi_entry.ml module for parsing data/doi.yml
- Load DOI entries in bushel_loader.ml
- Complete note_references with external DOI URL scanning
- Scan for doi.org URLs and publisher URLs (Elsevier, IEEE, etc.)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Port thumbnail_slug from old bushel with full fallback chain:
ideas use supervisor faces (active) or project image (completed),
notes try titleimage -> first image -> first video -> slug_ent
- Port thumbnail with project fallback to supervisor faces
- Fix [##tag] reference-style links to strip prefix and use # as dest
- Show thumbnail slug column in bushel list and bushel show
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Images with special positioning directives (%c, %r, %lc, %rc) are now
converted to HTML <figure> elements with:
- Appropriate CSS class (image-center, image-right, etc.)
- alt and title attributes from the markdown title
- srcset with responsive image variants
- figcaption with the title text
Video slugs in image syntax (![:video-slug]) are now embedded as
iframes with the watch URL converted to embed URL.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Convert Bushel-flavored markdown to standard markdown by resolving:
- :slug links to [Title](URL)
- @@handle to [Name](contact_url)
- ##tag to [tag](/tags/tag)
- ![:image-slug] to 
Also adds:
- Images field to Bushel_entry.t with lookup_image function
- to_markdown function in Bushel_md for the conversion
- Optional image_output_dir parameter to loader
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Copy PNG thumbnails from Sortal store to local_source_dir/faces/
- Move faces step before srcsetter so they get processed
- Remove dependency on Immich API for face thumbnails
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move thumbs step before srcsetter so paper thumbnails get processed
- Output PNGs to local_source_dir/papers/ instead of local_output_dir
- Srcsetter will convert these to webp variants automatically
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Integrate srcsetter library to load processed images from index.json:
- Add load_images function to bushel_loader
- Add 'bushel images' CLI command with sorting options
- Include image count in 'bushel stats' output
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add --dry-run / -n flag to show commands without executing
- Refactor sync steps to accept dry_run parameter
- Show command details in dry-run mode for each step
- Use Eio.Path.mkdirs for recursive directory creation
- Integrate srcsetter as a library for direct invocation
- Fix sortal sync to skip PNG conversion when PNG exists
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove bushel_contact.ml, use Sortal_schema.Contact directly
- Add typed service_kind variants: ActivityPub (with Mastodon/Pixelfed/PeerTube),
Bluesky, Github, Git, Twitter, Photo, Custom
- Add convenience accessors: github_handle, twitter_handle, mastodon_handle,
bluesky_handle
- Add find_by_handle and lookup_by_name to Sortal_store
- Update bushel_loader to load contacts from Sortal XDG store
- Fix sortal sync to skip PNG conversion when PNG already exists
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rewrite bushel_typesense to use typed Typesense library APIs
- Use Typesense.Field.T.v and Typesense.CollectionSchema.T.v for schemas
- Use Jsont.Json module for document construction
- Add incremental sync that compares with existing documents
- Export existing document IDs from Typesense
- Only create/update changed documents
- Delete documents that no longer exist locally
- Implement proper dryrun mode that reports what would change
- Shows document IDs that would be created/deleted
- Reports counts per collection
- Add sync_stats tracking (created, updated, deleted, unchanged, errors)
- Update bushel_sync.ml to use new Typesense_auth.Client API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename Peertube module references to Peer_tube in client library
- Refactor bushel_peertube to use generated Peer_tube types
- Remove hand-coded JSON codecs in favor of generated ones
- Add helper functions to extract values from Jsont.json for untyped fields
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace curl-based HTTP client with ocaml-requests library
- Proper HTTP status code handling (was silently failing on errors)
- Connection pooling and TLS support via Eio
- Change ~proc_mgr parameter to ~http across all sync modules
- Fix PeerTube JSON parsing for nullable fields
- Add nullable_string and nullable_ptime Jsont combinators
- Handle null values in description, originallyPublishedAt, thumbnailPath
- Reorder sync pipeline: images -> thumbs -> faces -> videos -> srcsetter
- Srcsetter now runs last to process all fetched images
- Thumbnails now go to local_source_dir for srcsetter processing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Normalize slugs to match Jekyll behavior (dots → dashes)
so geotessera-python-0.7 becomes geotessera-python-0-7
- Add filesystem PDF check to JSON feed attachments
matching arod_papers.ml behavior for static/papers/*.pdf
- Add DOI cache infrastructure for external references:
- New bushel_doi_entry.ml module for parsing data/doi.yml
- Load DOI entries in bushel_loader.ml
- Complete note_references with external DOI URL scanning
- Scan for doi.org URLs and publisher URLs (Elsevier, IEEE, etc.)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Port thumbnail_slug from old bushel with full fallback chain:
ideas use supervisor faces (active) or project image (completed),
notes try titleimage -> first image -> first video -> slug_ent
- Port thumbnail with project fallback to supervisor faces
- Fix [##tag] reference-style links to strip prefix and use # as dest
- Show thumbnail slug column in bushel list and bushel show
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Images with special positioning directives (%c, %r, %lc, %rc) are now
converted to HTML <figure> elements with:
- Appropriate CSS class (image-center, image-right, etc.)
- alt and title attributes from the markdown title
- srcset with responsive image variants
- figcaption with the title text
Video slugs in image syntax (![:video-slug]) are now embedded as
iframes with the watch URL converted to embed URL.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Convert Bushel-flavored markdown to standard markdown by resolving:
- :slug links to [Title](URL)
- @@handle to [Name](contact_url)
- ##tag to [tag](/tags/tag)
- ![:image-slug] to 
Also adds:
- Images field to Bushel_entry.t with lookup_image function
- to_markdown function in Bushel_md for the conversion
- Optional image_output_dir parameter to loader
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add --dry-run / -n flag to show commands without executing
- Refactor sync steps to accept dry_run parameter
- Show command details in dry-run mode for each step
- Use Eio.Path.mkdirs for recursive directory creation
- Integrate srcsetter as a library for direct invocation
- Fix sortal sync to skip PNG conversion when PNG exists
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove bushel_contact.ml, use Sortal_schema.Contact directly
- Add typed service_kind variants: ActivityPub (with Mastodon/Pixelfed/PeerTube),
Bluesky, Github, Git, Twitter, Photo, Custom
- Add convenience accessors: github_handle, twitter_handle, mastodon_handle,
bluesky_handle
- Add find_by_handle and lookup_by_name to Sortal_store
- Update bushel_loader to load contacts from Sortal XDG store
- Fix sortal sync to skip PNG conversion when PNG already exists
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>