feat(welcome): blog feed on welcome screen + friendlier analytics copy#1010
Merged
feat(welcome): blog feed on welcome screen + friendlier analytics copy#1010
Conversation
Surfaces the most recent posts from genie.devoxx.com on the DevoxxGenie tool-window welcome screen using a hybrid bundled + remote strategy: - Build: new generateBlogIndex Gradle task parses YAML frontmatter from docusaurus/blog/*.md and writes blog-posts.json under build/generated-resources/blog/, registered as a main resources srcDir so it lands on the classpath via processResources without polluting the source tree. - Runtime: BlogFeedService loads the bundled JSON synchronously for instant render, then asynchronously fetches the live RSS feed off the EDT via the existing HttpClientProvider (with a hardened DocumentBuilder), caching results in PropertiesComponent for 6h. Falls back silently to bundled data on any failure, and pushes updates to the UI whenever the prior cache was bundled/stale or the feed content actually changed. - UI: new BlogPostUi model + Welcome.blogPosts state, rendered in a "Latest from the Blog" Compose section between Quick Commands and the footer. Each entry opens the post in the browser via BrowserUtil. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The previous first-run analytics balloon read like a legal disclosure
("To guide which features and LLM providers we invest engineering
effort in...") which makes developers reach for Disable. Replaced with
copy that leads with the open-source framing, puts reassurance ("no
prompts, no code, no file paths, no API keys") before any data list,
and makes the escape hatch visible inline.
- Notifier title: "DevoxxGenie usage analytics" → "Help shape DevoxxGenie".
- Notifier body: shorter, friendlier, with an inline link to
AnalyticsEventBuilder.java on GitHub so technical users can verify
the payload directly.
- Affirmative action: "OK, Keep Enabled" → "Sure, help out".
- Settings page: matching intro paragraph, friendlier checkbox label
("Help improve DevoxxGenie by sending anonymous usage data"), the
same GitHub source link via HyperlinkLabel, and reordered so "What
is never sent" appears before "What is sent" — same instinct as the
popup. Detailed lists retained since the settings page is where
users go for the full disclosure.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
generateBlogIndexGradle task parses YAML frontmatter fromdocusaurus/blog/*.mdintobuild/generated-resources/blog/devoxxgenie/blog-posts.json(no source-tree pollution). At runtime,BlogFeedServiceloads the bundled JSON synchronously for instant render, then asynchronously fetches the live RSS feed off the EDT viaHttpClientProvider(with a hardenedDocumentBuilder), caching for 6h inPropertiesComponent. Falls back silently to bundled data on any failure.Welcome.blogPostsstate field. Each entry opens the post in the browser viaBrowserUtil.AnalyticsEventBuilder.javaon GitHub so technical users can verify the payload directly. Affirmative action label changed from "OK, Keep Enabled" to "Sure, help out".Test plan
./gradlew generateBlogIndex— verify it parsesdocusaurus/blog/*.mdand writesbuild/generated-resources/blog/devoxxgenie/blog-posts.json./gradlew clean processResources— verify generated file ends up atbuild/resources/main/devoxxgenie/blog-posts.json./gradlew runIde— open the DevoxxGenie tool window on a fresh project, confirm the "Latest from the Blog" section renders with bundled posts, and that clicking a post opens the correct URLBlogFeedServicedebug output if needed)🤖 Generated with Claude Code