Skip to content

Blog: build-time codegen (router, ORM, mappers, binder, SVG/Lottie)#5088

Merged
shai-almog merged 13 commits into
masterfrom
blog-build-time-codegen
Jun 1, 2026
Merged

Blog: build-time codegen (router, ORM, mappers, binder, SVG/Lottie)#5088
shai-almog merged 13 commits into
masterfrom
blog-build-time-codegen

Conversation

@shai-almog
Copy link
Copy Markdown
Collaborator

Summary

File

  • docs/website/content/blog/build-time-codegen.md — single new file.

Sequencing

Branches off master; intended to publish Wednesday. Front matter date is 2026-06-03. Closes the post series for this release cycle.

Supersedes the closed PRs #5080 (router), #5083 (ORM + mapping + binding + Immich), and #5084 (SVG + Lottie).

Test plan

  • Hugo build of docs/website succeeds.
  • Post renders correctly on the blog index and as a standalone page.
  • Header image is generated at /static/blog/build-time-codegen.jpg.

@shai-almog shai-almog force-pushed the blog-build-time-codegen branch from 3bf1d2a to 04e7b75 Compare May 29, 2026 11:34
@shai-almog shai-almog changed the base branch from master to blog-platform-apis-in-the-core May 29, 2026 11:35
@shai-almog shai-almog force-pushed the blog-platform-apis-in-the-core branch from ae74fe9 to f24bd82 Compare May 29, 2026 12:58
@shai-almog shai-almog force-pushed the blog-build-time-codegen branch from 04e7b75 to 9a42334 Compare May 29, 2026 12:58
@shai-almog shai-almog force-pushed the blog-platform-apis-in-the-core branch from f24bd82 to 5db7754 Compare May 29, 2026 13:18
@shai-almog shai-almog force-pushed the blog-build-time-codegen branch from 9a42334 to 119d350 Compare May 29, 2026 13:18
@shai-almog shai-almog force-pushed the blog-platform-apis-in-the-core branch from 5db7754 to 81f62e3 Compare May 29, 2026 14:07
@shai-almog shai-almog force-pushed the blog-build-time-codegen branch 2 times, most recently from 05bd7ac to 607b9ef Compare May 29, 2026 15:54
@github-actions
Copy link
Copy Markdown
Contributor

Cloudflare Preview

@shai-almog shai-almog force-pushed the blog-build-time-codegen branch from 607b9ef to d9f6a81 Compare May 29, 2026 18:24
Consolidated follow-up to the May 29 weekly index. Covers the four
surfaces that moved from "you need a cn1lib for this" to "it is in
the framework" this release:

- Connectivity (PR #5021): com.codename1.io.{wifi,bonjour,usb} +
  NetworkManager.addNetworkTypeListener with the per-platform
  implementations and the three new CN1_INCLUDE_* defines that keep
  unused entitlements out of Apple's API-usage scan.
- Identity (PRs #5018, #5039): OIDC client backed by
  ASWebAuthenticationSession / Custom Tabs with PKCE; Sign in with
  Apple in core; refreshed Google/Facebook/Microsoft/Auth0/Firebase
  wrappers; WebAuthn / passkey client in W3C JSON wire format with
  iOS 16 and Android API 28 native bindings; Auth0/Firebase passkey
  helpers; legacy Oauth2 deprecated.
- Sharing (PR #5036): ShareResult callbacks
  (SHARED_TO/DISMISSED/FAILED) on iOS and Android via
  UIActivityViewController.completionWithItemsHandler and
  Intent.createChooser with IntentSender; IOSShareExtensionBuilder
  in the Maven plugin generates a complete .ios.appext bundle.
- AI (PRs #5035, #5057): com.codename1.ai with LlmClient for
  OpenAI/Anthropic/Gemini/Ollama, streaming SSE, ChatView,
  SpeechRecognizer/TextToSpeech, SecureStorage non-prompting
  overloads, simulator Ollama redirect, AiDependencyTable build-time
  injection, and the cn1-ai-mlkit-{barcode,docscan,face} cn1libs.

Closes with the structural element common to all four (scanner-driven
gating that mirrors the NFC/biometrics pattern from two weeks ago).
- Retitled "AI, OAuth, And Other Platform APIs In The Core".
- Reordered sections so the two headline pieces come first: AI
  (with deep tutorials) and OAuth / OIDC (with provider walk-
  throughs and a migration). WiFi / connectivity and share-sheet
  callbacks land at the end.
- Opener no longer runs together; the NFC / biometrics / crypto
  call-back is linked to the previous post explicitly.
- AI section expanded with concrete examples for streaming, tool
  calls, embeddings, image generation, the simulator Ollama
  redirect, the SecureStorage non-prompting overloads, the ChatView
  binding, and an ASCII mockup of the ChatView surface for readers
  who haven't seen it.
- New subsection explaining why the ML Kit AI features stay in
  cn1libs even though the LlmClient surface lives in core (core
  carries the plumbing every AI app wants; specialised verticals
  with large native dependencies stay opt-in; the cloud-build big-
  upload guard rules out the multi-gigabyte models).
- OAuth section now walks through OIDC discovery, the four
  provider wrappers (Google, Microsoft, Auth0, Facebook), Sign in
  with Apple, an Oauth2-to-OidcClient migration example, and the
  WebAuthn / passkey client.
- Dev-guide references go to the HTML version on the website.
- Hero image lands at /blog/platform-apis-in-the-core.jpg.
- Wrap-up has the link back to the intro and forward to the
  Wednesday post.

Also updates the developer-workflow post (rebased on top) to add
the forward link to this post in its wrap-up.
- Opening description rewritten so it does not read as a comma list.
- Dropped the "AI first, OAuth second" meta-paragraph.
- Anthropic and Gemini are no longer described as "still in flight";
  both are fully implemented in this release.
- Replaced the SecureStorage "small thing that matters more than it
  sounds" framing with a proper "How to handle API keys" section
  that opens with the security rule (never check in, never embed,
  never hardcode), explains the proper shape (fetch from your
  backend over an authenticated request, cache to the platform
  keychain via SecureStorage), and gives a concrete getOpenAiKey
  example.
- ChatView ASCII mockup replaced with a screenshot reference and a
  richer code example that drives the chat manually
  (ConversationStore + per-message lifecycle + error path).
- Removed the Speech / TTS subsection entirely. The native iOS /
  Android bridges are still tracked follow-ups in PR #5035 and are
  not shipping in this release.
- iOS Share Extension paragraph expanded into a real "how your app
  appears in other apps' share menus" section with a pom.xml
  configuration block, the cn1:generate-ios-share-extension Mojo
  invocation, and a host-side payload-read example.
- AI cn1libs rewritten. The 13 cn1libs land in a feature table with
  a one-line "what it gives you" column each, followed by a "how to
  add and use them" paragraph and three short worked examples
  (barcode, text recognition, translation). The "why these are
  cn1libs and not core" answer follows the concrete list rather
  than appearing without context.
- "What ties this together" section removed.
- Replaced the placeholder ChatView image reference with a real
  screenshot pulled from the ChatViewDevGuideScreenshotTest output
  (scripts/ios/screenshots-metal/ChatView_light.png), cropped to
  remove the test-harness caption and downscaled for web payload.
- Replaced the AI cn1lib quick-table and the "Why are these cn1libs"
  paragraph with thirteen per-cn1lib subsections (cn1-ai-mlkit-{
  text, barcode, face, labeling, translate, smartreply, langid,
  pose, segmentation, docscan}, cn1-ai-tflite, cn1-ai-whisper,
  cn1-ai-stablediffusion). Each subsection covers TL;DR, per-
  platform native bridge, use cases, and a real working code
  sample using the actual facade signature (TextRecognizer.
  recognize / BarcodeScanner.scan / FaceDetector.detect / ...
  PoseDetector.detect / SelfieSegmenter.segment / ... etc).
- Up front: the cn1libs aren't in the CN1 Preferences picker yet,
  so the manual pom.xml dependency snippet is the supported path;
  the shared pattern is given once with just the artifactId
  changing per cn1lib.
- Dropped the mention of scripts/create-ai-cn1lib.sh as an
  implementation detail.
@shai-almog shai-almog force-pushed the blog-platform-apis-in-the-core branch from 69ec2d2 to c9ee822 Compare May 30, 2026 03:57
@shai-almog shai-almog force-pushed the blog-build-time-codegen branch from 1734f47 to 5a0d637 Compare May 30, 2026 03:58
Tighter daily cadence: the platform-APIs post moves from Monday
2026-06-01 to Sunday 2026-05-31, and the codegen post (PR #5088)
moves from Wednesday 2026-06-03 to Monday 2026-06-01.

- Front-matter date: 2026-06-01 -> 2026-05-31.
- Wrap-up: "The next post is on Wednesday" -> "Tomorrow's post"
  with the link to /blog/build-time-codegen/.
- In-text reference: "Wednesday's post" (in the embeddings
  paragraph that mentions the upcoming ORM) -> "tomorrow's post".
- Developer-workflow post forward link (added on top of the
  merged base by this PR): "Monday's post" -> "Tomorrow's post"
  to match the new platform-APIs date.
Final consolidated follow-up to the May 29 weekly index. Pulls
together six PRs that share the same architectural shape: emit Java
at build time, validate at build time, fail fast, and let R8 /
ParparVM rename the generated code together with the rest of the app.

- PR #5037: bytecode AnnotationProcessor SPI in the Maven plugin,
  the declarative router that is its first consumer (@route with
  guards, redirects, per-tab navigation shell, location listeners),
  the unified cold + warm DeepLink API, iOS Universal Links /
  Android App Links JSON generators, and the JavaScript-port
  window.history bridge.
- PR #5047: three more processors on the same SPI -- SQLite ORM
  (@entity / @id / @column), JSON / XML mapping (@mapped /
  @JsonProperty / @xmlelement), and component binding (@bindable /
  @Bind with the new BindAttr enum).
- PR #5062: validation annotations (@required, @Length, @regex,
  @Email, @url, @Numeric, @existin, @Validate) that compose with
  @Bind and surface through Binding.getValidator().
- PR #5055: the Immich-port baseline -- Map default methods,
  BiFunction, atomics, Rest.fetchAsJsonList / fetchAsMapped(List),
  URLImage.RequestDecorator / setDefaultBearerToken, JSONWriter,
  modern animated tab indicator + arc-spinner pull-to-refresh,
  MorphTransition.snapshotMode, WebSocket in core, and the new
  cn1:generate-openapi-client mojo.
- PR #5042: build-time SVG transcoder that lowers SVG (and SMIL
  animations) into Codename One Image subclasses via the shape API.
- PR #5066: Lottie / Bodymovin transcoder reusing the same
  SVGDocument model, JavaCodeGenerator, and SVGRegistry.
- PR #5049: the iOS Metal stencil-clip + drawString and Android
  LinearGradientPaint fixes the SVG screenshot tests exposed.

Calls out the Metal-only caveat on iOS for SVG / Lottie (the GL ES 2
path does not have the shape coverage) -- a non-issue on most apps
now that Metal is the default.
- "I" voice replaced with "we" / team-flavoured phrasing.
- Front matter description and feed_html no longer name the Immich
  Flutter port; the porting exercise is described generically as
  "a substantial mobile client app".
- Section heading renamed from "The Immich-port baseline" to "The
  porting-exercise baseline".
- Body prose no longer names the Flutter source; the porting
  exercise is described in generic terms ("a substantial third-party
  mobile client onto Codename One").
- "Form.setPopGuard analogue to Flutter's PopScope" rephrased so
  the Flutter analogy is gone and the hook is described directly.
- Wrap-up rephrased so the "next index lands on Friday" line reads
  as a fact rather than a personal commitment.
- Hero image lands at /blog/build-time-codegen.jpg.
- Wrap-up reworded so the "back to the weekly index" link uses the
  same shape as the workflow and platform-APIs posts.
- Platform-APIs post (rebased on top) updated so its wrap-up
  forward-links to this post by URL rather than by date prose.
The post failed CI with:
  error building site: assemble: failed to create page from pageMetaSource
  /blog/build-time-codegen: ...build-time-codegen.md:2:8":
  [1:8] mapping value is not allowed in this context

The title contains an unquoted colon ("Build-Time Codegen: Router,
ORM, Mappers, Binder, SVG / Lottie"), which YAML reads as a key /
value separator at column 8 and trips the parser. Wrapping the
value in double quotes makes it a plain string. Verified locally
with `hugo --buildFuture`: the post renders and the rendered
<title> shows the colon intact.
- Retitled "Routing, ORM, OpenAPI, And Build-Time SVG / Lottie".
  The headline pieces (router, ORM, OpenAPI, SVG, Lottie) lead;
  the codegen plumbing is the "How it works" section at the end.
- Front-matter description rewritten around the headline pieces and
  the JPA / JAXB familiarity callouts.
- Routing section now leads with the deep-link motivation: what
  problem deep links create (URLs arriving from many sources), why
  a single Display.setDeepLinkHandler scales badly, and how
  @route(...) collapses the if/else handler into one annotation
  per form. Spring developers get an explicit "@route ~
  @RequestMapping, :id ~ {id}, RouteMatch.param ~ @PathVariable"
  callout. React/Vue/Angular Router familiarity also called out.
- ORM section gets a JPA / Hibernate familiarity callout (@entity,
  @id, @column, EntityManager, Dao#findById/findAll/find), plus
  the explicit "renamed @transient to @DbTransient to avoid
  java.beans.Transient" note.
- JSON / XML section gets a JAXB familiarity callout (@xmlRoot,
  @xmlelement, @XmlAttribute, @XmlTransient direct port; the
  Jackson convention for the JSON side).
- New OpenAPI section as a headline feature. Walks through the
  cn1:generate-openapi-client Mojo configuration in pom.xml, the
  Petstore reference spec output (6 models + 3 Api classes), and
  a concrete PetApi usage example (getPetById, findPetsByStatus,
  addPet). Frames the practical effect for teams whose backends
  already publish OpenAPI specs.
- Component-binding section preserved with its validation
  annotations, BindAttr, GroupConstraint composition.
- SVG section gets its own heading with a real static-fixture
  screenshot (cropped from scripts/ios/screenshots-metal/
  SVGStatic.png).
- Lottie section gets its own heading with an animated GIF
  composed from the 6-frame LottieAnimatedScreenshotTest grid
  (cropped, labels masked, frames stitched at 200ms each, looped).
- "How it works" section at the end explains the bytecode
  AnnotationProcessor SPI, the generate-sources / process-classes
  Mojo split, the stub-then-overwrite pattern, and the three
  non-negotiable rules (no Class.forName, no service loader, no
  field reflection).
- REMOVED: "The porting-exercise baseline" section and any other
  mention of how decisions were arrived at.
- REMOVED: "The Metal / Android rendering fixes" subsection. The
  three Metal / Android bug fixes are not user-facing features of
  this release and do not belong in this post.
- REMOVED: "What ties this together" section.
- Front-matter title now quoted to handle the colon (carried over
  from the previous CI fix).

Hero image and the lottie-pulse-spinner.gif / svg-static.png
fixtures committed alongside.
- Title retitled "OpenAPI, ORM, SVG and Lottie" (routing dropped
  from the title, not the first thing above the fold).
- OpenAPI section stays first, then ORM, JSON / XML, binding,
  SVG, Lottie. Deep links and routing moved to the END of the
  post, just before the codegen plumbing section.
- Routing reframed as "the first place we used the preprocessor"
  rather than "the piece that motivates everything else".
- Deep-link section now spells out the honest history. AppArg
  worked for small surfaces but got fragile across cold/warm
  lifecycle paths and especially in the case where a user lands
  mid-app via a link and then continues to interact (back-stack
  composition, falling off the edge on back). The new DeepLink +
  setDeepLinkHandler runs on a consistent path and parses for you.
- Removed the "The Initializr, the Playground, the Skin Designer,
  and the new Build Cloud console are all working examples"
  sentence; none of those use the routing framework.
- Removed the "Three rules the design enforces: no Class.forName,
  no service loader, no field reflection. The 'this code only
  breaks in production because R8 renamed a field' shape of
  JPA-on-Android bug is structurally absent" paragraph from the
  ORM section.
- @bindable example now shows the Form with the matching
  components (TextField with setName, ComboBox, Button), so the
  binder's "match by component name" contract is visible.
- New SVG sizing subsection. cn1-svg-width / cn1-svg-height in
  millimeters is the recommended knob; same constant size at every
  DPI; sidesteps the design-pixel guesswork. Two-float
  constructor for projects that don't use CSS.
- New paragraph up front in the SVG section spelling out that a
  transcoded SVG is a vector image but still an Image: works in
  every Image slot in the framework, just scales cleanly.
- iOS Metal caveat fixed. On ios.metal=false the SVG / Lottie
  shape API renders with visible artifacts in many cases, not
  the placeholder you might expect.
- SVG and Lottie both ask the community to file issues with the
  failing source file attached when the transcoder mishandles
  something. The transcoder grows one shape family at a time
  from those reports.
- SVG / Lottie source path corrected from src/main/svg/ and
  src/main/lottie/ to src/main/css/ (the actual hellocodenameone
  fixture lays them out alongside theme.css there).
- Lottie GIF regenerated. 24 interpolated frames at 60 ms each
  (was 6 frames at 200 ms); much smoother playback in-browser.
- Wrap-up teases Friday's release post: pretty big features
  landing, the headline pieces are the most substantial things in
  months and worth checking back for.
- Section heading "Sizing in millimeters is the important knob"
  shortened to "Sizing in millimeters".
- The "Explicit non-coverage in v1" sentence was wrong: text and
  clip-path are supported in this release and visible in the
  static-SVG fixture screenshot we ship in the post. Rewritten to
  call out that text and clipPath landed via PR #5056, show what
  is supported (<text> / <tspan> with single-style fills and
  transforms; <clipPath> via clip-path="url(#id)" against rect /
  circle / path clip shapes), and accurately list what is still
  not covered (filter primitives, mask with alpha, radialGradient,
  CSS-in-SVG with selector style rules).
Tighter daily cadence; the codegen post moves from Wednesday
2026-06-03 to Monday 2026-06-01.

- Front-matter date: 2026-06-03 -> 2026-06-01.
- Intro recap line "Saturday's was about how you iterate; Monday's
  was about new platform APIs" -> "Saturday's was about how you
  iterate; yesterday's was about new platform APIs". Today is now
  Monday.
- "this Friday's release post" wrap-up tease unchanged; that
  refers to the next weekly release index post and Friday is
  unchanged.
@shai-almog shai-almog force-pushed the blog-build-time-codegen branch from 5a0d637 to 24ecfc4 Compare May 30, 2026 05:58
shai-almog added a commit that referenced this pull request May 31, 2026
…AI) (#5087)

* Blog: platform APIs in the core (connectivity + identity + sharing + AI)

Consolidated follow-up to the May 29 weekly index. Covers the four
surfaces that moved from "you need a cn1lib for this" to "it is in
the framework" this release:

- Connectivity (PR #5021): com.codename1.io.{wifi,bonjour,usb} +
  NetworkManager.addNetworkTypeListener with the per-platform
  implementations and the three new CN1_INCLUDE_* defines that keep
  unused entitlements out of Apple's API-usage scan.
- Identity (PRs #5018, #5039): OIDC client backed by
  ASWebAuthenticationSession / Custom Tabs with PKCE; Sign in with
  Apple in core; refreshed Google/Facebook/Microsoft/Auth0/Firebase
  wrappers; WebAuthn / passkey client in W3C JSON wire format with
  iOS 16 and Android API 28 native bindings; Auth0/Firebase passkey
  helpers; legacy Oauth2 deprecated.
- Sharing (PR #5036): ShareResult callbacks
  (SHARED_TO/DISMISSED/FAILED) on iOS and Android via
  UIActivityViewController.completionWithItemsHandler and
  Intent.createChooser with IntentSender; IOSShareExtensionBuilder
  in the Maven plugin generates a complete .ios.appext bundle.
- AI (PRs #5035, #5057): com.codename1.ai with LlmClient for
  OpenAI/Anthropic/Gemini/Ollama, streaming SSE, ChatView,
  SpeechRecognizer/TextToSpeech, SecureStorage non-prompting
  overloads, simulator Ollama redirect, AiDependencyTable build-time
  injection, and the cn1-ai-mlkit-{barcode,docscan,face} cn1libs.

Closes with the structural element common to all four (scanner-driven
gating that mirrors the NFC/biometrics pattern from two weeks ago).

* Platform-APIs post: rewrite around AI + OAuth headline

- Retitled "AI, OAuth, And Other Platform APIs In The Core".
- Reordered sections so the two headline pieces come first: AI
  (with deep tutorials) and OAuth / OIDC (with provider walk-
  throughs and a migration). WiFi / connectivity and share-sheet
  callbacks land at the end.
- Opener no longer runs together; the NFC / biometrics / crypto
  call-back is linked to the previous post explicitly.
- AI section expanded with concrete examples for streaming, tool
  calls, embeddings, image generation, the simulator Ollama
  redirect, the SecureStorage non-prompting overloads, the ChatView
  binding, and an ASCII mockup of the ChatView surface for readers
  who haven't seen it.
- New subsection explaining why the ML Kit AI features stay in
  cn1libs even though the LlmClient surface lives in core (core
  carries the plumbing every AI app wants; specialised verticals
  with large native dependencies stay opt-in; the cloud-build big-
  upload guard rules out the multi-gigabyte models).
- OAuth section now walks through OIDC discovery, the four
  provider wrappers (Google, Microsoft, Auth0, Facebook), Sign in
  with Apple, an Oauth2-to-OidcClient migration example, and the
  WebAuthn / passkey client.
- Dev-guide references go to the HTML version on the website.
- Hero image lands at /blog/platform-apis-in-the-core.jpg.
- Wrap-up has the link back to the intro and forward to the
  Wednesday post.

Also updates the developer-workflow post (rebased on top) to add
the forward link to this post in its wrap-up.

* Platform-APIs post: review fixes

- Opening description rewritten so it does not read as a comma list.
- Dropped the "AI first, OAuth second" meta-paragraph.
- Anthropic and Gemini are no longer described as "still in flight";
  both are fully implemented in this release.
- Replaced the SecureStorage "small thing that matters more than it
  sounds" framing with a proper "How to handle API keys" section
  that opens with the security rule (never check in, never embed,
  never hardcode), explains the proper shape (fetch from your
  backend over an authenticated request, cache to the platform
  keychain via SecureStorage), and gives a concrete getOpenAiKey
  example.
- ChatView ASCII mockup replaced with a screenshot reference and a
  richer code example that drives the chat manually
  (ConversationStore + per-message lifecycle + error path).
- Removed the Speech / TTS subsection entirely. The native iOS /
  Android bridges are still tracked follow-ups in PR #5035 and are
  not shipping in this release.
- iOS Share Extension paragraph expanded into a real "how your app
  appears in other apps' share menus" section with a pom.xml
  configuration block, the cn1:generate-ios-share-extension Mojo
  invocation, and a host-side payload-read example.
- AI cn1libs rewritten. The 13 cn1libs land in a feature table with
  a one-line "what it gives you" column each, followed by a "how to
  add and use them" paragraph and three short worked examples
  (barcode, text recognition, translation). The "why these are
  cn1libs and not core" answer follows the concrete list rather
  than appearing without context.
- "What ties this together" section removed.

* Platform-APIs post: real ChatView screenshot + per-cn1lib subsections

- Replaced the placeholder ChatView image reference with a real
  screenshot pulled from the ChatViewDevGuideScreenshotTest output
  (scripts/ios/screenshots-metal/ChatView_light.png), cropped to
  remove the test-harness caption and downscaled for web payload.
- Replaced the AI cn1lib quick-table and the "Why are these cn1libs"
  paragraph with thirteen per-cn1lib subsections (cn1-ai-mlkit-{
  text, barcode, face, labeling, translate, smartreply, langid,
  pose, segmentation, docscan}, cn1-ai-tflite, cn1-ai-whisper,
  cn1-ai-stablediffusion). Each subsection covers TL;DR, per-
  platform native bridge, use cases, and a real working code
  sample using the actual facade signature (TextRecognizer.
  recognize / BarcodeScanner.scan / FaceDetector.detect / ...
  PoseDetector.detect / SelfieSegmenter.segment / ... etc).
- Up front: the cn1libs aren't in the CN1 Preferences picker yet,
  so the manual pom.xml dependency snippet is the supported path;
  the shared pattern is given once with just the artifactId
  changing per cn1lib.
- Dropped the mention of scripts/create-ai-cn1lib.sh as an
  implementation detail.

* Platform-APIs post: shift to 2026-05-31, retime forward links

Tighter daily cadence: the platform-APIs post moves from Monday
2026-06-01 to Sunday 2026-05-31, and the codegen post (PR #5088)
moves from Wednesday 2026-06-03 to Monday 2026-06-01.

- Front-matter date: 2026-06-01 -> 2026-05-31.
- Wrap-up: "The next post is on Wednesday" -> "Tomorrow's post"
  with the link to /blog/build-time-codegen/.
- In-text reference: "Wednesday's post" (in the embeddings
  paragraph that mentions the upcoming ORM) -> "tomorrow's post".
- Developer-workflow post forward link (added on top of the
  merged base by this PR): "Monday's post" -> "Tomorrow's post"
  to match the new platform-APIs date.
Base automatically changed from blog-platform-apis-in-the-core to master May 31, 2026 00:42
@shai-almog shai-almog merged commit b2121bf into master Jun 1, 2026
1 check passed
@shai-almog shai-almog deleted the blog-build-time-codegen branch June 1, 2026 01:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant