{"authors":[{"name":"Shinya Kato","url":"https://shinyakato.dev/"}],"description":"Projects I have shipped with something public to point at — records, not a blog.","feed_url":"https://shinyakato.dev/portfolio/feed.json","home_page_url":"https://shinyakato.dev/portfolio/","items":[{"content_text":"A static site generated by Hugo, holding a profile page of links and this archive. A push to CodeCommit runs a CodeBuild project that syncs it to S3 behind CloudFront.","date_modified":"2026-08-01T00:00:00Z","date_published":"2026-08-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/shinyakato-dev/","summary":"Personal site and works archive","tags":["Hugo","HTML/CSS","JavaScript","TypeScript","AWS CodeCommit","AWS CodeBuild","Amazon EventBridge","Amazon S3","Amazon CloudFront","Amazon Route 53"],"title":"shinyakato.dev — Personal site and works archive","url":"https://shinyakato.dev/portfolio/shinyakato-dev/"},{"content_text":"A template for a Bluesky custom feed generator in Dart: a firehose indexer, a swappable ranking algorithm and store, and the three endpoints AppView calls, served over shelf.","date_modified":"2026-08-01T00:00:00Z","date_published":"2026-07-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/feed-generator/","summary":"A Bluesky custom feed generator template","tags":["Dart","Shelf","AT Protocol","Bluesky API","REST API"],"title":"feed_generator — A Bluesky custom feed generator template","url":"https://shinyakato.dev/portfolio/feed-generator/"},{"content_text":"The last mile between bluesky_text and a Bluesky client: a text controller that highlights entities and the over-limit tail while typing, and a viewer for fetched posts.","date_modified":"2026-07-01T00:00:00Z","date_published":"2026-07-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/bluesky-text-flutter/","summary":"Flutter widgets for bluesky_text","tags":["Dart","Flutter","Bluesky API","Facets (Rich Text)"],"title":"bluesky_text_flutter — Flutter widgets for bluesky_text","url":"https://shinyakato.dev/portfolio/bluesky-text-flutter/"},{"content_text":"Resolves an AT Protocol handle or DID to its DID document, PDS origin and signing key, and verifies the service-auth tokens arriving at a feed generator or an AppView.","date_modified":"2026-08-01T00:00:00Z","date_published":"2026-07-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/atproto-identity/","summary":"AT Protocol identity resolution for Dart","tags":["Dart","Flutter","AT Protocol","REST API"],"title":"atproto_identity — AT Protocol identity resolution for Dart","url":"https://shinyakato.dev/portfolio/atproto-identity/"},{"content_text":"A technical blog built with Docusaurus. Drafts become MDX via Claude Code and Kiro; a push to CodeCommit runs CodePipeline and CodeBuild, and S3 and CloudFront serve it.","date_modified":"2026-08-01T00:00:00Z","date_published":"2026-02-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/dayonelabs/","summary":"Tech blog built on an AI-assisted workflow","tags":["Docusaurus","React","TypeScript","Algolia","Kiro","Claude Code","Amazon Bedrock","AWS CodeCommit","AWS CodePipeline","AWS CodeBuild","Amazon EventBridge","Amazon S3","Amazon CloudFront","Amazon Route 53"],"title":"DayoneLabs — Tech blog built on an AI-assisted workflow","url":"https://shinyakato.dev/portfolio/dayonelabs/"},{"content_text":"A serverless AWS platform that fetches space-related content, transforms it, and distributes it to several social networks. A full Java rewrite of the 2023 APOD Bot for Bluesky.","date_modified":"2026-01-01T00:00:00Z","date_published":"2026-01-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/astra/","summary":"Serverless space-content distribution","tags":["Java","TypeScript","AWS Lambda","Amazon EventBridge","Amazon S3","Amazon DynamoDB","AWS CodeCommit","AWS CodeBuild","REST API"],"title":"Astra — Serverless space-content distribution","url":"https://shinyakato.dev/portfolio/astra/"},{"content_text":"The identifier layer under the atproto.dart packages: handle and DID validation, AT URI parsing, NSID, TID and record keys. It declares no other package in the monorepo.","date_modified":"2026-07-01T00:00:00Z","date_published":"2025-09-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/at-primitives/","summary":"AT Protocol identifier types for Dart","tags":["Dart","Flutter","AT Protocol"],"title":"at_primitives — AT Protocol identifier types for Dart","url":"https://shinyakato.dev/portfolio/at-primitives/"},{"content_text":"A code generator that turns AT Protocol Lexicon documents into Dart models, service classes and CLI commands. It generates atproto, bluesky and bluesky_cli.","date_modified":"2026-08-01T00:00:00Z","date_published":"2025-07-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/lex-gen/","summary":"Lexicon-to-Dart code generation","tags":["Dart","AT Protocol","Lexicon","Code Generation"],"title":"lex_gen — Lexicon-to-Dart code generation","url":"https://shinyakato.dev/portfolio/lex-gen/"},{"content_text":"A technical blog running WordPress on Amazon Lightsail. It was replaced by a Docusaurus static site over authoring experience and running cost.","date_modified":"2026-02-01T00:00:00Z","date_published":"2025-01-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/dayonelabs-wordpress/","summary":"Predecessor blog on Amazon Lightsail","tags":["WordPress","Amazon Lightsail"],"title":"DayoneLabs (WordPress) — Predecessor blog on Amazon Lightsail","url":"https://shinyakato.dev/portfolio/dayonelabs-wordpress/"},{"content_text":"A custom AWS Lambda runtime for Dart, restructured from the AWS Labs runtime for current Dart SDKs. One deployment registers several named handlers.","date_modified":"2025-09-01T00:00:00Z","date_published":"2024-04-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/aws-lambda-dart-runtime-ns/","summary":"A Dart runtime for AWS Lambda","tags":["Dart","AWS Lambda","Amazon API Gateway"],"title":"aws_lambda_dart_runtime_ns — A Dart runtime for AWS Lambda","url":"https://shinyakato.dev/portfolio/aws-lambda-dart-runtime-ns/"},{"content_text":"A Dart client for the DID PLC Directory — document, operation-log and audit-log lookups with caching, batching and streaming, plus ECDSA signing and verification.","date_modified":"2026-07-01T00:00:00Z","date_published":"2023-11-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/did-plc/","summary":"An independent DID PLC Directory client","tags":["Dart","Flutter","AT Protocol","REST API"],"title":"did_plc — An independent DID PLC Directory client","url":"https://shinyakato.dev/portfolio/did-plc/"},{"content_text":"A Dart implementation of the AT Protocol OAuth profile: pushed authorisation requests, PKCE, DPoP-bound tokens and automatic refresh, with every stage of the flow pluggable.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-11-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/atproto-oauth/","summary":"OAuth 2.0 with DPoP for the AT Protocol","tags":["Dart","Flutter","AT Protocol","Bluesky API","OAuth 2.0","PKCE","REST API"],"title":"atproto_oauth — OAuth 2.0 with DPoP for the AT Protocol","url":"https://shinyakato.dev/portfolio/atproto-oauth/"},{"content_text":"A Dart list of every official top-level domain, with domain and email validators over it. A daily GitHub Actions job regenerates the list from IANA and releases the diff.","date_modified":"2026-07-01T00:00:00Z","date_published":"2023-09-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/icann-tlds/","summary":"The ICANN TLD list, regenerated daily","tags":["Dart","Flutter","GitHub Actions","Code Generation"],"title":"icann_tlds — The ICANN TLD list, regenerated daily","url":"https://shinyakato.dev/portfolio/icann-tlds/"},{"content_text":"A Dart implementation of IPFS v1 CIDs — parsing, creation, the DAG-JSON and AT Protocol JSON forms, and a canonical DAG-CBOR encoder that is exact on the VM and the web.","date_modified":"2026-07-01T00:00:00Z","date_published":"2023-06-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/multiformats/","summary":"CID and other IPFS primitives for Dart","tags":["Dart","Flutter","AT Protocol"],"title":"multiformats — CID and other IPFS primitives for Dart","url":"https://shinyakato.dev/portfolio/multiformats/"},{"content_text":"A Dart library that detects handles, links and tags in Bluesky Social post text and converts them into the facets the API expects.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-05-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/bluesky-text/","summary":"Post-text analysis for Bluesky Social","tags":["Dart","Bluesky API","Facets (Rich Text)"],"title":"bluesky_text — Post-text analysis for Bluesky Social","url":"https://shinyakato.dev/portfolio/bluesky-text/"},{"content_text":"A bot that posts the NASA Astronomy Picture of the Day image and explanation to Bluesky every day. Written in Dart, running on AWS Lambda and scheduled by Amazon EventBridge.","date_modified":"2023-04-01T00:00:00Z","date_published":"2023-04-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/apod-bot/","summary":"The daily NASA APOD, on Bluesky","tags":["Dart","Bluesky API","NASA APOD","AWS Lambda","Amazon EventBridge","REST API"],"title":"Official APOD Bot for Bluesky — The daily NASA APOD, on Bluesky","url":"https://shinyakato.dev/portfolio/apod-bot/"},{"content_text":"A wrapped HTTP client for the AT Protocol's XRPC layer: typed queries and procedures, blob upload, rate-limit handling, and WebSocket subscriptions for event streams.","date_modified":"2026-07-01T00:00:00Z","date_published":"2023-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/xrpc/","summary":"The XRPC transport layer for AT Protocol","tags":["Dart","Flutter","AT Protocol","REST API"],"title":"xrpc — The XRPC transport layer for AT Protocol","url":"https://shinyakato.dev/portfolio/xrpc/"},{"content_text":"A parser for AT Protocol Lexicon schema documents, shipping the official lexicons as generated Dart constants. It is the input the lex_gen code generator reads.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/lexicon/","summary":"A Lexicon parser for the AT Protocol","tags":["Dart","Flutter","AT Protocol","Lexicon"],"title":"lexicon — A Lexicon parser for the AT Protocol","url":"https://shinyakato.dev/portfolio/lexicon/"},{"content_text":"A Docker-based GitHub Action that posts to Bluesky Social from a workflow: images, video, replies, quotes, link previews and automatic facets.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/bluesky-post/","summary":"Post to Bluesky from GitHub Actions","tags":["Dart","Bluesky API","Facets (Rich Text)","GitHub Actions","Docker"],"title":"bluesky_post — Post to Bluesky from GitHub Actions","url":"https://shinyakato.dev/portfolio/bluesky-post/"},{"content_text":"A Dart command-line tool that runs Bluesky Social and AT Protocol XRPC methods from the shell. It installs as bsky, and its commands are generated from the lexicons.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/bluesky-cli/","summary":"A command-line client for Bluesky Social","tags":["Dart","Bluesky API","AT Protocol","Lexicon","REST API","Code Generation"],"title":"bluesky_cli — A command-line client for Bluesky Social","url":"https://shinyakato.dev/portfolio/bluesky-cli/"},{"content_text":"A Dart/Flutter client library for Bluesky Social covering the app.bsky.* and chat.bsky.* namespaces, and including everything the atproto package provides.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/bluesky/","summary":"A Dart/Flutter SDK for Bluesky Social","tags":["Dart","Flutter","Bluesky API","AT Protocol","REST API"],"title":"bluesky — A Dart/Flutter SDK for Bluesky Social","url":"https://shinyakato.dev/portfolio/bluesky/"},{"content_text":"A Docusaurus documentation site for atproto.dart, covering the getting-started guide, API reference and the Lexicon listing. It lives in the monorepo's website directory.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/atprotodart-com/","summary":"Documentation site for atproto.dart","tags":["Docusaurus","React","TypeScript","Algolia","Netlify","Amazon Route 53"],"title":"atprotodart.com — Documentation site for atproto.dart","url":"https://shinyakato.dev/portfolio/atprotodart-com/"},{"content_text":"The monorepo for the Dart/Flutter AT Protocol and Bluesky Social SDK: fifteen packages, among them atproto, bluesky, bluesky_text and lex_gen, fourteen in one pub workspace.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/atproto-dart/","summary":"Dart SDK monorepo for AT Protocol and Bluesky","tags":["Dart","Flutter","AT Protocol","Bluesky API","Lexicon","Facets (Rich Text)","OAuth 2.0","REST API","Code Generation"],"title":"atproto.dart — Dart SDK monorepo for AT Protocol and Bluesky","url":"https://shinyakato.dev/portfolio/atproto-dart/"},{"content_text":"The package the atproto and bluesky libraries are built on: sessions and JWT decoding, a pluggable retry engine, XRPC and HTTP plumbing, and blob and CAR handling.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/atproto-core/","summary":"Shared core layer for the atproto.dart SDK","tags":["Dart","Flutter","AT Protocol","OAuth 2.0","REST API"],"title":"atproto_core — Shared core layer for the atproto.dart SDK","url":"https://shinyakato.dev/portfolio/atproto-core/"},{"content_text":"A Dart/Flutter client library covering the com.atproto.* namespace of the AT Protocol. It is the core package of the atproto.dart monorepo.","date_modified":"2026-08-01T00:00:00Z","date_published":"2023-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/atproto/","summary":"A Dart/Flutter SDK for the AT Protocol","tags":["Dart","Flutter","AT Protocol","OAuth 2.0","REST API"],"title":"atproto — A Dart/Flutter SDK for the AT Protocol","url":"https://shinyakato.dev/portfolio/atproto/"},{"content_text":"A Bluesky web client that shows several timelines side by side as columns. Built with Flutter for the web and using the atproto.dart SDK.","date_modified":"2023-01-01T00:00:00Z","date_published":"2023-01-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/deck-blue/","summary":"A multi-column web client for Bluesky","tags":["Dart","Flutter","Web","AT Protocol","Bluesky API"],"title":"deck.blue — A multi-column web client for Bluesky","url":"https://shinyakato.dev/portfolio/deck-blue/"},{"content_text":"A Flutter library that runs the Mastodon API's OAuth 2.0 authorization code flow in an app and returns an access token. Runs on Android, iOS, Linux, macOS, Web and Windows.","date_modified":"2023-02-01T00:00:00Z","date_published":"2022-11-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/mastodon-oauth2/","summary":"Mastodon OAuth 2.0 for Flutter","tags":["Dart","Flutter","Mastodon API","OAuth 2.0"],"title":"mastodon_oauth2 — Mastodon OAuth 2.0 for Flutter","url":"https://shinyakato.dev/portfolio/mastodon-oauth2/"},{"content_text":"A Dart/Flutter client library for the Mastodon API. Its README documents nine services across the v1 and v2 endpoints, with typed response objects and automatic retry.","date_modified":"2023-03-01T00:00:00Z","date_published":"2022-11-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/mastodon-api/","summary":"A Dart/Flutter SDK for the Mastodon API","tags":["Dart","Flutter","Mastodon API","REST API"],"title":"mastodon_api — A Dart/Flutter SDK for the Mastodon API","url":"https://shinyakato.dev/portfolio/mastodon-api/"},{"content_text":"A Dart and Flutter client for the Twitter oEmbed API, returning the markup for an embedded tweet or an embedded timeline. Two methods, and no credentials to configure.","date_modified":"2022-08-01T00:00:00Z","date_published":"2022-08-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/twitter-oembed-api/","summary":"Twitter oEmbed API for Dart and Flutter","tags":["Dart","Flutter","Twitter oEmbed API","REST API"],"title":"twitter_oembed_api — Twitter oEmbed API for Dart and Flutter","url":"https://shinyakato.dev/portfolio/twitter-oembed-api/"},{"content_text":"A Flutter library that adds the Twitter API's OAuth 2.0 PKCE authorization code flow to an app. Runs on Android, iOS, Linux, macOS, Web and Windows.","date_modified":"2023-03-01T00:00:00Z","date_published":"2022-05-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/twitter-oauth2-pkce/","summary":"Twitter API OAuth 2.0 PKCE for Flutter","tags":["Dart","Flutter","Twitter API v2","OAuth 2.0","PKCE"],"title":"twitter_oauth2_pkce — Twitter API OAuth 2.0 PKCE for Flutter","url":"https://shinyakato.dev/portfolio/twitter-oauth2-pkce/"},{"content_text":"A Dart/Flutter client library for the Twitter API v2.0, with OAuth 1.0a and 2.0, streaming, media upload and automatic retry.","date_modified":"2023-03-01T00:00:00Z","date_published":"2022-04-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/twitter-api-v2/","summary":"A Dart/Flutter SDK for the Twitter API v2.0","tags":["Dart","Flutter","Twitter API v2","OAuth 2.0","PKCE","REST API"],"title":"twitter_api_v2 — A Dart/Flutter SDK for the Twitter API v2.0","url":"https://shinyakato.dev/portfolio/twitter-api-v2/"},{"content_text":"A Dart enum with one member per Xterm palette entry, each documented with its hex, RGB and HSL values. Its code getter returns the number a terminal expects.","date_modified":"2022-04-01T00:00:00Z","date_published":"2022-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/console-color/","summary":"The 256 Xterm colours as a Dart enum","tags":["Dart","Flutter"],"title":"console_color — The 256 Xterm colours as a Dart enum","url":"https://shinyakato.dev/portfolio/console-color/"},{"content_text":"A Flutter widget that places a Text in the middle of a Divider, horizontally or vertically, leaving the rule's size, thickness, indent and colour to the caller.","date_modified":"2022-02-01T00:00:00Z","date_published":"2022-02-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/text-divider/","summary":"A Flutter Divider with text in the middle","tags":["Dart","Flutter","Web"],"title":"text_divider — A Flutter Divider with text in the middle","url":"https://shinyakato.dev/portfolio/text-divider/"},{"content_text":"A Dart library that extends the dart:io Cookie class and reads cookies off an http package response, including a response whose header sets more than one at a time.","date_modified":"2024-12-01T00:00:00Z","date_published":"2021-12-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/sweet-cookie-jar/","summary":"Cookie management for Dart","tags":["Dart","Flutter"],"title":"sweet_cookie_jar — Cookie management for Dart","url":"https://shinyakato.dev/portfolio/sweet-cookie-jar/"},{"content_text":"A Flutter widget that displays the running application's version status and, when a newer release is available, opens a prompt carrying its release notes.","date_modified":"2021-12-01T00:00:00Z","date_published":"2021-12-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/app-version/","summary":"In-app version check and update prompt","tags":["Dart","Flutter"],"title":"app_version — In-app version check and update prompt","url":"https://shinyakato.dev/portfolio/app-version/"},{"content_text":"A Java helper for tests that have to reach a private method or field. from takes the class under test, addArgument its parameters, and invokeMethod calls the method by name.","date_modified":"2021-03-01T00:00:00Z","date_published":"2021-03-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/reflection-test-helper/","summary":"Private-method reflection for tests","tags":["Java"],"title":"Reflection Test Helper — Private-method reflection for tests","url":"https://shinyakato.dev/portfolio/reflection-test-helper/"},{"content_text":"A Java framework that maps JSON content files onto entity classes through annotations. Its stated aim is flexibility with a small implementation.","date_modified":"2021-03-01T00:00:00Z","date_published":"2021-02-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/zenna-db/","summary":"Annotation-driven JSON content mapping","tags":["Java","NoSQL"],"title":"Zenna DB — Annotation-driven JSON content mapping","url":"https://shinyakato.dev/portfolio/zenna-db/"},{"content_text":"A Java wrapper over java.util.regex whose builder takes either a raw pattern or one of 34 named presets, then answers find, matches and group against an input.","date_modified":"2021-01-01T00:00:00Z","date_published":"2020-11-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/epitaph/","summary":"Named presets for Java regular expressions","tags":["Java"],"title":"Epitaph — Named presets for Java regular expressions","url":"https://shinyakato.dev/portfolio/epitaph/"},{"content_text":"A Java framework that validates an entity's fields from annotations declared on them. Envali.validate reflects over the fields and reports recoverable and unrecoverable errors.","date_modified":"2021-01-01T00:00:00Z","date_published":"2020-10-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/envali/","summary":"Annotation-driven entity validation for Java","tags":["Java"],"title":"Envali — Annotation-driven entity validation for Java","url":"https://shinyakato.dev/portfolio/envali/"},{"content_text":"A Java library of static precondition checks. Its one class, Preconditions, returns silently when an argument is acceptable and throws at once when it is not.","date_modified":"2021-06-01T00:00:00Z","date_published":"2020-09-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/precondition-validator/","summary":"Java argument checks that throw","tags":["Java"],"title":"Precondition Validator — Java argument checks that throw","url":"https://shinyakato.dev/portfolio/precondition-validator/"},{"content_text":"A Java framework that moves values and conditions out of source code and into JSON content files, so behaviour can change without the source being edited.","date_modified":"2021-01-01T00:00:00Z","date_published":"2020-08-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/content-framework/","summary":"Externalised values and rules for Java","tags":["Java","NoSQL"],"title":"Content Framework — Externalised values and rules for Java","url":"https://shinyakato.dev/portfolio/content-framework/"},{"content_text":"A Java interface an enum implements to gain lookup by code or by tag value, membership checks and an ordered list, all as static methods on Catalog and BiCatalog.","date_modified":"2021-06-01T00:00:00Z","date_published":"2020-08-01T00:00:00Z","id":"https://shinyakato.dev/portfolio/catalog-api/","summary":"Common lookup behaviour for Java enums","tags":["Java"],"title":"Catalog API — Common lookup behaviour for Java enums","url":"https://shinyakato.dev/portfolio/catalog-api/"}],"language":"en","title":"Portfolio | Shinya Kato","version":"https://jsonfeed.org/version/1.1"}