Skip to content

Conversation

@dannon
Copy link
Member

@dannon dannon commented Jan 13, 2026

Summary

Foundation work for migrating Galaxy Community Hub from Gridsome to Astro. This is a parallel development effort - the existing Gridsome site continues to work unchanged and this PR does not affect the current production setup in any way.

The Astro implementation lives entirely in the /astro subdirectory and can be developed, tested, and refined independently while the main site remains on Gridsome.

There are content migration/staging scripts that run as a part of the build (for now) so that parallel development is easy without conflicts.

Will close #3505

Homepage

image

Internal Article Page

image

What's included

  • Astro 5.x project setup with Vue 3 integration
  • Tailwind CSS styling with Galaxy brand colors
  • Rebuilt navigation, layouts, and core components
  • Content collections for news, events, articles, platforms
  • RSS, Atom, JSON, and iCal feed generation
  • Client-side search implementation
  • Regional subsite filtering support

What this enables

  • Parallel iteration on the new site without affecting production
  • Side-by-side comparison of Gridsome vs Astro output
  • Gradual refinement of design and functionality
  • Testing and feedback before any cutover decisions

Technical approach

  • All Astro code isolated in /astro directory
  • Original Gridsome setup untouched in root
  • Content files shared/referenced where possible
  • Can run both dev servers simultaneously on different ports

Quick start

# Using Make (recommended)
make astro-dev      # Run dev server (auto-installs deps)
make astro-build    # Build the site
make astro-preview  # Preview built site

# Or manually
cd astro && npm install && npm run dev

Known issues & roadmap

We're tracking known issues and planned improvements on the project board:
Astro Migration

Contributions welcome! Pick an issue and help us get to the finish line.

Test plan

  • Run Astro dev server (make astro-dev)
  • Compare key pages against current Gridsome site
  • Test navigation and interactive components
  • Verify feed generation
  • Review on various screen sizes

dannon added 30 commits January 6, 2026 12:17
- Add Astro-specific directories to ignore
- Exclude generated content collections
- Exclude node_modules and build artifacts
- Set up Astro with Vue 3 and MDX integrations
- Configure for static site generation
- Add base layout with Bootstrap 5 styling
- Port SCSS files from original project
- Create initial homepage
- Create Bootstrap Vue replacement components (BButton, BAlert, BCard, BFormInput)
- Set up global component registration
- Add test component demonstrating compatibility
- Configure content collections schema with all field types
- Port preprocessing logic to Astro content collections
- Detect Vue component usage automatically
- Convert Gridsome syntax (g-link, g-image) to standard HTML
- Add development scripts for preprocessing workflow
- Successfully processes 4,346 content files
- Create test page to verify content collections
- Display sample items from each collection type
- Show content counts for verification
- Copy images and assets alongside markdown files
- Update image paths to use public directory structure
- Handle case-insensitive image extensions
- Remove unsupported layout field from frontmatter
- Remove deprecated ~ prefix from imports
- Convert deprecated color functions (lighten/darken) to modern syntax
- Add required @use statements for sass modules
- Copy all images from content directories during preprocessing
- Maintain original directory structure under public/images/
- Add content configuration with proper schemas
- Create templates for Article, VueArticle, Platform, and BareArticle
- Implement dynamic catch-all routing for all content types
- Add homepage with recent news and navigation
- Add news listing page
- Update BaseLayout with navigation and bare mode support
- Fix LinkBox component to handle undefined data safely
- Add safety checks for tags arrays in templates
- Process frontmatter to ensure tags, subsites, and authors are arrays
- Fix optional chaining in LinkBox component
- Remove test pages that were causing errors
- Successfully build 4147 pages from content
- Define schemas for all content types (articles, vue-articles, platforms, etc.)
- Set up proper type validation for frontmatter fields
- Support varying content structures across collections
- Create Navbar component with dropdown support and mobile toggle
- Create Carousel component with autoplay and controls
- Create Tabs component with keyboard navigation
- Create Accordion component with multiple/single mode
- Register all new components globally in vue-app
- Create search index generator using Lunr.js
- Extract content from all markdown files for indexing
- Create Search component with pagination and filtering
- Add search page with tips and instructions
- Integrate search index generation into build process
- Configure sitemap with proper URL and filtering
- Add code splitting for better performance
- Separate vendor chunks for vue, vega, and search
- Add search link to main navigation
- Never inline stylesheets for better caching
- Limit indexed content to first 1000 characters
- Reduce preview content to 300 characters
- Remove fullContent from search index fields
- Reduced index size from 30MB to 7MB
- Create events collection schema in content config
- Add events detection in preprocessing based on path
- Create /events listing page with upcoming/past events
- Process 1,312 event files into separate collection
- Add date-fns for event date formatting
- Install @playwright/test as dev dependency
- Create playwright.config.ts with basic setup
- Add comprehensive test suites for navigation, events, and search
- Configure test scripts in package.json
- Add test artifacts to .gitignore
- Tests verify basic functionality and help catch regressions
- Add Use Galaxy page listing public servers and installation options
- Add Community page with support, collaboration, and contribution info
- Add Search page with client-side Lunr.js search functionality
- Create comprehensive tests for all main landing pages
- All navigation tests now pass
- Verify articles, events, and platforms collections work
- Test search index contains documents
- Verify content metadata rendering
- Test Vue article pages
- All tests passing with 3730 documents indexed
- Track progress: 70% feature parity achieved
- Document completed infrastructure and pages
- List pending components and upcoming phases
- Include key metrics and next steps
- Prioritize remaining Phase 3 components
- Detail Phase 4 regional subsites implementation
- List all Phase 5 missing features
- Include quick wins and timeline estimates
- Add command reference and success criteria
- Create Vue 3 Footer component with all links
- Include Galaxy logo and social media links
- Add responsive styling
- Integrate into BaseLayout
- Add comprehensive Playwright tests
- All footer tests passing
- Create Vue 3 Twitter component using Twitter widgets API
- Support both single tweets and user timelines
- Add theme support (light/dark)
- Implement centering and responsive design
- Create test page with multiple examples
- Add comprehensive Playwright tests
- All tests passing
- Migrate CalendarEmbed from Vue 2 to Vue 3 composition API
- Support both Eventzilla event widgets and Google Calendar embeds
- Add configurable dimensions, timezone, and calendar ID props
- Create comprehensive test page at /test/calendar
- Add full Playwright test coverage for calendar functionality
- Register component globally in vue-app.js
- Create CarouselDefault component for backward compatibility with Gridsome carousel
- Update existing Carousel component to support links on slides
- Register both default and custom carousel components globally
- Add comprehensive test pages demonstrating carousel variations
- Create Playwright tests for carousel functionality
- Support autoplay, indicators, controls, and custom intervals
- VideoPlayer component was already migrated to Vue 3
- Create comprehensive test page demonstrating all video player features
- Add Playwright tests for video player functionality
- Test autoplay, loop, muted, poster, and dimension attributes
- Verify proper video element rendering and controls
- MarkdownEmbed component was already migrated to Vue 3
- Create comprehensive test page with remote, local, and direct markdown
- Add sample markdown file for testing local loading
- Create Playwright tests for all markdown rendering features
- Test loading states, error handling, and markdown styling
- Verify support for various markdown elements
- Update MIGRATION-PROGRESS.md with Phase 3 completion status
- Create comprehensive ASTRO-MIGRATION-PRD.md document
- Document all 12 migrated components with test coverage
- Update project status to 40% complete (3 of 8 phases)
- Outline remaining work for Phases 4-8
- Add timeline estimates and success metrics
- Create subsites configuration system with all regional sites
- Implement dynamic routing for subsite homepages, news, and events
- Create SubsiteHome component for regional landing pages
- Update Navbar to support subsite-specific navigation and styling
- Add subsite switcher dropdown in navigation
- Parse and apply regional navbar.yml configurations
- Implement content filtering by subsite
- Add comprehensive tests for all subsite functionality
- Support external subsites (e.g., Australia redirect)
- Test with EU subsite content and navigation
dannon added 18 commits January 13, 2026 07:45
Styled news/events index pages to match article layout (white background,
gold separator). Added load more pagination to news list and past events.
Added contextual back links for news and events content pages.
News and past events now show year buttons to jump between years.
Each year still has "load more" if there are many items. Defaults
to the most recent year with content.
Moved the SubsiteSwitcher component from Sidebar.astro into SidebarNav.vue,
placing it after the Applications section and before the @jxtx Foundation link.
Also fixed the homepage grid pattern by using a pseudo-element so it properly
layers over section backgrounds instead of getting overwritten by them.
Set up linting and formatting for the Astro migration:
- ESLint with TypeScript, Astro, and Vue plugins
- Prettier with Astro plugin
- GitHub Actions workflow that runs on changes to astro/ directory
- Fixed various lint errors (computed side effects, JSX comments)
- Applied consistent formatting across all source files
@bgruening
Copy link
Member

Very cool strategy!

Homepage masthead now appears when hovering near the top of the page,
giving users quick access to navigation without scrolling. Also added
LinkedIn to the sidebar social links.
The homepage now uses HomeLayout without a sidebar, so tests that
expected sidebar elements on / needed to use article pages like
/admin/ instead. Also updated tests to match the current homepage
structure (pillar cards, custom hero/footer classes).
The Astro project uses Vitest for its tests, so the root Jest should
not try to run test files in the astro/ directory.
Builds and deploys the Astro site to /astro-preview/ alongside the
main Gridsome site. The Astro base path is configurable via ASTRO_BASE
env var so local dev still works at root.

Once merged, the preview will be at https://galaxyproject.org/astro-preview/
The <Insert> component syntax broke Gridsome builds because Vue's
template compiler treats it differently than the native <slot> element.

Content files now use <slot name="..."> which works with Gridsome.
Astro's preprocessing converts these to <Insert name="..."/> during
the build via convertGridsomeSyntax().

This keeps both build systems happy with the same source content.
@dannon dannon changed the title WIP: Astro migration foundation Astro migration foundation Jan 13, 2026
@bgruening
Copy link
Member

Works great! I guess for people like me a Makefile integration would be nice, but I got it to work and its a awesome start.

Added make targets for working with the Astro site:
- astro-install: Install dependencies
- astro-dev: Run dev server
- astro-build: Build the site
- astro-preview: Preview built site

The dev/build/preview targets depend on astro-install to ensure
dependencies are present.
@dannon
Copy link
Member Author

dannon commented Jan 13, 2026

Added build targets to the makefile and linked up our board (Astro Migration) in the description as well. Thanks again!

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.

Hub maintenance and improvement

2 participants