Professional software development consultancy website built with Hugo, featuring automated content synchronization from dev.to and comprehensive CI/CD pipeline.
- Overview
- Features
- Technology Stack
- Quick Start
- Development
- Testing
- Deployment
- Content Management
- Documentation
- Contributing
- License
JetThoughts website is a sophisticated static site generator project that showcases the company's software development and consultancy services. The site features automated blog content synchronization from dev.to, a custom Hugo theme, and comprehensive testing framework.
- 540+ technical articles automatically synced from dev.to
- Responsive design with mobile-first approach
- Visual regression testing to ensure consistency
- Automated CI/CD with GitHub Actions
- SEO optimized with proper meta tags and structured data
- Performance optimized with PurgeCSS and asset minification
- Dynamic blog system with automated dev.to synchronization
- Service showcases for consultancy offerings
- Client case studies and success stories
- Use case demonstrations
- Career opportunities with Google Forms integration
- Contact system with form submissions
- Static site generation with Hugo Extended
- Automated content sync every 10 minutes
- Visual regression testing with screenshot comparison
- Staging environment with surge.sh deployment
- Multi-level navigation with dropdown menus
- Asset optimization with PostCSS pipeline
- Git-based versioning for content
| Category | Technologies |
|---|---|
| Static Site Generator | Hugo Extended (version pinned in .mise.toml) |
| Theme | Custom "Beaver" theme |
| Languages | HTML, CSS (PostCSS), JavaScript, Ruby |
| Package Managers | Bun (Node.js), Bundler (Ruby) |
| Testing | Minitest, Capybara, Selenium WebDriver |
| CI/CD | GitHub Actions, GitHub Pages |
| Content Source | dev.to API integration |
{
"build": ["@fullhuman/postcss-purgecss", "autoprefixer", "cssnano", "postcss"],
"audit": ["lighthouse", "markdownlint-cli"],
"deployment": ["surge"]
}# Testing
gem "minitest"
gem "capybara"
gem "selenium-webdriver"
gem "capybara-screenshot-diff"
# API & HTTP
gem "httparty"
gem "faraday"
gem "sanity-ruby"
# Development
gem "standard"
gem "simplecov"- mise β installs the pinned toolchain (Hugo Extended, Bun, Node, Ruby) from
.mise.toml - libvips β screenshot-diff tests (
brew install vips/apt-get install libvips42) - Chrome or Chromium β system tests (set
CHROME_BIN=/path/to/chromeif not on PATH) - Git for version control
Exact versions live in .mise.toml (mirrored in .ruby-version); CI pins are
kept in sync by test/unit/toolchain_pins_test.rb. See docs/SETUP.md
for the full walkthrough.
- Clone the repository:
git clone https://github.com/jetthoughts/jetthoughts.github.io.git
cd jetthoughts.github.io- Run the setup script:
bin/setupThis installs the pinned toolchain via mise, system libraries via Brewfile/apt, JS dependencies via Bun, and Ruby gems via Bundler β then runs a doctor that verifies each piece and prints a fix for anything missing.
- Start the development server:
bin/devVisit http://localhost:1313 to view the site. (bin/dev wraps
hugo server with the PATH and env the PostCSS pipeline needs β a bare
hugo server -D will fail to build CSS.)
jetthoughts.github.io/
βββ content/ # Content files (markdown)
β βββ blog/ # Blog posts (synced from dev.to)
β βββ pages/ # Static pages
β βββ clients/ # Client case studies
β βββ services/ # Service descriptions
β βββ use-cases/ # Use case examples
βββ themes/beaver/ # Custom theme
β βββ layouts/ # Template files
β βββ assets/ # Theme assets
β βββ archetypes/ # Content templates
βββ assets/ # Site assets (images, etc.)
βββ data/ # Data files (YAML)
βββ static/ # Static files
βββ lib/ # Ruby libraries for sync
βββ test/ # Test suite
βββ bin/ # Utility scripts
| Command | Description |
|---|---|
bin/dev |
Start development server with drafts |
bin/hugo-build |
Build + validate site (course validators, PurgeCSS warm-up) |
bin/test |
Run critical test suite (bin/rake test:critical) |
bin/dtest |
Same suite in Linux/Docker (visual baselines CI-parity) |
bin/lint-css |
Stylelint warning ratchet |
bin/sync_with_devto |
Sync blog posts from dev.to |
bin/surge/deploy |
Deploy to staging (surge.sh) |
bin/setup |
Initial project setup + doctor |
Create a .env file for local development:
# API Keys
DEVTO_API_KEY=your_dev_to_api_key
# Deployment
SURGE_DOMAIN=your-staging-domain.surge.sh
# Testing
SELENIUM_BROWSER=chrome_headlessThe project includes comprehensive testing with multiple test types:
# Critical suite (system + visual regression)
bin/test
# Specific suites
bin/rake test:unit # Unit tests (validators, sync, templates)
bin/rake test:system # All system tests
bin/rake test:critical # Critical pages subset
bin/dtest # Critical suite in Linux/Docker
# Single test file
bin/test test/system/desktop_site_test.rb- Unit Tests - Test individual components and functions
- System Tests - Full browser automation tests
- Visual Regression - Screenshot comparison tests
- Integration Tests - API and external service tests
Test coverage reports are generated automatically:
open coverage/index.htmlThe site automatically deploys to GitHub Pages when changes are pushed to the master branch:
- Push to master:
git push origin master- GitHub Actions workflow:
- Builds the site with Hugo
- Runs tests
- Deploys to GitHub Pages
Deploy to surge.sh for testing:
bin/surge/deployAccess staging at: https://your-domain.surge.sh
Blog posts are automatically synchronized from dev.to:
- Runs every 10 minutes via GitHub Actions
- Syncs posts tagged with "jetthoughts" organization
bin/sync_with_devto [options]
Options:
--dry Preview changes without syncing
--force Force sync all articles
--dry --force Preview forced sync-
Write on dev.to:
- Publish under JetThoughts organization
- Add relevant tags (first 2 tags used in URL)
-
Trigger sync:
- Wait for automatic sync (10 minutes)
- Or run manual sync command
Custom URLs can be configured in devto_urls_mapping.csv:
article_id,custom_url
12345,/blog/my-custom-url/Create new pages using Hugo archetypes:
# Create a new service page
hugo new services/new-service/index.md
# Create a new client case study
hugo new clients/new-client/index.md
# Create a new use case
hugo new use-cases/new-use-case/index.mdEdit hugo.toml to modify navigation:
[[menu.main]]
identifier = "new-item"
name = "New Item"
pageRef = "pages/new-item/"
weight = 70| Document | Description |
|---|---|
| README.md | Project overview and setup |
| CONTRIBUTING.md | Contribution guidelines |
| SETUP.md | Detailed setup instructions |
| CI-CD.md | CI/CD pipeline documentation |
| DEV-TO-INTEGRATION.md | dev.to sync documentation |
| DOCS-OVERVIEW.md | Documentation organization guide |
| AGENT-GUIDANCE.md | Agent resource locations and guidelines |
The project includes several internal APIs and scripts:
- Sync API (
lib/sync/) - Handles dev.to synchronization - Testing API (
test/) - Test utilities and helpers - Build Scripts (
bin/) - Automation scripts
We welcome contributions! Please see our Contributing Guidelines for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests (
bin/test) - Commit changes (
git commit -m 'Add amazing feature') - Push to branch (
git push origin feature/amazing-feature) - Open a Pull Request
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. See the LICENSE file for details.
- Hugo static site generator team
- dev.to for content platform integration
- GitHub for hosting and CI/CD
- All contributors and maintainers
- Website: https://jetthoughts.com
- Email: [email protected]
- Phone: +1 754 216 9568
- GitHub: @jetthoughts
Made with β€οΈ by JetThoughts Team