From 7cb037c878f313e2142cc788614e935f6fe819c8 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Thu, 22 Jan 2026 15:49:00 +0100 Subject: [PATCH 01/35] Add community projects to the config --- docusaurus.config.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 8ecda010..57284ca3 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -95,6 +95,16 @@ const config: Config = { }, }, }, + blog: { + id: 'community-projects', + path: 'community-projects', + blogTitle: 'Fictionlab Community Projects', + blogDescription: + 'Showcase of projects created by the Fictionlab community', + routeBasePath: '/community-projects', + blogSidebarTitle: 'All posts', + blogSidebarCount: 'ALL', + }, theme: { customCss: './src/css/custom.css', }, @@ -166,6 +176,11 @@ const config: Config = { position: 'left', to: '/integrations', }, + { + label: "Community Projects", + position: 'left', + to: '/community-projects', + }, { type: 'docsVersionDropdown', position: 'right', From b3bb5e91951e01879f3583cd2b35bd1f0fc53447 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Thu, 22 Jan 2026 15:49:30 +0100 Subject: [PATCH 02/35] Add dummy files for testing & eject some components --- community-projects/test copy.mdx | 32 +++++++++++ community-projects/test.mdx | 32 +++++++++++ .../BlogListPage/StructuredData/index.tsx | 15 +++++ src/theme/BlogListPage/index.tsx | 55 +++++++++++++++++++ src/theme/BlogPostItems/index.tsx | 25 +++++++++ 5 files changed, 159 insertions(+) create mode 100644 community-projects/test copy.mdx create mode 100644 community-projects/test.mdx create mode 100644 src/theme/BlogListPage/StructuredData/index.tsx create mode 100644 src/theme/BlogListPage/index.tsx create mode 100644 src/theme/BlogPostItems/index.tsx diff --git a/community-projects/test copy.mdx b/community-projects/test copy.mdx new file mode 100644 index 00000000..f6873cfd --- /dev/null +++ b/community-projects/test copy.mdx @@ -0,0 +1,32 @@ +--- +title: Welcome Docusaurus dasdasds +description: This is my first post on Docusaurus. +slug: welcome-docusaurus-v2-dddd +authors: + - name: Joel Marcey + title: Co-creator of Docusaurus 1 + url: https://github.com/JoelMarcey + image_url: https://github.com/JoelMarcey.png + socials: + x: joelmarcey + github: JoelMarcey + - name: Sébastien Lorber + title: Docusaurus maintainer + url: https://sebastienlorber.com + image_url: https://github.com/slorber.png + socials: + x: sebastienlorber + github: slorber + email: seb@example.com +tags: [hello, docusaurus-v2] +image: https://i.imgur.com/mErPwqL.png +hide_table_of_contents: false +--- + dsadsadsasdddddddddddddddd +Welcome to this blog. This blog is created with [**Docusaurus**](https://docusaurus.io/). + + + +This is my first post on Docusaurus. + +A whole bunch of exploration to follow. \ No newline at end of file diff --git a/community-projects/test.mdx b/community-projects/test.mdx new file mode 100644 index 00000000..82256d65 --- /dev/null +++ b/community-projects/test.mdx @@ -0,0 +1,32 @@ +--- +title: Welcome Docusaurus +description: This is my first post on Docusaurus. +slug: welcome-docusaurus-v2 +authors: + - name: Joel Marcey + title: Co-creator of Docusaurus 1 + url: https://github.com/JoelMarcey + image_url: https://github.com/JoelMarcey.png + socials: + x: joelmarcey + github: JoelMarcey + - name: Sébastien Lorber + title: Docusaurus maintainer + url: https://sebastienlorber.com + image_url: https://github.com/slorber.png + socials: + x: sebastienlorber + github: slorber + email: seb@example.com +tags: [hello, docusaurus-v2] +image: https://i.imgur.com/mErPwqL.png +hide_table_of_contents: false +--- + +Welcome to this blog. This blog is created with [**Docusaurus**](https://docusaurus.io/). + + + +This is my first post on Docusaurus. + +A whole bunch of exploration to follow. \ No newline at end of file diff --git a/src/theme/BlogListPage/StructuredData/index.tsx b/src/theme/BlogListPage/StructuredData/index.tsx new file mode 100644 index 00000000..c8019010 --- /dev/null +++ b/src/theme/BlogListPage/StructuredData/index.tsx @@ -0,0 +1,15 @@ +import React, {type ReactNode} from 'react'; +import Head from '@docusaurus/Head'; +import {useBlogListPageStructuredData} from '@docusaurus/plugin-content-blog/client'; +import type {Props} from '@theme/BlogListPage/StructuredData'; + +export default function BlogListPageStructuredData(props: Props): ReactNode { + const structuredData = useBlogListPageStructuredData(props); + return ( + + + + ); +} diff --git a/src/theme/BlogListPage/index.tsx b/src/theme/BlogListPage/index.tsx new file mode 100644 index 00000000..a3e7e726 --- /dev/null +++ b/src/theme/BlogListPage/index.tsx @@ -0,0 +1,55 @@ +import React, {type ReactNode} from 'react'; +import clsx from 'clsx'; + +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import { + PageMetadata, + HtmlClassNameProvider, + ThemeClassNames, +} from '@docusaurus/theme-common'; +import BlogLayout from '@theme/BlogLayout'; +import BlogListPaginator from '@theme/BlogListPaginator'; +import SearchMetadata from '@theme/SearchMetadata'; +import type {Props} from '@theme/BlogListPage'; +import BlogPostItems from '@theme/BlogPostItems'; +import BlogListPageStructuredData from '@theme/BlogListPage/StructuredData'; + +function BlogListPageMetadata(props: Props): ReactNode { + const {metadata} = props; + const { + siteConfig: {title: siteTitle}, + } = useDocusaurusContext(); + const {blogDescription, blogTitle, permalink} = metadata; + const isBlogOnlyMode = permalink === '/'; + const title = isBlogOnlyMode ? siteTitle : blogTitle; + return ( + <> + + + + ); +} + +function BlogListPageContent(props: Props): ReactNode { + const {metadata, items, sidebar} = props; + return ( + + + + + ); +} + +export default function BlogListPage(props: Props): ReactNode { + return ( + + + + + + ); +} diff --git a/src/theme/BlogPostItems/index.tsx b/src/theme/BlogPostItems/index.tsx new file mode 100644 index 00000000..aa83d5e4 --- /dev/null +++ b/src/theme/BlogPostItems/index.tsx @@ -0,0 +1,25 @@ +import React, {type ReactNode} from 'react'; +import {BlogPostProvider} from '@docusaurus/plugin-content-blog/client'; +import BlogPostItem from '@theme/BlogPostItem'; +import type {Props} from '@theme/BlogPostItems'; + +export default function BlogPostItems({ + items, + component: BlogPostItemComponent = BlogPostItem, +}: Props): ReactNode { + return ( + <> + {items.map(({content: BlogPostContent}) => ( + + {BlogPostContent.metadata.title} + + DDDDD + + + + ))} + + ); +} From cb002f14e35c8726bd30f62a2b009c1809e35430 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 23 Jan 2026 15:09:21 +0100 Subject: [PATCH 03/35] Add AI generated projects for mockups --- .../autonomous-agriculture-robot.mdx | 105 +++++++ .../mining-inspection-robot.mdx | 259 ++++++++++++++++++ .../museum-tour-guide-robot.mdx | 211 ++++++++++++++ community-projects/search-rescue-robot.mdx | 125 +++++++++ community-projects/test copy.mdx | 32 --- community-projects/test.mdx | 32 --- .../underwater-exploration-rover.mdx | 167 +++++++++++ 7 files changed, 867 insertions(+), 64 deletions(-) create mode 100644 community-projects/autonomous-agriculture-robot.mdx create mode 100644 community-projects/mining-inspection-robot.mdx create mode 100644 community-projects/museum-tour-guide-robot.mdx create mode 100644 community-projects/search-rescue-robot.mdx delete mode 100644 community-projects/test copy.mdx delete mode 100644 community-projects/test.mdx create mode 100644 community-projects/underwater-exploration-rover.mdx diff --git a/community-projects/autonomous-agriculture-robot.mdx b/community-projects/autonomous-agriculture-robot.mdx new file mode 100644 index 00000000..7f6ad712 --- /dev/null +++ b/community-projects/autonomous-agriculture-robot.mdx @@ -0,0 +1,105 @@ +--- +title: Autonomous Agriculture Monitoring System +description: Leo Rover adapted for precision agriculture, featuring autonomous navigation, crop health monitoring, and real-time data collection in vineyard environments. +slug: autonomous-agriculture-monitoring +authors: + - name: Dr. Maria Santos + title: Robotics Researcher + url: https://github.com/mariasantos + image_url: https://i.pravatar.cc/150?img=5 + socials: + github: mariasantos + email: m.santos@agritech.edu +tags: [leo-rover, agriculture, autonomous-navigation, computer-vision, lidar] +image: https://images.unsplash.com/photo-1625246333195-78d9c38ad449?w=800 +hide_table_of_contents: false +--- + +An innovative Leo Rover-based system for autonomous crop monitoring in vineyards, utilizing advanced sensors and AI for precision agriculture. + + + +## Project Overview + +Our team at AgriTech University has successfully adapted the Leo Rover platform to create an autonomous agricultural monitoring system. The robot navigates independently through vineyard rows, collecting crucial data about crop health, soil conditions, and environmental parameters. + +## Key Features + +### Autonomous Navigation +- **GPS-RTK Integration**: Centimeter-level positioning accuracy for precise row following +- **LiDAR Mapping**: Real-time 3D mapping of vineyard structure and obstacles +- **Path Planning**: Intelligent route optimization for complete field coverage + +### Crop Health Monitoring +- **Multispectral Camera**: NDVI analysis for early disease detection +- **Thermal Imaging**: Identification of water stress in plants +- **RGB Vision**: High-resolution photos for visual inspection + +### Environmental Sensing +- Soil moisture and temperature sensors +- Ambient temperature and humidity monitoring +- Light intensity measurements + +## Technical Implementation + +The system runs on ROS Noetic with custom nodes for: +- Sensor data fusion +- Autonomous navigation stack +- Image processing and analysis +- Cloud data synchronization + +```python +# Example: NDVI calculation node +import rospy +from sensor_msgs.msg import Image +import cv2 +import numpy as np + +class NDVIProcessor: + def __init__(self): + self.nir_sub = rospy.Subscriber('/multispectral/nir', Image, self.nir_callback) + self.red_sub = rospy.Subscriber('/multispectral/red', Image, self.red_callback) + # Processing logic here +``` + +## Results + +After 6 months of field testing: +- **95% navigation accuracy** in complex vineyard terrain +- **Early disease detection** up to 2 weeks before visible symptoms +- **40% reduction** in manual inspection time +- **Coverage**: 5 hectares per 8-hour operation + +## Hardware Modifications + +- Extended battery pack for 8+ hour operation +- Custom mounting bracket for multispectral camera +- Weatherproof enclosure for electronics +- Upgraded wheels for better traction in muddy conditions + +## Future Development + +We're working on: +- Integration with drone systems for comprehensive monitoring +- Machine learning models for automatic pest identification +- Integration with irrigation systems for automated response +- Multi-robot coordination for large-scale farms + +## Project Team + +**Created by**: AgriTech Research Lab, University of California Davis +**Project Lead**: Dr. Maria Santos +**Duration**: 18 months (2024-2025) +**Funding**: USDA Agricultural Research Grant + +## Resources + +- [GitHub Repository](https://github.com/agritech-lab/leo-agriculture) +- [Research Paper (PDF)](https://example.com/paper.pdf) +- [Demo Video](https://youtube.com/watch?v=example) +- [Technical Documentation](https://docs.example.com/leo-agri) +- [ROS Packages](https://github.com/agritech-lab/leo-agri-ros) + +## Contact + +For collaboration or questions, reach out to our team at [agritech@ucdavis.edu](mailto:agritech@ucdavis.edu) diff --git a/community-projects/mining-inspection-robot.mdx b/community-projects/mining-inspection-robot.mdx new file mode 100644 index 00000000..cf14ada4 --- /dev/null +++ b/community-projects/mining-inspection-robot.mdx @@ -0,0 +1,259 @@ +--- +title: Underground Mining Inspection Robot +description: Ruggedized Leo Rover for hazardous underground mining inspections, featuring gas detection, structural monitoring, and autonomous tunnel navigation in GPS-denied environments. +slug: mining-inspection-robot +authors: + - name: Robert O'Brien + title: Mining Safety Engineer + url: https://github.com/robertobrien + image_url: https://i.pravatar.cc/150?img=33 + socials: + github: robertobrien + linkedin: robert-obrien-mining +tags: [leo-rover, mining, safety, inspection, autonomous-navigation, hazardous-environments] +image: https://images.unsplash.com/photo-1586864387634-bfc711ba7724?w=800 +hide_table_of_contents: false +--- + +A heavily modified Leo Rover designed for autonomous inspections in underground mines, reducing human exposure to hazardous conditions while improving safety monitoring and operational efficiency. + + + +## Transforming Mining Safety + +Underground mining remains one of the world's most dangerous occupations. Our team at SafeMine Robotics has developed a Leo Rover-based solution that automates dangerous inspection tasks, protecting miners while improving inspection frequency and quality. + +## Critical Safety Features + +### Hazardous Gas Detection +- **Multi-Gas Sensor Array**: Simultaneous monitoring of CH₄, CO, CO₂, H₂S, O₂ +- **Real-Time Alerts**: Immediate notification of dangerous concentrations +- **Data Logging**: Continuous environmental monitoring records +- **Trend Analysis**: Predictive warnings of degrading air quality + +### Structural Monitoring +- **3D LiDAR Mapping**: Detection of roof falls and structural changes +- **Thermal Imaging**: Identification of hot spots (fire risk, equipment issues) +- **Acoustic Sensors**: Detection of cracking sounds indicating instability +- **Vibration Analysis**: Ground stability assessment + +### Explosion-Proof Design +- **ATEX Certification**: Compliant with explosive atmosphere regulations +- **Intrinsically Safe**: All electrical components rated for hazardous areas +- **No Spark Guarantee**: Protected motor enclosures +- **Static Discharge**: Grounding chains and anti-static materials + +## Autonomous Navigation in Darkness + +### GPS-Denied Environment Solutions +```python +class UndergroundNavigator: + def __init__(self): + self.slam = LiDAR_SLAM() + self.imu = InertialMeasurementUnit() + self.odometry = WheelOdometry() + + def localize(self): + """Sensor fusion for accurate positioning""" + lidar_pose = self.slam.get_pose() + imu_data = self.imu.get_orientation() + wheel_data = self.odometry.get_displacement() + + # Kalman filter fusion + return self.fuse_sensors(lidar_pose, imu_data, wheel_data) + + def navigate_tunnel(self, target): + """Follow tunnel while avoiding obstacles""" + tunnel_center = self.detect_tunnel_walls() + return self.calculate_safe_path(tunnel_center, target) +``` + +### Navigation Capabilities +- **SLAM-Based Mapping**: Creates accurate 3D maps without GPS +- **Tunnel Following**: Autonomous navigation through winding tunnels +- **Obstacle Avoidance**: Detection and avoidance of equipment, rails, debris +- **Auto-Return**: Finds way back to start point automatically +- **Multi-Floor**: Handles ramps and elevation changes + +## Inspection Workflows + +### Daily Routine Inspections +**Automated Schedule**: Robot performs inspections during off-shift hours + +1. **Pre-Shift Inspection** (60 minutes before shift) + - Gas level verification in all work areas + - Equipment status check + - Roof and wall integrity scan + - Report delivered to shift supervisor + +2. **Mid-Shift Check** (every 4 hours) + - Ventilation system verification + - Gas accumulation monitoring + - Temperature checks + +3. **Post-Blast Inspection** (after explosives use) + - Safe area verification before human entry + - Blast damage assessment + - Gas dissipation confirmation + +### Incident Response +- **Emergency Deployment**: Rapid assessment of accident sites +- **Search Operations**: Thermal imaging for locating personnel +- **Hazard Mapping**: Identifies safe routes for rescue teams +- **Continuous Monitoring**: Real-time data during rescue operations + +## Real-World Impact + +### Case Study: Coal Mine, West Virginia + +**Challenge**: Aging mine with increasing roof fall incidents +**Deployment**: 3 Leo mining robots, 18-month trial + +**Results**: +- **Roof Falls Detected Early**: 12 incidents prevented by early warnings +- **Zero Inspector Injuries**: 100% reduction in inspection-related accidents +- **Inspection Frequency**: Increased from weekly to daily +- **Cost Savings**: $450,000 in prevented accidents and downtime +- **Regulatory Compliance**: 100% inspection documentation + +### Case Study: Gold Mine, Nevada + +**Challenge**: Deep underground work in hot conditions (45°C+) +**Deployment**: Heat-resistant Leo variant + +**Achievements**: +- Operated continuously for 6 months in extreme heat +- Detected ventilation system failure before human exposure +- Reduced human exposure to heat by 80% +- Mapped previously unexplored tunnels safely + +## Ruggedization Upgrades + +### Environmental Protection +- **Temperature Range**: -10°C to +55°C operation +- **Humidity**: 10-95% RH, fully sealed +- **Dust Protection**: IP68 rating, sealed electronics +- **Water Resistance**: Handles wet conditions, drainage pumps +- **Impact Resistance**: Survives rock falls up to 5kg from 2m + +### Mechanical Enhancements +- **Reinforced Frame**: Heavy-duty aluminum alloy +- **Track Option**: Interchangeable with wheels for loose material +- **Extended Ground Clearance**: 15cm vs standard 10cm +- **Bumper Guards**: 360° collision protection +- **Modular Design**: Field-replaceable components + +### Power System +- **Extended Battery**: 12-hour continuous operation +- **Hot-Swap Capability**: Battery change without shutdown +- **Charge Stations**: Automated docking and charging +- **Power Management**: Optimized for long-distance travel + +## Communication Systems + +### Underground Challenges +- **Through-Earth Radio**: Penetrates rock layers +- **WiFi Mesh Network**: Self-healing network of repeaters +- **Fiber Optic Tether**: Optional for ultra-reliable control +- **4G/LTE**: Surface-to-underground via booster network +- **LoRa Backup**: Long-range fallback communication + +### Data Management +- **Edge Processing**: Real-time analysis on robot +- **Cloud Sync**: Automatic upload when connection available +- **Local Storage**: 1TB for offline operation +- **Compressed Video**: Efficient bandwidth usage + +## Operational Advantages + +### For Mine Operators +- Continuous monitoring vs periodic human inspections +- Quantifiable risk reduction +- Detailed documentation for regulatory compliance +- Predictive maintenance data for equipment +- Lower insurance premiums + +### For Miners +- Reduced exposure to hazardous areas +- Confidence from continuous safety monitoring +- More information about work environment +- Emergency response capability + +### For Regulators +- Objective, documented inspection data +- Increased inspection frequency +- Standardized reporting +- Historical data for trend analysis + +## Training and Deployment + +### Operator Training (3-day course) +- Day 1: System overview and safety +- Day 2: Robot operation and mission planning +- Day 3: Maintenance and troubleshooting + +### Mine-Specific Setup +- Site survey and planning: 1 week +- Infrastructure installation: 2 weeks +- System testing and tuning: 1 week +- Operator training: 1 week +- Full operational: Month 2 + +## Return on Investment + +### Typical Mine (500 employees) +- **Initial Investment**: $75,000 per robot (2-3 robots recommended) +- **Annual Operating Cost**: $15,000 per robot +- **Payback Period**: 12-18 months + +**Savings Sources**: +- Reduced accidents: $200,000+/year +- Lower insurance: $50,000/year +- Increased productivity: $150,000/year +- Regulatory efficiency: $30,000/year + +## Regulatory Compliance + +**Certifications**: +- MSHA (Mine Safety and Health Administration) approved +- ATEX Zone 0 and 1 certified +- IECEx compliant +- CE marked for European operations +- CSA certified for Canadian mines + +## Project Background + +**Developed by**: SafeMine Robotics Inc. +**Founder & CEO**: Robert O'Brien (25 years mining experience) +**Engineering Team**: 8 robotics engineers, 4 mining safety experts +**Pilot Partners**: 15 mines across 4 countries +**Development**: 3 years R&D, 2 years field testing +**Funding**: Mining industry consortium, venture capital + +## Recognition + +- **Award**: Mining Innovation of the Year 2025 +- **Adoption**: 47 mines globally +- **Safety Record**: 0 accidents in 150,000 operation hours +- **Industry Support**: Endorsed by multiple mining unions + +## Resources + +- [GitHub - Robot Control Software](https://github.com/safemine-robotics/leo-mining-control) +- [GitHub - Navigation Stack](https://github.com/safemine-robotics/underground-navigation) +- [Technical Specifications (PDF)](https://example.com/tech-specs.pdf) +- [Safety Certification Documents](https://example.com/certifications) +- [ROI Calculator Tool](https://safemine.io/roi-calculator) +- [Video: Robot in Action](https://youtube.com/watch?v=example) +- [Case Studies Library](https://safemine.io/case-studies) +- [Training Materials](https://training.safemine.io) + +## Get Started + +**Free Consultation**: We offer complimentary site assessments +**Pilot Program**: 90-day trial deployment available +**Financing Options**: Leasing and rental programs + +Contact us: [info@safemine-robotics.com](mailto:info@safemine-robotics.com) +Phone: +1 (555) 123-4567 +Web: [https://safemine-robotics.com](https://safemine-robotics.com) diff --git a/community-projects/museum-tour-guide-robot.mdx b/community-projects/museum-tour-guide-robot.mdx new file mode 100644 index 00000000..a94226ce --- /dev/null +++ b/community-projects/museum-tour-guide-robot.mdx @@ -0,0 +1,211 @@ +--- +title: Interactive Museum Tour Guide Robot +description: Leo Rover transformed into an engaging, autonomous museum guide with voice interaction, multilingual support, and AR-enhanced exhibits for visitor education. +slug: museum-tour-guide-robot +authors: + - name: Sophie Laurent + title: Human-Robot Interaction Designer + url: https://github.com/sophielaurent + image_url: https://i.pravatar.cc/150?img=20 + socials: + github: sophielaurent + linkedin: sophie-laurent-hri +tags: [leo-rover, education, human-robot-interaction, voice-recognition, indoor-navigation] +image: https://images.unsplash.com/photo-1566127992631-137a642a90f4?w=800 +hide_table_of_contents: false +--- + +An autonomous Leo Rover that serves as an interactive museum tour guide, engaging visitors with stories, answering questions, and enhancing exhibitions with augmented reality content. + + + +## Bringing Exhibits to Life + +Museums are embracing technology to create more engaging visitor experiences. Our team at the Museum Innovation Lab developed "RoboGuide" - a Leo Rover-based tour guide that combines autonomous navigation, natural language interaction, and augmented reality to transform museum visits. + +## Visitor Experience + +### Interactive Tours +- **Voice Interaction**: Natural conversations in 12 languages +- **Personalized Routes**: Tours adapted to visitor interests and time available +- **Story Telling**: Engaging narratives about exhibits with historical context +- **Q&A Capability**: Answers to visitor questions using GPT-4 integration + +### Augmented Reality Features +- **Tablet Display**: 10" screen showing AR overlays +- **3D Reconstructions**: See artifacts as they looked originally +- **Historical Scenes**: Visualize historical events in the actual location +- **Interactive Games**: Educational activities for children + +### Accessibility Features +- **Multilingual Support**: 12 languages including sign language interpretation +- **Height-Adjustable Display**: Accessible for wheelchair users and children +- **Audio Descriptions**: Enhanced descriptions for visually impaired visitors +- **Slow Mode**: Adjusted speed for elderly visitors + +## Technical Implementation + +### Navigation System +```python +class MuseumNavigator: + def __init__(self): + self.map = self.load_museum_map() + self.exhibits = self.load_exhibit_database() + + def plan_tour(self, visitor_preferences, duration): + """Generate optimal tour based on interests and time""" + exhibit_priorities = self.rank_exhibits(visitor_preferences) + route = self.optimize_path(exhibit_priorities, duration) + return self.create_tour_schedule(route) + + def avoid_visitors(self): + """Dynamic obstacle avoidance for crowded spaces""" + # LiDAR-based pedestrian detection and avoidance +``` + +### AI-Powered Interaction +- **Speech Recognition**: Google Speech API with custom museum vocabulary +- **Natural Language Understanding**: Intent classification and entity extraction +- **Response Generation**: Context-aware answers with personality +- **Emotion Recognition**: Camera-based visitor engagement detection + +### Safety Systems +- **Collision Avoidance**: 360° LiDAR protection zone +- **Emergency Stop**: Physical button and remote kill switch +- **Speed Limiting**: Automatically slows in crowded areas +- **Behavioral Compliance**: Programmed museum etiquette rules + +## Deployment Case Studies + +### National History Museum (London) +**Deployment Period**: 6 months +**Visitors Served**: 15,000+ +**Results**: +- 92% visitor satisfaction rate +- Average tour duration: 45 minutes +- 78% of visitors said the robot enhanced their experience +- 25% increase in young adult visitors (18-35) + +### Science Museum (Boston) +**Special Feature**: Interactive science demonstrations +**Highlights**: +- Robot demonstrates simple physics experiments +- Synchronized with exhibit displays +- 500+ school groups participated +- Teachers reported 40% higher student engagement + +### Art Gallery (Tokyo) +**Unique Adaptation**: Minimalist aesthetic design +**Features**: +- Silent mode in contemplative gallery spaces +- Art history storytelling with emotional narratives +- Coordination with 3 robots for large groups + +## Visitor Feedback + +> "My kids were completely mesmerized! They learned so much more than with a traditional audio guide. The AR reconstructions were amazing!" +> — Sarah M., Parent + +> "As a wheelchair user, I appreciated that the robot automatically adjusted its display height and moved at my pace. Very thoughtful design." +> — David K., Visitor + +> "We've seen a significant increase in repeat visitors since introducing RoboGuide. People specifically come back to experience new tours." +> — Museum Director, Natural History Museum + +## Hardware Components + +### Base Platform +- Leo Rover (modified for indoor use) +- Quieter motors for museum environment +- Wider wheelbase for stability +- Custom decorative panels (museum-themed) + +### Added Components +- **Display System**: 10" touchscreen tablet on adjustable arm +- **Speaker Array**: Directional speakers for focused audio +- **Lighting**: Soft LED strips (museum-friendly) +- **Safety Sensors**: Additional ultrasonic sensors at low height +- **Branding**: Customizable panels for museum identity + +### Software Stack +- ROS Noetic for robot control +- Custom navigation package for indoor environments +- Web-based admin interface for museum staff +- Analytics dashboard for visitor metrics + +## Customization Options + +Museums can customize: +- **Tour Content**: Easy-to-update exhibit database +- **Voice Personality**: Choose tone and speaking style +- **Appearance**: Custom wraps and decorations +- **Routes**: Define approved paths and restricted areas +- **Scheduling**: Set operating hours and break times + +## Business Model & ROI + +### Cost Breakdown +- Initial Setup: $15,000-20,000 per robot +- Annual Maintenance: $2,000 +- Software Updates: Included in support package + +### Revenue Impact +Museums report: +- 15-30% increase in ticket sales +- Higher visitor engagement scores +- Positive media coverage and social media buzz +- Corporate sponsorship opportunities + +## Educational Impact + +### School Programs +- Aligned with curriculum standards +- Teacher control panels for guided tours +- Student activity sheets generated by robot +- Post-visit digital resources + +### Learning Outcomes +- 65% better information retention vs audio guides +- Higher engagement with complex topics +- Improved student enthusiasm for museum visits + +## Future Developments + +**In Progress**: +- Multi-robot coordination for larger museums +- VR headset integration for immersive experiences +- Gesture control interface +- Visitor tracking and analytics (privacy-compliant) + +**Planned**: +- Outdoor garden/sculpture garden capability +- Live expert video calls through the robot +- Community upload of personal stories related to exhibits + +## Project Information + +**Created by**: Museum Innovation Lab, MIT Media Lab +**Project Lead**: Sophie Laurent +**Partners**: 12 museums across 6 countries +**Development Duration**: 18 months +**Awards**: Innovation in Cultural Technology 2025 + +## Resources + +- [GitHub - RoboGuide Platform](https://github.com/museum-innovation/roboguide) +- [Documentation for Museums](https://docs.roboguide.io) +- [Tour Content Creation Guide](https://docs.roboguide.io/content-creation) +- [Demo Videos](https://youtube.com/playlist?list=example) +- [Case Study Reports (PDF)](https://example.com/case-studies) +- [API Documentation](https://api.roboguide.io/docs) + +## Get RoboGuide for Your Museum + +We offer: +- Complete turnkey solution +- Custom development for special exhibits +- Training for museum staff +- Ongoing support and updates + +Contact us: [info@roboguide.io](mailto:info@roboguide.io) +Schedule a demo: [https://roboguide.io/demo](https://roboguide.io/demo) diff --git a/community-projects/search-rescue-robot.mdx b/community-projects/search-rescue-robot.mdx new file mode 100644 index 00000000..286ab1d8 --- /dev/null +++ b/community-projects/search-rescue-robot.mdx @@ -0,0 +1,125 @@ +--- +title: Search and Rescue Robot with Thermal Imaging +description: Modified Leo Rover for urban search and rescue operations, equipped with thermal cameras, gas sensors, and real-time communication systems for emergency response teams. +slug: search-rescue-thermal-robot +authors: + - name: James Chen + title: Emergency Systems Engineer + url: https://github.com/jameschen + image_url: https://i.pravatar.cc/150?img=12 + socials: + github: jameschen + linkedin: james-chen-robotics +tags: [leo-rover, search-rescue, thermal-imaging, emergency-response, teleoperation] +image: https://images.unsplash.com/photo-1581092160562-40aa08e78837?w=800 +hide_table_of_contents: false +--- + +A life-saving Leo Rover modification designed for urban search and rescue operations in hazardous environments where human access is dangerous or impossible. + + + +## Mission Critical Design + +When disaster strikes, every second counts. Our team at Emergency Robotics Inc. has transformed the Leo Rover into a robust search and rescue platform capable of navigating through rubble, detecting survivors, and assessing hazardous conditions in real-time. + +## Core Capabilities + +### Survivor Detection +- **FLIR Thermal Camera**: Detection of body heat signatures through obstacles +- **Acoustic Sensors**: Detection of sounds and calls for help +- **CO2 Sensors**: Identification of breathing patterns in confined spaces +- **Two-way Audio**: Communication with trapped survivors + +### Hazard Assessment +- **Gas Detection Suite**: CO, CO2, methane, and other dangerous gases +- **Radiation Sensor**: Nuclear hazard identification +- **Structural Stability Analysis**: Vibration sensors for collapse risk +- **Air Quality Monitoring**: Oxygen levels and particulate matter + +### Enhanced Mobility +- **Reinforced Chassis**: Withstands impacts and rough terrain +- **Upgraded Motors**: 50% more torque for climbing rubble +- **Flexible Tracks Option**: Interchangeable with wheels for different terrains +- **Flipper Arms**: Self-righting mechanism for overturned situations + +## Real-World Deployment + +### Case Study: Warehouse Collapse - September 2025 + +During a warehouse collapse in Portland, our Leo SAR unit was deployed: + +1. **Initial Assessment** (5 minutes): Robot entered through a 60cm gap, mapped the interior with LiDAR +2. **Survivor Location** (15 minutes): Thermal imaging detected 3 heat signatures +3. **Communication** (20 minutes): Established audio contact with survivors +4. **Hazard Report** (25 minutes): Detected elevated CO levels, guiding rescue strategy +5. **Extraction Support** (2 hours): Provided continuous monitoring during rescue operations + +**Result**: All 3 survivors safely rescued. Robot operations significantly reduced risk to rescue personnel. + +## Technical Architecture + +### Control System +```python +# Emergency Response Control Node +class SARController: + def __init__(self): + self.thermal_feed = ThermalProcessor() + self.gas_sensors = GasSensorArray() + self.audio_system = BidirectionalAudio() + + def detect_survivors(self): + thermal_data = self.thermal_feed.get_hotspots() + audio_data = self.audio_system.listen() + return self.fusion_algorithm(thermal_data, audio_data) +``` + +### Communication +- **4G LTE Backup**: Redundant connectivity in disaster zones +- **Mesh Network**: Ad-hoc networking with other robots +- **Satellite Uplink**: Operation in areas with no infrastructure +- **Low-Latency Video**: Sub-200ms delay for precise control + +## Ruggedness Upgrades + +- IP67 waterproofing for operation in flooded areas +- Temperature range: -20°C to +60°C +- Drop-resistant design (1.5m falls) +- Dust-sealed components for debris-heavy environments +- Emergency power: 6-hour battery life + solar charging + +## Training and Certification + +We provide comprehensive training for emergency response teams: +- 2-day operator certification course +- Simulator-based training scenarios +- Field exercises with local fire departments +- Maintenance and troubleshooting workshops + +## Impact and Recognition + +- **15 successful deployments** in real emergency situations +- **Adopted by**: 8 fire departments across 5 states +- **Award**: Innovation in Emergency Response Technology 2025 +- **Lives Saved**: Direct contribution to 23 survivor rescues + +## Project Background + +**Developed by**: Emergency Robotics Inc. +**Lead Engineer**: James Chen +**Partners**: National Fire Protection Association, FEMA +**Funding**: DHS Science and Technology Directorate +**Timeline**: 2 years of development and field testing + +## Resources + +- [GitHub - Hardware Modifications](https://github.com/emergency-robotics/leo-sar-hardware) +- [GitHub - Control Software](https://github.com/emergency-robotics/leo-sar-software) +- [Operator Manual (PDF)](https://example.com/sar-manual.pdf) +- [Training Materials](https://example.com/training) +- [Deployment Case Studies](https://example.com/case-studies) +- [Video: Robot in Action](https://youtube.com/watch?v=example) + +## Get Involved + +Emergency response organizations interested in deploying this technology can contact us at [info@emergency-robotics.com](mailto:info@emergency-robotics.com) diff --git a/community-projects/test copy.mdx b/community-projects/test copy.mdx deleted file mode 100644 index f6873cfd..00000000 --- a/community-projects/test copy.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Welcome Docusaurus dasdasds -description: This is my first post on Docusaurus. -slug: welcome-docusaurus-v2-dddd -authors: - - name: Joel Marcey - title: Co-creator of Docusaurus 1 - url: https://github.com/JoelMarcey - image_url: https://github.com/JoelMarcey.png - socials: - x: joelmarcey - github: JoelMarcey - - name: Sébastien Lorber - title: Docusaurus maintainer - url: https://sebastienlorber.com - image_url: https://github.com/slorber.png - socials: - x: sebastienlorber - github: slorber - email: seb@example.com -tags: [hello, docusaurus-v2] -image: https://i.imgur.com/mErPwqL.png -hide_table_of_contents: false ---- - dsadsadsasdddddddddddddddd -Welcome to this blog. This blog is created with [**Docusaurus**](https://docusaurus.io/). - - - -This is my first post on Docusaurus. - -A whole bunch of exploration to follow. \ No newline at end of file diff --git a/community-projects/test.mdx b/community-projects/test.mdx deleted file mode 100644 index 82256d65..00000000 --- a/community-projects/test.mdx +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Welcome Docusaurus -description: This is my first post on Docusaurus. -slug: welcome-docusaurus-v2 -authors: - - name: Joel Marcey - title: Co-creator of Docusaurus 1 - url: https://github.com/JoelMarcey - image_url: https://github.com/JoelMarcey.png - socials: - x: joelmarcey - github: JoelMarcey - - name: Sébastien Lorber - title: Docusaurus maintainer - url: https://sebastienlorber.com - image_url: https://github.com/slorber.png - socials: - x: sebastienlorber - github: slorber - email: seb@example.com -tags: [hello, docusaurus-v2] -image: https://i.imgur.com/mErPwqL.png -hide_table_of_contents: false ---- - -Welcome to this blog. This blog is created with [**Docusaurus**](https://docusaurus.io/). - - - -This is my first post on Docusaurus. - -A whole bunch of exploration to follow. \ No newline at end of file diff --git a/community-projects/underwater-exploration-rover.mdx b/community-projects/underwater-exploration-rover.mdx new file mode 100644 index 00000000..e185cdd6 --- /dev/null +++ b/community-projects/underwater-exploration-rover.mdx @@ -0,0 +1,167 @@ +--- +title: Amphibious Leo Rover for Coastal Research +description: Waterproof Leo Rover modification capable of shallow water exploration, intertidal zone research, and underwater photography for marine biology studies. +slug: amphibious-coastal-research-rover +authors: + - name: Dr. Elena Kowalski + title: Marine Robotics Specialist + url: https://github.com/elenakowalski + image_url: https://i.pravatar.cc/150?img=9 + socials: + github: elenakowalski + twitter: elenamarinebot +tags: [leo-rover, marine-biology, underwater, research, waterproof] +image: https://images.unsplash.com/photo-1583212292454-1fe6229603b7?w=800 +hide_table_of_contents: false +--- + +A groundbreaking waterproof modification of Leo Rover for amphibious operations in intertidal zones and shallow coastal waters up to 3 meters depth. + + + +## Breaking New Ground in Marine Robotics + +Traditional underwater ROVs are expensive and complex. Land-based rovers can't access coastal zones. Our team at the Marine Science Institute developed an amphibious Leo Rover that bridges this gap, enabling affordable research in critical intertidal ecosystems. + +## Amphibious Capabilities + +### Waterproofing Design +- **Complete IP68 Sealing**: Submersible up to 3 meters +- **Pressure-Compensated Enclosures**: All electronic components protected +- **Corrosion-Resistant Materials**: Marine-grade aluminum and stainless steel +- **Hydrophobic Coatings**: Enhanced water shedding on electronics + +### Propulsion System +- **Hybrid Wheels**: Function on land and as paddles in water +- **Buoyancy Control**: Adjustable foam floats for neutral buoyancy +- **Thruster Assist**: Optional water jets for strong currents +- **Stability System**: Active ballast for level operation underwater + +## Research Applications + +### Intertidal Zone Monitoring +Our rover excels in studying the area between high and low tide marks: + +- **Time-lapse Photography**: Automated photo sequences during tide cycles +- **Species Identification**: AI-powered recognition of marine life +- **Habitat Mapping**: 3D reconstruction of rock pools and formations +- **Temperature Gradients**: Water and substrate temperature logging + +### Underwater Surveys +- High-resolution underwater photography +- Video documentation of fish populations +- Coral reef health assessment (shallow reefs) +- Pollution and debris monitoring + +### Beach and Coastal Studies +- Sand erosion measurement +- Turtle nesting site monitoring (non-invasive) +- Beach cleanup assistance (debris identification) +- Coastal vegetation surveys + +## Technical Specifications + +### Sensors and Cameras +```yaml +Primary Camera: + - 4K underwater camera with color correction + - 120° wide-angle lens + - LED ring light (6000 lumens, color adjustable) + +Scientific Sensors: + - pH sensor (seawater acidity) + - Dissolved oxygen probe + - Salinity sensor + - Water temperature (high precision ±0.1°C) + - Depth sensor (±1cm accuracy) + - Turbidity meter + +Navigation: + - Underwater GPS (acoustic positioning) + - IMU with compass + - Sonar for obstacle avoidance +``` + +### Power Management +- **Main Battery**: 8-hour operation (mixed land/water) +- **Emergency Backup**: 2-hour reserve power +- **Solar Panel**: 50W charging during surface operations +- **Low-Power Mode**: 24-hour monitoring capability + +## Field Research Results + +### Project: Coral Bleaching Study (Thailand, 2025) + +Over 3 months, our rover conducted daily surveys of shallow coral reefs: + +- **Coverage**: 2.5 km² of reef surveyed +- **Data Collected**: 45,000 photos, 200 hours of video +- **Discoveries**: Early detection of bleaching in previously unmonitored areas +- **Cost Savings**: 75% reduction compared to diver-based surveys + +### Project: Tide Pool Biodiversity (British Columbia) + +Automated monitoring of 50 tide pools over 6-month period: + +- **Species Cataloged**: 127 different species identified +- **Population Trends**: Tracked seasonal variations +- **Impact**: Data used for marine protected area planning + +## Safety Features + +- **Emergency Surfacing**: Automatic ascent if signal lost +- **Strobe Light**: High-visibility beacon for recovery +- **Acoustic Pinger**: Underwater locator beacon +- **Tether Option**: Removable safety line for high-current areas + +## Community Impact + +This project has democratized marine research: +- **Educational Programs**: 15 schools using rovers for student projects +- **Citizen Science**: Local communities monitoring their coastlines +- **Conservation**: Direct impact on 3 marine protected area designations + +## Building Your Own + +We've open-sourced all designs and software: + +### Bill of Materials +- Base Leo Rover platform +- Custom waterproof enclosures (3D printable or machined) +- Marine-grade connectors and cables +- Buoyancy foam and ballast weights +- Estimated cost: $8,000-12,000 + +### Assembly Guide +Complete step-by-step instructions available in our repository, including: +- CAD files for all custom parts +- Wiring diagrams +- Waterproofing procedures +- Testing protocols + +## Project Details + +**Developed by**: Marine Science Institute, University of Washington +**Principal Investigator**: Dr. Elena Kowalski +**Team**: 4 engineers, 6 marine biologists +**Funding**: National Science Foundation, Ocean Conservancy +**Development Period**: 2023-2024 + +## Resources + +- [GitHub Repository - Complete Build Guide](https://github.com/marine-institute/amphibious-leo) +- [CAD Files - 3D Models](https://github.com/marine-institute/amphibious-leo/tree/main/cad) +- [Software - ROS Packages](https://github.com/marine-institute/amphibious-leo/tree/main/software) +- [Research Publications](https://example.com/publications) +- [Build Tutorial Videos](https://youtube.com/playlist?list=example) +- [Field Test Results (Data)](https://example.com/data) + +## Collaborate With Us + +We're seeking partnerships with: +- Other marine research institutions +- Conservation organizations +- Educational institutions +- Makers and robotics enthusiasts + +Contact: [marine.robotics@uw.edu](mailto:marine.robotics@uw.edu) From a62d1d6606ef4d31e4119f29d091eeddb3d6b00d Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 23 Jan 2026 15:09:49 +0100 Subject: [PATCH 04/35] Initial card layout for community projects --- docusaurus.config.ts | 5 +- .../communityProjects}/BlogListPage/index.tsx | 16 ++-- .../communityProjects/BlogPostCard/index.tsx | 48 ++++++++++ .../BlogPostCard/styles.module.css | 94 +++++++++++++++++++ .../BlogPostItems/index.tsx | 18 ++-- .../BlogPostItems/styles.module.css | 58 ++++++++++++ .../BlogListPage/StructuredData/index.tsx | 15 --- 7 files changed, 222 insertions(+), 32 deletions(-) rename src/{theme => components/communityProjects}/BlogListPage/index.tsx (80%) create mode 100644 src/components/communityProjects/BlogPostCard/index.tsx create mode 100644 src/components/communityProjects/BlogPostCard/styles.module.css rename src/{theme => components/communityProjects}/BlogPostItems/index.tsx (58%) create mode 100644 src/components/communityProjects/BlogPostItems/styles.module.css delete mode 100644 src/theme/BlogListPage/StructuredData/index.tsx diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 57284ca3..a4168426 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -102,8 +102,9 @@ const config: Config = { blogDescription: 'Showcase of projects created by the Fictionlab community', routeBasePath: '/community-projects', - blogSidebarTitle: 'All posts', - blogSidebarCount: 'ALL', + blogSidebarCount: 0, + feedOptions: { type: null }, + blogListComponent: '@site/src/components/communityProjects/BlogListPage', }, theme: { customCss: './src/css/custom.css', diff --git a/src/theme/BlogListPage/index.tsx b/src/components/communityProjects/BlogListPage/index.tsx similarity index 80% rename from src/theme/BlogListPage/index.tsx rename to src/components/communityProjects/BlogListPage/index.tsx index a3e7e726..9368331b 100644 --- a/src/theme/BlogListPage/index.tsx +++ b/src/components/communityProjects/BlogListPage/index.tsx @@ -7,12 +7,12 @@ import { HtmlClassNameProvider, ThemeClassNames, } from '@docusaurus/theme-common'; -import BlogLayout from '@theme/BlogLayout'; import BlogListPaginator from '@theme/BlogListPaginator'; import SearchMetadata from '@theme/SearchMetadata'; import type {Props} from '@theme/BlogListPage'; -import BlogPostItems from '@theme/BlogPostItems'; +import BlogPostItems from '@site/src/components/communityProjects/BlogPostItems'; import BlogListPageStructuredData from '@theme/BlogListPage/StructuredData'; +import Layout from '@theme/Layout'; function BlogListPageMetadata(props: Props): ReactNode { const {metadata} = props; @@ -31,12 +31,14 @@ function BlogListPageMetadata(props: Props): ReactNode { } function BlogListPageContent(props: Props): ReactNode { - const {metadata, items, sidebar} = props; + const {metadata, items} = props; return ( - - - - + +
+ + +
+
); } diff --git a/src/components/communityProjects/BlogPostCard/index.tsx b/src/components/communityProjects/BlogPostCard/index.tsx new file mode 100644 index 00000000..b8fdc208 --- /dev/null +++ b/src/components/communityProjects/BlogPostCard/index.tsx @@ -0,0 +1,48 @@ +import React, {type ReactNode} from 'react'; +import clsx from 'clsx'; +import {useBlogPost} from '@docusaurus/plugin-content-blog/client'; +import BlogPostItemContainer from '@theme/BlogPostItem/Container'; +import type {Props} from '@theme/BlogPostItem'; +import styles from './styles.module.css'; +import Link from '@docusaurus/Link'; + +// apply a bottom margin in list view +function useContainerClassName() { + const {isBlogPostPage} = useBlogPost(); + return !isBlogPostPage ? 'margin-bottom--xl' : undefined; +} + + +export default function BlogPostCard({children, className}: Props): ReactNode { + const containerClassName = useContainerClassName(); + const {metadata, isBlogPostPage} = useBlogPost(); + + return ( + + + {metadata.frontMatter.image && ( +
+ {metadata.title} +
+ )} +
+

{metadata.title}

+ {metadata.description && ( +

{metadata.description}

+ )} + {metadata.tags && metadata.tags.length > 0 && ( +
+ {metadata.tags.slice(0, 3).map((tag) => ( + + {tag.label} + + ))} +
+ )} +
+ +
+ ); +} diff --git a/src/components/communityProjects/BlogPostCard/styles.module.css b/src/components/communityProjects/BlogPostCard/styles.module.css new file mode 100644 index 00000000..e29a7260 --- /dev/null +++ b/src/components/communityProjects/BlogPostCard/styles.module.css @@ -0,0 +1,94 @@ +.compactCard { + height: 100%; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.compactCard:hover { + transform: translateY(-4px); + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15); +} + +.cardLink { + display: flex; + flex-direction: column; + height: 100%; + text-decoration: none; + color: inherit; + overflow: hidden; +} + +.cardLink:hover { + text-decoration: none; + color: inherit; +} + +.cardImage { + width: 100%; + height: 200px; + overflow: hidden; + background-color: var(--ifm-color-emphasis-200); +} + +.cardImage img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.3s ease; +} + +.compactCard:hover .cardImage img { + transform: scale(1.05); +} + +.cardContent { + padding: 1.5rem; + flex: 1; + display: flex; + flex-direction: column; +} + +.cardTitle { + font-size: 1.25rem; + font-weight: 600; + margin: 0 0 0.75rem 0; + line-height: 1.4; + color: var(--ifm-heading-color); + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.cardDescription { + flex: 1; + font-size: 0.9rem; + color: var(--ifm-color-emphasis-700); + line-height: 1.6; + margin: 0 0 1rem 0; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.cardTags { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-top: auto; +} + +.cardTag { + font-size: 0.75rem; + padding: 0.25rem 0.75rem; + background-color: var(--ifm-color-emphasis-200); + color: var(--ifm-color-emphasis-800); + border-radius: 12px; + font-weight: 500; +} + +/* Ciemny motyw */ +[data-theme='dark'] .cardTag { + background-color: var(--ifm-color-emphasis-300); + color: var(--ifm-color-emphasis-900); +} diff --git a/src/theme/BlogPostItems/index.tsx b/src/components/communityProjects/BlogPostItems/index.tsx similarity index 58% rename from src/theme/BlogPostItems/index.tsx rename to src/components/communityProjects/BlogPostItems/index.tsx index aa83d5e4..03109959 100644 --- a/src/theme/BlogPostItems/index.tsx +++ b/src/components/communityProjects/BlogPostItems/index.tsx @@ -1,25 +1,27 @@ -import React, {type ReactNode} from 'react'; import {BlogPostProvider} from '@docusaurus/plugin-content-blog/client'; import BlogPostItem from '@theme/BlogPostItem'; import type {Props} from '@theme/BlogPostItems'; +import styles from './styles.module.css'; +import { ReactNode } from 'react'; +import BlogPostCard from '@site/src/components/communityProjects/BlogPostCard'; export default function BlogPostItems({ items, component: BlogPostItemComponent = BlogPostItem, }: Props): ReactNode { return ( - <> +
{items.map(({content: BlogPostContent}) => ( - {BlogPostContent.metadata.title} - - DDDDD - - +
+ + + +
))} - +
); } diff --git a/src/components/communityProjects/BlogPostItems/styles.module.css b/src/components/communityProjects/BlogPostItems/styles.module.css new file mode 100644 index 00000000..2c61ae42 --- /dev/null +++ b/src/components/communityProjects/BlogPostItems/styles.module.css @@ -0,0 +1,58 @@ +.blogPostGrid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 1.5rem; + margin-bottom: 2rem; + max-width: 100%; + margin-left: auto; + margin-right: auto; + padding: 0 1rem; +} + +/* Maksymalnie 4 kolumny */ +@media (min-width: 1400px) { + .blogPostGrid { + grid-template-columns: repeat(4, 1fr); + max-width: 1600px; + } +} + +@media (min-width: 1024px) and (max-width: 1399px) { + .blogPostGrid { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (min-width: 768px) and (max-width: 1023px) { + .blogPostGrid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 767px) { + .blogPostGrid { + grid-template-columns: 1fr; + } +} + +.blogPostCard { + height: 100%; + display: flex; + flex-direction: column; + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: 8px; + overflow: hidden; + transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + background-color: var(--ifm-card-background-color, var(--ifm-background-surface-color)); +} + +.blogPostCard:hover { + transform: translateY(-4px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + border-color: var(--ifm-color-primary); +} + +/* Upewnij się, że zawartość karty zajmuje całą dostępną przestrzeń */ +.blogPostCard > * { + height: 100%; +} diff --git a/src/theme/BlogListPage/StructuredData/index.tsx b/src/theme/BlogListPage/StructuredData/index.tsx deleted file mode 100644 index c8019010..00000000 --- a/src/theme/BlogListPage/StructuredData/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React, {type ReactNode} from 'react'; -import Head from '@docusaurus/Head'; -import {useBlogListPageStructuredData} from '@docusaurus/plugin-content-blog/client'; -import type {Props} from '@theme/BlogListPage/StructuredData'; - -export default function BlogListPageStructuredData(props: Props): ReactNode { - const structuredData = useBlogListPageStructuredData(props); - return ( - - - - ); -} From a3b506941e36c584938ff78052d257070f0a287b Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 23 Jan 2026 15:11:42 +0100 Subject: [PATCH 05/35] Use correct filepath naming --- .../autonomous-agriculture-robot.mdx | 0 .../mining-inspection-robot.mdx | 0 .../museum-tour-guide-robot.mdx | 0 .../search-rescue-robot.mdx | 0 .../underwater-exploration-rover.mdx | 0 docusaurus.config.ts | 2 +- 6 files changed, 1 insertion(+), 1 deletion(-) rename {community-projects => communityProjects}/autonomous-agriculture-robot.mdx (100%) rename {community-projects => communityProjects}/mining-inspection-robot.mdx (100%) rename {community-projects => communityProjects}/museum-tour-guide-robot.mdx (100%) rename {community-projects => communityProjects}/search-rescue-robot.mdx (100%) rename {community-projects => communityProjects}/underwater-exploration-rover.mdx (100%) diff --git a/community-projects/autonomous-agriculture-robot.mdx b/communityProjects/autonomous-agriculture-robot.mdx similarity index 100% rename from community-projects/autonomous-agriculture-robot.mdx rename to communityProjects/autonomous-agriculture-robot.mdx diff --git a/community-projects/mining-inspection-robot.mdx b/communityProjects/mining-inspection-robot.mdx similarity index 100% rename from community-projects/mining-inspection-robot.mdx rename to communityProjects/mining-inspection-robot.mdx diff --git a/community-projects/museum-tour-guide-robot.mdx b/communityProjects/museum-tour-guide-robot.mdx similarity index 100% rename from community-projects/museum-tour-guide-robot.mdx rename to communityProjects/museum-tour-guide-robot.mdx diff --git a/community-projects/search-rescue-robot.mdx b/communityProjects/search-rescue-robot.mdx similarity index 100% rename from community-projects/search-rescue-robot.mdx rename to communityProjects/search-rescue-robot.mdx diff --git a/community-projects/underwater-exploration-rover.mdx b/communityProjects/underwater-exploration-rover.mdx similarity index 100% rename from community-projects/underwater-exploration-rover.mdx rename to communityProjects/underwater-exploration-rover.mdx diff --git a/docusaurus.config.ts b/docusaurus.config.ts index a4168426..d3861ce6 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -97,7 +97,7 @@ const config: Config = { }, blog: { id: 'community-projects', - path: 'community-projects', + path: 'communityProjects', blogTitle: 'Fictionlab Community Projects', blogDescription: 'Showcase of projects created by the Fictionlab community', From 94394547537780a3307bef69fddc498ee60ff9fb Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 23 Jan 2026 15:27:47 +0100 Subject: [PATCH 06/35] Minor card fixes --- .../communityProjects/BlogPostCard/index.tsx | 14 +++----------- .../BlogPostCard/styles.module.css | 4 +++- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/components/communityProjects/BlogPostCard/index.tsx b/src/components/communityProjects/BlogPostCard/index.tsx index b8fdc208..ba7afaa1 100644 --- a/src/components/communityProjects/BlogPostCard/index.tsx +++ b/src/components/communityProjects/BlogPostCard/index.tsx @@ -6,20 +6,12 @@ import type {Props} from '@theme/BlogPostItem'; import styles from './styles.module.css'; import Link from '@docusaurus/Link'; -// apply a bottom margin in list view -function useContainerClassName() { - const {isBlogPostPage} = useBlogPost(); - return !isBlogPostPage ? 'margin-bottom--xl' : undefined; -} - - -export default function BlogPostCard({children, className}: Props): ReactNode { - const containerClassName = useContainerClassName(); - const {metadata, isBlogPostPage} = useBlogPost(); +export default function BlogPostCard({className}: Props): ReactNode { + const {metadata} = useBlogPost(); return ( {metadata.frontMatter.image && ( diff --git a/src/components/communityProjects/BlogPostCard/styles.module.css b/src/components/communityProjects/BlogPostCard/styles.module.css index e29a7260..57b50bf7 100644 --- a/src/components/communityProjects/BlogPostCard/styles.module.css +++ b/src/components/communityProjects/BlogPostCard/styles.module.css @@ -55,6 +55,7 @@ color: var(--ifm-heading-color); display: -webkit-box; -webkit-line-clamp: 2; + line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } @@ -67,8 +68,10 @@ margin: 0 0 1rem 0; display: -webkit-box; -webkit-line-clamp: 3; + line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; + max-height: 69.14px; } .cardTags { @@ -87,7 +90,6 @@ font-weight: 500; } -/* Ciemny motyw */ [data-theme='dark'] .cardTag { background-color: var(--ifm-color-emphasis-300); color: var(--ifm-color-emphasis-900); From 2278d0b1a5dca2aef3f6f074d6fb1ed59ce6e356 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 23 Jan 2026 15:31:52 +0100 Subject: [PATCH 07/35] Use content as description --- src/components/communityProjects/BlogPostCard/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/communityProjects/BlogPostCard/index.tsx b/src/components/communityProjects/BlogPostCard/index.tsx index ba7afaa1..1f4aaf61 100644 --- a/src/components/communityProjects/BlogPostCard/index.tsx +++ b/src/components/communityProjects/BlogPostCard/index.tsx @@ -6,7 +6,7 @@ import type {Props} from '@theme/BlogPostItem'; import styles from './styles.module.css'; import Link from '@docusaurus/Link'; -export default function BlogPostCard({className}: Props): ReactNode { +export default function BlogPostCard({children, className}: Props): ReactNode { const {metadata} = useBlogPost(); return ( @@ -22,7 +22,7 @@ export default function BlogPostCard({className}: Props): ReactNode {

{metadata.title}

{metadata.description && ( -

{metadata.description}

+

{children}

)} {metadata.tags && metadata.tags.length > 0 && (
From 32ae21cd2ad2e2b90549091eea14d03a15ce81ea Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 23 Jan 2026 15:52:44 +0100 Subject: [PATCH 08/35] Add company info display --- .../autonomous-agriculture-robot.mdx | 6 +++- communityProjects/mining-inspection-robot.mdx | 6 +++- communityProjects/museum-tour-guide-robot.mdx | 6 +++- communityProjects/search-rescue-robot.mdx | 6 +++- .../underwater-exploration-rover.mdx | 6 +++- .../communityProjects/BlogPostCard/index.tsx | 32 ++++++++++++++++- .../BlogPostCard/styles.module.css | 36 +++++++++++++++++++ 7 files changed, 92 insertions(+), 6 deletions(-) diff --git a/communityProjects/autonomous-agriculture-robot.mdx b/communityProjects/autonomous-agriculture-robot.mdx index 7f6ad712..28bf9d6d 100644 --- a/communityProjects/autonomous-agriculture-robot.mdx +++ b/communityProjects/autonomous-agriculture-robot.mdx @@ -13,11 +13,15 @@ authors: tags: [leo-rover, agriculture, autonomous-navigation, computer-vision, lidar] image: https://images.unsplash.com/photo-1625246333195-78d9c38ad449?w=800 hide_table_of_contents: false +company: + name: AgriTech University + url: https://agritech.edu + logo_url: https://i.pravatar.cc/150?img=5 --- An innovative Leo Rover-based system for autonomous crop monitoring in vineyards, utilizing advanced sensors and AI for precision agriculture. - +{/* truncate */} ## Project Overview diff --git a/communityProjects/mining-inspection-robot.mdx b/communityProjects/mining-inspection-robot.mdx index cf14ada4..f1940c21 100644 --- a/communityProjects/mining-inspection-robot.mdx +++ b/communityProjects/mining-inspection-robot.mdx @@ -13,11 +13,15 @@ authors: tags: [leo-rover, mining, safety, inspection, autonomous-navigation, hazardous-environments] image: https://images.unsplash.com/photo-1586864387634-bfc711ba7724?w=800 hide_table_of_contents: false +company: + name: SafeMine Robotics + url: https://safemine-robotics.com + logo_url: https://i.pravatar.cc/150?img=33 --- A heavily modified Leo Rover designed for autonomous inspections in underground mines, reducing human exposure to hazardous conditions while improving safety monitoring and operational efficiency. - +{/* truncate */} ## Transforming Mining Safety diff --git a/communityProjects/museum-tour-guide-robot.mdx b/communityProjects/museum-tour-guide-robot.mdx index a94226ce..a9aad90f 100644 --- a/communityProjects/museum-tour-guide-robot.mdx +++ b/communityProjects/museum-tour-guide-robot.mdx @@ -13,11 +13,15 @@ authors: tags: [leo-rover, education, human-robot-interaction, voice-recognition, indoor-navigation] image: https://images.unsplash.com/photo-1566127992631-137a642a90f4?w=800 hide_table_of_contents: false +company: + name: Museum Innovation Lab + url: https://museum-innovation-lab.org + logo_url: https://i.pravatar.cc/150?img=20 --- An autonomous Leo Rover that serves as an interactive museum tour guide, engaging visitors with stories, answering questions, and enhancing exhibitions with augmented reality content. - +{/* truncate */} ## Bringing Exhibits to Life diff --git a/communityProjects/search-rescue-robot.mdx b/communityProjects/search-rescue-robot.mdx index 286ab1d8..63aec3bd 100644 --- a/communityProjects/search-rescue-robot.mdx +++ b/communityProjects/search-rescue-robot.mdx @@ -13,11 +13,15 @@ authors: tags: [leo-rover, search-rescue, thermal-imaging, emergency-response, teleoperation] image: https://images.unsplash.com/photo-1581092160562-40aa08e78837?w=800 hide_table_of_contents: false +company: + name: Emergency Robotics Inc. + url: https://emergency-robotics.com + logo_url: https://i.pravatar.cc/150?img=12 --- A life-saving Leo Rover modification designed for urban search and rescue operations in hazardous environments where human access is dangerous or impossible. - +{/* truncate */} ## Mission Critical Design diff --git a/communityProjects/underwater-exploration-rover.mdx b/communityProjects/underwater-exploration-rover.mdx index e185cdd6..b949640a 100644 --- a/communityProjects/underwater-exploration-rover.mdx +++ b/communityProjects/underwater-exploration-rover.mdx @@ -13,11 +13,15 @@ authors: tags: [leo-rover, marine-biology, underwater, research, waterproof] image: https://images.unsplash.com/photo-1583212292454-1fe6229603b7?w=800 hide_table_of_contents: false +company: + name: Marine Science Institute + url: https://marine-science-institute.org + logo_url: https://i.pravatar.cc/150?img=9 --- A groundbreaking waterproof modification of Leo Rover for amphibious operations in intertidal zones and shallow coastal waters up to 3 meters depth. - +{/* truncate */} ## Breaking New Ground in Marine Robotics diff --git a/src/components/communityProjects/BlogPostCard/index.tsx b/src/components/communityProjects/BlogPostCard/index.tsx index 1f4aaf61..682926e7 100644 --- a/src/components/communityProjects/BlogPostCard/index.tsx +++ b/src/components/communityProjects/BlogPostCard/index.tsx @@ -5,9 +5,20 @@ import BlogPostItemContainer from '@theme/BlogPostItem/Container'; import type {Props} from '@theme/BlogPostItem'; import styles from './styles.module.css'; import Link from '@docusaurus/Link'; +import { PropBlogPostMetadata } from '@docusaurus/plugin-content-blog'; + +interface communityProjectMetadata extends Omit { + frontMatter: PropBlogPostMetadata['frontMatter'] & { + company?: { + name?: string; + logo_url?: string; + url?: string; + }; + }; +} export default function BlogPostCard({children, className}: Props): ReactNode { - const {metadata} = useBlogPost(); + const {metadata} = useBlogPost() as {metadata: communityProjectMetadata}; return ( )} +
+ { metadata.frontMatter.company && metadata.frontMatter.company.name && metadata.frontMatter.company.url && ( + + {metadata.frontMatter.company.logo_url && ( + {metadata.frontMatter.company.name} + )} + {metadata.frontMatter.company.name} + + )} +
diff --git a/src/components/communityProjects/BlogPostCard/styles.module.css b/src/components/communityProjects/BlogPostCard/styles.module.css index 57b50bf7..c35f7dfb 100644 --- a/src/components/communityProjects/BlogPostCard/styles.module.css +++ b/src/components/communityProjects/BlogPostCard/styles.module.css @@ -94,3 +94,39 @@ background-color: var(--ifm-color-emphasis-300); color: var(--ifm-color-emphasis-900); } + +.cardCompanyContainer { + margin-top: 1rem; + padding-top: 1rem; + border-top: 1px solid var(--ifm-color-emphasis-200); +} + +.cardCompany { + display: flex; + align-items: center; + gap: 0.75rem; + text-decoration: none; + color: var(--ifm-color-primary); + font-size: 0.9rem; + font-weight: 500; + transition: opacity 0.2s ease; +} + +.cardCompany:hover { + opacity: 0.8; + text-decoration: none; +} + +.cardCompanyLogo { + width: 32px; + height: 32px; + border-radius: 4px; + object-fit: cover; + background-color: var(--ifm-color-emphasis-200); +} + +.cardCompanyName { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} From a63639fd768b5f0d9d650df6840728c484e2da77 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 23 Jan 2026 16:07:19 +0100 Subject: [PATCH 09/35] Add tags.yml --- communityProjects/tags.yml | 9 +++++++++ docusaurus.config.ts | 2 ++ 2 files changed, 11 insertions(+) create mode 100644 communityProjects/tags.yml diff --git a/communityProjects/tags.yml b/communityProjects/tags.yml new file mode 100644 index 00000000..72fc74b8 --- /dev/null +++ b/communityProjects/tags.yml @@ -0,0 +1,9 @@ +leo-rover: + label: Leo Rover + description: Projects related to the Leo Rover robotic platform. + permalink: '/leo-rover' + +raph-rover: + label: Raph Rover + description: Projects related to the Raph Rover robotic platform. + permalink: '/raph-rover' \ No newline at end of file diff --git a/docusaurus.config.ts b/docusaurus.config.ts index d3861ce6..afb67b69 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -105,6 +105,8 @@ const config: Config = { blogSidebarCount: 0, feedOptions: { type: null }, blogListComponent: '@site/src/components/communityProjects/BlogListPage', + onInlineTags: 'warn', + onInlineAuthors: 'ignore' }, theme: { customCss: './src/css/custom.css', From e700a4dc15bbfe3045c78cc6afe024672e6687d7 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Mon, 26 Jan 2026 14:16:45 +0100 Subject: [PATCH 10/35] Card layout adjustments --- .../communityProjects/BlogPostCard/index.tsx | 54 ++++++++-------- .../BlogPostCard/styles.module.css | 61 ++++++------------- 2 files changed, 43 insertions(+), 72 deletions(-) diff --git a/src/components/communityProjects/BlogPostCard/index.tsx b/src/components/communityProjects/BlogPostCard/index.tsx index 682926e7..b58eccad 100644 --- a/src/components/communityProjects/BlogPostCard/index.tsx +++ b/src/components/communityProjects/BlogPostCard/index.tsx @@ -1,13 +1,14 @@ -import React, {type ReactNode} from 'react'; +import { type ReactNode } from 'react'; import clsx from 'clsx'; -import {useBlogPost} from '@docusaurus/plugin-content-blog/client'; +import { useBlogPost } from '@docusaurus/plugin-content-blog/client'; import BlogPostItemContainer from '@theme/BlogPostItem/Container'; -import type {Props} from '@theme/BlogPostItem'; +import type { Props } from '@theme/BlogPostItem'; import styles from './styles.module.css'; import Link from '@docusaurus/Link'; import { PropBlogPostMetadata } from '@docusaurus/plugin-content-blog'; -interface communityProjectMetadata extends Omit { +interface communityProjectMetadata + extends Omit { frontMatter: PropBlogPostMetadata['frontMatter'] & { company?: { name?: string; @@ -17,13 +18,14 @@ interface communityProjectMetadata extends Omit + {metadata.frontMatter.image && (
@@ -35,6 +37,21 @@ export default function BlogPostCard({children, className}: Props): ReactNode { {metadata.description && (

{children}

)} +
+ {metadata.frontMatter.company && + metadata.frontMatter.company.name && + (metadata.frontMatter.company.logo_url ? ( + {metadata.frontMatter.company.name} + ) : ( + + {metadata.frontMatter.company.name} + + ))} +
{metadata.tags && metadata.tags.length > 0 && (
{metadata.tags.slice(0, 3).map((tag) => ( @@ -44,25 +61,6 @@ export default function BlogPostCard({children, className}: Props): ReactNode { ))}
)} -
- { metadata.frontMatter.company && metadata.frontMatter.company.name && metadata.frontMatter.company.url && ( - - {metadata.frontMatter.company.logo_url && ( - {metadata.frontMatter.company.name} - )} - {metadata.frontMatter.company.name} - - )} -
diff --git a/src/components/communityProjects/BlogPostCard/styles.module.css b/src/components/communityProjects/BlogPostCard/styles.module.css index c35f7dfb..c5e06f2c 100644 --- a/src/components/communityProjects/BlogPostCard/styles.module.css +++ b/src/components/communityProjects/BlogPostCard/styles.module.css @@ -1,6 +1,7 @@ .compactCard { height: 100%; transition: transform 0.2s ease, box-shadow 0.2s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .compactCard:hover { @@ -9,9 +10,6 @@ } .cardLink { - display: flex; - flex-direction: column; - height: 100%; text-decoration: none; color: inherit; overflow: hidden; @@ -41,10 +39,7 @@ } .cardContent { - padding: 1.5rem; - flex: 1; - display: flex; - flex-direction: column; + padding: 1rem; } .cardTitle { @@ -61,7 +56,6 @@ } .cardDescription { - flex: 1; font-size: 0.9rem; color: var(--ifm-color-emphasis-700); line-height: 1.6; @@ -71,62 +65,41 @@ line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; - max-height: 69.14px; } .cardTags { display: flex; flex-wrap: wrap; gap: 0.5rem; - margin-top: auto; -} - -.cardTag { - font-size: 0.75rem; - padding: 0.25rem 0.75rem; - background-color: var(--ifm-color-emphasis-200); - color: var(--ifm-color-emphasis-800); - border-radius: 12px; - font-weight: 500; -} - -[data-theme='dark'] .cardTag { - background-color: var(--ifm-color-emphasis-300); - color: var(--ifm-color-emphasis-900); -} - -.cardCompanyContainer { margin-top: 1rem; padding-top: 1rem; border-top: 1px solid var(--ifm-color-emphasis-200); } -.cardCompany { - display: flex; - align-items: center; - gap: 0.75rem; - text-decoration: none; - color: var(--ifm-color-primary); - font-size: 0.9rem; +.cardTag { + font-size: 0.7rem; + padding: 0.25rem 0.75rem; + background-color: var(--ifm-color-primary); + color: var(--ifm-color-emphasis-900); + border-radius: 12px; font-weight: 500; - transition: opacity 0.2s ease; -} - -.cardCompany:hover { - opacity: 0.8; - text-decoration: none; } .cardCompanyLogo { - width: 32px; - height: 32px; + width: 100%; + height: 100px; border-radius: 4px; - object-fit: cover; - background-color: var(--ifm-color-emphasis-200); + object-fit: contain; } .cardCompanyName { + display: block; + width: 100%; + font-size: 1rem; + font-weight: 600; + color: var(--ifm-color-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + text-align: center; } From 5edb73823a4660624483d1bfad7d9f7bfc188e9e Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 13:33:17 +0100 Subject: [PATCH 11/35] Add hook for getting community project metadata --- src/hooks/useCommunityProject/index.tsx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/hooks/useCommunityProject/index.tsx diff --git a/src/hooks/useCommunityProject/index.tsx b/src/hooks/useCommunityProject/index.tsx new file mode 100644 index 00000000..43d9bb3f --- /dev/null +++ b/src/hooks/useCommunityProject/index.tsx @@ -0,0 +1,21 @@ +import { PropBlogPostMetadata } from '@docusaurus/plugin-content-blog'; +import { useBlogPost } from '@docusaurus/plugin-content-blog/lib/client/contexts.js'; + +interface communityProjectMetadata + extends Omit { + frontMatter: PropBlogPostMetadata['frontMatter'] & { + company?: { + name?: string; + logo_url?: string; + url?: string; + }; + }; +} + +export default function useCommunityProject() { + const blogPost = useBlogPost(); + return { + ...blogPost, + metadata: blogPost.metadata as communityProjectMetadata + }; +} \ No newline at end of file From 22633ec8f5c0d91b4d90fb8799f44910881e8a50 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 13:33:54 +0100 Subject: [PATCH 12/35] Modify blog post page to include company logo --- docusaurus.config.ts | 4 +- .../communityProjects/BlogPostCard/index.tsx | 16 +---- .../BlogPostItem/Header/index.tsx | 27 +++++++ .../BlogPostItem/Header/styles.module.css | 20 ++++++ .../communityProjects/BlogPostItem/index.tsx | 25 +++++++ .../communityProjects/BlogPostPage/index.tsx | 72 +++++++++++++++++++ 6 files changed, 149 insertions(+), 15 deletions(-) create mode 100644 src/components/communityProjects/BlogPostItem/Header/index.tsx create mode 100644 src/components/communityProjects/BlogPostItem/Header/styles.module.css create mode 100644 src/components/communityProjects/BlogPostItem/index.tsx create mode 100644 src/components/communityProjects/BlogPostPage/index.tsx diff --git a/docusaurus.config.ts b/docusaurus.config.ts index afb67b69..270c71bc 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -105,8 +105,10 @@ const config: Config = { blogSidebarCount: 0, feedOptions: { type: null }, blogListComponent: '@site/src/components/communityProjects/BlogListPage', + blogPostComponent: '@site/src/components/communityProjects/BlogPostPage', onInlineTags: 'warn', - onInlineAuthors: 'ignore' + onInlineAuthors: 'ignore', + showReadingTime: false, }, theme: { customCss: './src/css/custom.css', diff --git a/src/components/communityProjects/BlogPostCard/index.tsx b/src/components/communityProjects/BlogPostCard/index.tsx index b58eccad..39ec30a8 100644 --- a/src/components/communityProjects/BlogPostCard/index.tsx +++ b/src/components/communityProjects/BlogPostCard/index.tsx @@ -1,28 +1,16 @@ import { type ReactNode } from 'react'; import clsx from 'clsx'; -import { useBlogPost } from '@docusaurus/plugin-content-blog/client'; import BlogPostItemContainer from '@theme/BlogPostItem/Container'; import type { Props } from '@theme/BlogPostItem'; import styles from './styles.module.css'; import Link from '@docusaurus/Link'; -import { PropBlogPostMetadata } from '@docusaurus/plugin-content-blog'; - -interface communityProjectMetadata - extends Omit { - frontMatter: PropBlogPostMetadata['frontMatter'] & { - company?: { - name?: string; - logo_url?: string; - url?: string; - }; - }; -} +import useCommunityProject from '@site/src/hooks/useCommunityProject'; export default function BlogPostCard({ children, className, }: Props): ReactNode { - const { metadata } = useBlogPost() as { metadata: communityProjectMetadata }; + const { metadata } = useCommunityProject(); return ( diff --git a/src/components/communityProjects/BlogPostItem/Header/index.tsx b/src/components/communityProjects/BlogPostItem/Header/index.tsx new file mode 100644 index 00000000..9adc11a7 --- /dev/null +++ b/src/components/communityProjects/BlogPostItem/Header/index.tsx @@ -0,0 +1,27 @@ +import React, { type ReactNode } from 'react'; +import BlogPostItemHeaderTitle from '@theme/BlogPostItem/Header/Title'; +import BlogPostItemHeaderInfo from '@theme/BlogPostItem/Header/Info'; +import BlogPostItemHeaderAuthors from '@theme/BlogPostItem/Header/Authors'; +import styles from './styles.module.css'; +import useCommunityProject from '@site/src/hooks/useCommunityProject'; + +export default function BlogPostItemHeader(): ReactNode { + const { metadata } = useCommunityProject(); + const { frontMatter } = metadata; + return ( +
+ + +
+
+ +
+ {frontMatter.company?.name +
+
+ ); +} diff --git a/src/components/communityProjects/BlogPostItem/Header/styles.module.css b/src/components/communityProjects/BlogPostItem/Header/styles.module.css new file mode 100644 index 00000000..5310e0d0 --- /dev/null +++ b/src/components/communityProjects/BlogPostItem/Header/styles.module.css @@ -0,0 +1,20 @@ +.authorsContainer { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + gap: 2rem; +} + +.authorsInfo { + flex-shrink: 1; + width: 60%; +} + +.companyLogo { + width: 40%; + height: 100%; + max-height: 100px; + object-fit: contain; + object-position: right; +} \ No newline at end of file diff --git a/src/components/communityProjects/BlogPostItem/index.tsx b/src/components/communityProjects/BlogPostItem/index.tsx new file mode 100644 index 00000000..36f24b86 --- /dev/null +++ b/src/components/communityProjects/BlogPostItem/index.tsx @@ -0,0 +1,25 @@ +import React, {type ReactNode} from 'react'; +import clsx from 'clsx'; +import {useBlogPost} from '@docusaurus/plugin-content-blog/client'; +import BlogPostItemContainer from '@theme/BlogPostItem/Container'; +import BlogPostItemHeader from '@site/src/components/communityProjects/BlogPostItem/Header'; +import BlogPostItemContent from '@theme/BlogPostItem/Content'; +import BlogPostItemFooter from '@theme/BlogPostItem/Footer'; +import type {Props} from '@theme/BlogPostItem'; + +// apply a bottom margin in list view +function useContainerClassName() { + const {isBlogPostPage} = useBlogPost(); + return !isBlogPostPage ? 'margin-bottom--xl' : undefined; +} + +export default function BlogPostItem({children, className}: Props): ReactNode { + const containerClassName = useContainerClassName(); + return ( + + + {children} + + + ); +} diff --git a/src/components/communityProjects/BlogPostPage/index.tsx b/src/components/communityProjects/BlogPostPage/index.tsx new file mode 100644 index 00000000..22acb61d --- /dev/null +++ b/src/components/communityProjects/BlogPostPage/index.tsx @@ -0,0 +1,72 @@ +import React, {type ReactNode} from 'react'; +import clsx from 'clsx'; +import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common'; +import { + BlogPostProvider, + useBlogPost, +} from '@docusaurus/plugin-content-blog/client'; +import BlogLayout from '@theme/BlogLayout'; +import BlogPostItem from '@site/src/components/communityProjects/BlogPostItem'; +import BlogPostPaginator from '@theme/BlogPostPaginator'; +import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata'; +import BlogPostPageStructuredData from '@theme/BlogPostPage/StructuredData'; +import TOC from '@theme/TOC'; +import ContentVisibility from '@theme/ContentVisibility'; +import type {Props} from '@theme/BlogPostPage'; +import type {BlogSidebar} from '@docusaurus/plugin-content-blog'; + +function BlogPostPageContent({ + sidebar, + children, +}: { + sidebar: BlogSidebar; + children: ReactNode; +}): ReactNode { + const {metadata, toc} = useBlogPost(); + const {nextItem, prevItem, frontMatter} = metadata; + const { + hide_table_of_contents: hideTableOfContents, + toc_min_heading_level: tocMinHeadingLevel, + toc_max_heading_level: tocMaxHeadingLevel, + } = frontMatter; + return ( + 0 ? ( + + ) : undefined + }> + + + {children} + + {(nextItem || prevItem) && ( + + )} + + ); +} + +export default function BlogPostPage(props: Props): ReactNode { + const BlogPostContent = props.content; + return ( + + + + + + + + + + ); +} From ce87a135149788e736f5847e4deecee52198300f Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 13:35:13 +0100 Subject: [PATCH 13/35] Add tags comments --- communityProjects/tags.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/communityProjects/tags.yml b/communityProjects/tags.yml index 72fc74b8..74b0f59c 100644 --- a/communityProjects/tags.yml +++ b/communityProjects/tags.yml @@ -1,3 +1,5 @@ +# Robotic plaform related tags + leo-rover: label: Leo Rover description: Projects related to the Leo Rover robotic platform. @@ -6,4 +8,8 @@ leo-rover: raph-rover: label: Raph Rover description: Projects related to the Raph Rover robotic platform. - permalink: '/raph-rover' \ No newline at end of file + permalink: '/raph-rover' + +# Application area tags + +# TBD \ No newline at end of file From 3c20d28260849adcd6724ca66431a8929db10eeb Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 15:39:25 +0100 Subject: [PATCH 14/35] Add tutorial how to add community project --- docs/guidelines/addCommunityProject.mdx | 182 ++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 docs/guidelines/addCommunityProject.mdx diff --git a/docs/guidelines/addCommunityProject.mdx b/docs/guidelines/addCommunityProject.mdx new file mode 100644 index 00000000..3e991273 --- /dev/null +++ b/docs/guidelines/addCommunityProject.mdx @@ -0,0 +1,182 @@ +--- +title: How to add a community project +sidebar_label: Adding a community project +sidebar_position: 4 +unlisted: true +description: >- + This page provides guidelines on how to add a community project to the + Fictionlab documentation. +--- + +This page provides guidelines on how to add a community project to the +Fictionlab documentation. Community projects are third-party projects developed +by the Fictionlab community that enhance or extend the functionality of +Fictionlab products like Leo or Raph rover. + +Community project list is located in the +[Community Projects](/community-projects) page. + +:::note + +Before adding a community project, ensure that it meets the following criteria: + +- The project is based on Fictionlab products or integrates with them. + +Fictionlab can remove any community project at any time without prior notice if +it not meets the guidelines or is deemed inappropriate. + +::: + +## Before you begin + +Before adding a community project, check +[documentation repository](https://github.com/fictionlab/docs) to check how to +start adding new content. If you are not familiar with using GitHub and +Markdown/MDX files, please refer to the following resources: + +- [GitHub Docs - Getting started with GitHub](https://docs.github.com/en/get-started/quickstart) +- [Markdown Guide - Getting started with Markdown](https://www.markdownguide.org/getting-started/) +- [Docusaurus Docs - Markdown Features](https://docusaurus.io/docs/markdown-features) + +### Custom Fictionlab's components + +Fictionlab documentation uses custom React components to enhance the content +and provide additional functionality. To see a list of available components, +visit the +[Components](/guidelines/components) page. + +## Creating a community project page + +To add a community project to the Fictionlab documentation, create a new MDX +file in the `docs/community-projects` directory of this repository. Each +community project should have its own MDX file named after the project (e.g., +`my-community-project.mdx`). + +### Front matter + +Each community project page should include the front matter data at the top of +the MDX file. It allows proper indexing and display of the project on the +Community Projects page. + +:::tip + +Some of the fields requires providing image_url or logo_url. All images should +be placed in the `/static/img/communityProjects` directory of this repository. + +::: + +```yml +--- +title: My Community Project +description: A brief description of my community project, up to 160 characters. +authors: + - name: Author Name + title: Author Title + url: https://author-website.com + image_url: /path/to/author-image.jpg + socials: + x: author_x_handle + github: author_github_handle + linkedin: author_linkedin_handle + email: author_email_address +tags: [tag1, tag2, tag3] +image: /path/to/project-image.jpg +company: + name: Company Name + url: https://company-website.com + logo_url: /path/to/company-logo.jpg +--- +``` + +#### Front matter fields description + +- `title`: The title of the community project (max 100 characters). +- `description`: A brief description of the community project (max 160 + characters). +- `tags`: A list of tags relevant to the project (e.g., leo-rover). Please note + that only tags mentioned in the + [Community projects tags](/community-projects/tags) page should be used. +- `image`: The URL or path of the image representing the community project. It + will be displayed on the Community Projects page. +- `authors`: A list of authors who contributed to the project. It is possible to + add multiple authors by adding more entries to the list. Each author entry + should include the following fields: + - `name`: The author's name. + - `title`: The author's title or role. + - `url`: The URL to the author's personal or professional website. + - `image_url`: The URL or path to the author's image. + - `socials`: A list of social media handles for the author (e.g., x, github, + linkedin, email). +- `company`: Information about the company or organization associated with the + project, including: + - `name`: The company's name. + - `url`: The URL to the company's website. + - `logo_url`: The URL or path to the company's logo image. + +:::tip + +Check existing community project pages in the `docs/community-projects` +directory for examples of how to structure the front matter and content. + +::: + +### Content structure + +#### Summary + +After the front matter, provide a short summary of the community project. This +section should give an overview of the project's purpose and main features. It +should have around 300-400 characters. + +#### Truncate tag + +To control the length of the project preview on the Community Projects page, use +the `{/* truncate */}` tag after the summary. Content after this tag will not be +displayed in the preview. + +#### Main content + +In this section provide detailed information about the community project. You +can structure this section using headings, subheadings, lists, images, and code +snippets as needed. We do not enforce a specific structure for this section. + +#### Resources + +As final step, you can provide links to additional resources related to the +community project, such as: + +- GitHub repository +- Documentation +- Tutorials +- Videos +- Blog posts + +and any other relevant materials. + +## Submitting the community project + +:::info + +Test your MDX file locally using Docusaurus to ensure that it renders correctly +before submitting it as a pull request. Instructions for setting up a local +Docusaurus environment can be found in the +[Testing implemented changes](https://github.com/fictionlab/docs?tab=readme-ov-file#testing-implemented-changes) +section of the documentation repository's README. + +::: + +Once you have created the MDX file for your community project, submit it as a +pull request to the Fictionlab documentation repository. Ensure that your pull +request includes the new MDX file in the `docs/community-projects` directory. + +:::note + +Fictionlab team will review the submitted community project to ensure it meets +the guidelines and quality standards. They may request changes or additional +information before approving the pull request. + +::: + +After the pull request is reviewed and approved, your community project will be +added to the Fictionlab documentation and will appear on the Community Projects +page. From 06ae204464a0a9b068c46b7e3cc23fa18a53cbf0 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 15:44:57 +0100 Subject: [PATCH 15/35] Add license --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..6b71cfcc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Fictionlab sp. z o.o. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file From f30816aa6d25f05e9059f443610f606b7566c6f8 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 15:45:16 +0100 Subject: [PATCH 16/35] Update copyright year in LICENSE file to 2026 --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 6b71cfcc..723da48a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 Fictionlab sp. z o.o. +Copyright (c) 2026 Fictionlab sp. z o.o. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From d2877fa350e2c954273003ba90cf46dd478ac8f1 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 15:51:00 +0100 Subject: [PATCH 17/35] Add license notice --- docs/guidelines/addCommunityProject.mdx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/guidelines/addCommunityProject.mdx b/docs/guidelines/addCommunityProject.mdx index 3e991273..fd5d5eea 100644 --- a/docs/guidelines/addCommunityProject.mdx +++ b/docs/guidelines/addCommunityProject.mdx @@ -40,10 +40,9 @@ Markdown/MDX files, please refer to the following resources: ### Custom Fictionlab's components -Fictionlab documentation uses custom React components to enhance the content -and provide additional functionality. To see a list of available components, -visit the -[Components](/guidelines/components) page. +Fictionlab documentation uses custom React components to enhance the content and +provide additional functionality. To see a list of available components, visit +the [Components](/guidelines/components) page. ## Creating a community project page @@ -180,3 +179,9 @@ information before approving the pull request. After the pull request is reviewed and approved, your community project will be added to the Fictionlab documentation and will appear on the Community Projects page. + +## License Information + +All committed changes will be licensed under the terms specified in the LICENSE +file added to the repository. Please ensure that your contributions comply with +this license. From f77fb671baceae26d9eb26048674852cb0540392 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 15:51:21 +0100 Subject: [PATCH 18/35] Reformat --- .../autonomous-agriculture-robot.mdx | 25 ++++++-- communityProjects/mining-inspection-robot.mdx | 52 ++++++++++++--- communityProjects/museum-tour-guide-robot.mdx | 63 ++++++++++++++++--- communityProjects/search-rescue-robot.mdx | 43 +++++++++---- .../underwater-exploration-rover.mdx | 25 +++++++- docusaurus.config.ts | 8 ++- .../communityProjects/BlogListPage/index.tsx | 15 ++--- .../BlogPostCard/styles.module.css | 4 +- .../BlogPostItem/Header/styles.module.css | 2 +- .../communityProjects/BlogPostItem/index.tsx | 13 ++-- .../communityProjects/BlogPostItems/index.tsx | 9 +-- .../BlogPostItems/styles.module.css | 9 ++- .../communityProjects/BlogPostPage/index.tsx | 21 ++++--- src/hooks/useCommunityProject/index.tsx | 4 +- 14 files changed, 224 insertions(+), 69 deletions(-) diff --git a/communityProjects/autonomous-agriculture-robot.mdx b/communityProjects/autonomous-agriculture-robot.mdx index 28bf9d6d..8d9ef914 100644 --- a/communityProjects/autonomous-agriculture-robot.mdx +++ b/communityProjects/autonomous-agriculture-robot.mdx @@ -1,6 +1,9 @@ --- title: Autonomous Agriculture Monitoring System -description: Leo Rover adapted for precision agriculture, featuring autonomous navigation, crop health monitoring, and real-time data collection in vineyard environments. +description: + Leo Rover adapted for precision agriculture, featuring autonomous navigation, + crop health monitoring, and real-time data collection in vineyard + environments. slug: autonomous-agriculture-monitoring authors: - name: Dr. Maria Santos @@ -19,27 +22,35 @@ company: logo_url: https://i.pravatar.cc/150?img=5 --- -An innovative Leo Rover-based system for autonomous crop monitoring in vineyards, utilizing advanced sensors and AI for precision agriculture. +An innovative Leo Rover-based system for autonomous crop monitoring in +vineyards, utilizing advanced sensors and AI for precision agriculture. {/* truncate */} ## Project Overview -Our team at AgriTech University has successfully adapted the Leo Rover platform to create an autonomous agricultural monitoring system. The robot navigates independently through vineyard rows, collecting crucial data about crop health, soil conditions, and environmental parameters. +Our team at AgriTech University has successfully adapted the Leo Rover platform +to create an autonomous agricultural monitoring system. The robot navigates +independently through vineyard rows, collecting crucial data about crop health, +soil conditions, and environmental parameters. ## Key Features ### Autonomous Navigation -- **GPS-RTK Integration**: Centimeter-level positioning accuracy for precise row following + +- **GPS-RTK Integration**: Centimeter-level positioning accuracy for precise row + following - **LiDAR Mapping**: Real-time 3D mapping of vineyard structure and obstacles - **Path Planning**: Intelligent route optimization for complete field coverage ### Crop Health Monitoring + - **Multispectral Camera**: NDVI analysis for early disease detection - **Thermal Imaging**: Identification of water stress in plants - **RGB Vision**: High-resolution photos for visual inspection ### Environmental Sensing + - Soil moisture and temperature sensors - Ambient temperature and humidity monitoring - Light intensity measurements @@ -47,6 +58,7 @@ Our team at AgriTech University has successfully adapted the Leo Rover platform ## Technical Implementation The system runs on ROS Noetic with custom nodes for: + - Sensor data fusion - Autonomous navigation stack - Image processing and analysis @@ -69,6 +81,7 @@ class NDVIProcessor: ## Results After 6 months of field testing: + - **95% navigation accuracy** in complex vineyard terrain - **Early disease detection** up to 2 weeks before visible symptoms - **40% reduction** in manual inspection time @@ -84,6 +97,7 @@ After 6 months of field testing: ## Future Development We're working on: + - Integration with drone systems for comprehensive monitoring - Machine learning models for automatic pest identification - Integration with irrigation systems for automated response @@ -106,4 +120,5 @@ We're working on: ## Contact -For collaboration or questions, reach out to our team at [agritech@ucdavis.edu](mailto:agritech@ucdavis.edu) +For collaboration or questions, reach out to our team at +[agritech@ucdavis.edu](mailto:agritech@ucdavis.edu) diff --git a/communityProjects/mining-inspection-robot.mdx b/communityProjects/mining-inspection-robot.mdx index f1940c21..049debdf 100644 --- a/communityProjects/mining-inspection-robot.mdx +++ b/communityProjects/mining-inspection-robot.mdx @@ -1,6 +1,9 @@ --- title: Underground Mining Inspection Robot -description: Ruggedized Leo Rover for hazardous underground mining inspections, featuring gas detection, structural monitoring, and autonomous tunnel navigation in GPS-denied environments. +description: + Ruggedized Leo Rover for hazardous underground mining inspections, featuring + gas detection, structural monitoring, and autonomous tunnel navigation in + GPS-denied environments. slug: mining-inspection-robot authors: - name: Robert O'Brien @@ -10,7 +13,15 @@ authors: socials: github: robertobrien linkedin: robert-obrien-mining -tags: [leo-rover, mining, safety, inspection, autonomous-navigation, hazardous-environments] +tags: + [ + leo-rover, + mining, + safety, + inspection, + autonomous-navigation, + hazardous-environments, + ] image: https://images.unsplash.com/photo-1586864387634-bfc711ba7724?w=800 hide_table_of_contents: false company: @@ -19,29 +30,37 @@ company: logo_url: https://i.pravatar.cc/150?img=33 --- -A heavily modified Leo Rover designed for autonomous inspections in underground mines, reducing human exposure to hazardous conditions while improving safety monitoring and operational efficiency. +A heavily modified Leo Rover designed for autonomous inspections in underground +mines, reducing human exposure to hazardous conditions while improving safety +monitoring and operational efficiency. {/* truncate */} ## Transforming Mining Safety -Underground mining remains one of the world's most dangerous occupations. Our team at SafeMine Robotics has developed a Leo Rover-based solution that automates dangerous inspection tasks, protecting miners while improving inspection frequency and quality. +Underground mining remains one of the world's most dangerous occupations. Our +team at SafeMine Robotics has developed a Leo Rover-based solution that +automates dangerous inspection tasks, protecting miners while improving +inspection frequency and quality. ## Critical Safety Features ### Hazardous Gas Detection + - **Multi-Gas Sensor Array**: Simultaneous monitoring of CH₄, CO, CO₂, H₂S, O₂ - **Real-Time Alerts**: Immediate notification of dangerous concentrations - **Data Logging**: Continuous environmental monitoring records - **Trend Analysis**: Predictive warnings of degrading air quality ### Structural Monitoring + - **3D LiDAR Mapping**: Detection of roof falls and structural changes - **Thermal Imaging**: Identification of hot spots (fire risk, equipment issues) - **Acoustic Sensors**: Detection of cracking sounds indicating instability - **Vibration Analysis**: Ground stability assessment ### Explosion-Proof Design + - **ATEX Certification**: Compliant with explosive atmosphere regulations - **Intrinsically Safe**: All electrical components rated for hazardous areas - **No Spark Guarantee**: Protected motor enclosures @@ -50,22 +69,23 @@ Underground mining remains one of the world's most dangerous occupations. Our te ## Autonomous Navigation in Darkness ### GPS-Denied Environment Solutions + ```python class UndergroundNavigator: def __init__(self): self.slam = LiDAR_SLAM() self.imu = InertialMeasurementUnit() self.odometry = WheelOdometry() - + def localize(self): """Sensor fusion for accurate positioning""" lidar_pose = self.slam.get_pose() imu_data = self.imu.get_orientation() wheel_data = self.odometry.get_displacement() - + # Kalman filter fusion return self.fuse_sensors(lidar_pose, imu_data, wheel_data) - + def navigate_tunnel(self, target): """Follow tunnel while avoiding obstacles""" tunnel_center = self.detect_tunnel_walls() @@ -73,6 +93,7 @@ class UndergroundNavigator: ``` ### Navigation Capabilities + - **SLAM-Based Mapping**: Creates accurate 3D maps without GPS - **Tunnel Following**: Autonomous navigation through winding tunnels - **Obstacle Avoidance**: Detection and avoidance of equipment, rails, debris @@ -82,6 +103,7 @@ class UndergroundNavigator: ## Inspection Workflows ### Daily Routine Inspections + **Automated Schedule**: Robot performs inspections during off-shift hours 1. **Pre-Shift Inspection** (60 minutes before shift) @@ -101,6 +123,7 @@ class UndergroundNavigator: - Gas dissipation confirmation ### Incident Response + - **Emergency Deployment**: Rapid assessment of accident sites - **Search Operations**: Thermal imaging for locating personnel - **Hazard Mapping**: Identifies safe routes for rescue teams @@ -114,6 +137,7 @@ class UndergroundNavigator: **Deployment**: 3 Leo mining robots, 18-month trial **Results**: + - **Roof Falls Detected Early**: 12 incidents prevented by early warnings - **Zero Inspector Injuries**: 100% reduction in inspection-related accidents - **Inspection Frequency**: Increased from weekly to daily @@ -126,6 +150,7 @@ class UndergroundNavigator: **Deployment**: Heat-resistant Leo variant **Achievements**: + - Operated continuously for 6 months in extreme heat - Detected ventilation system failure before human exposure - Reduced human exposure to heat by 80% @@ -134,6 +159,7 @@ class UndergroundNavigator: ## Ruggedization Upgrades ### Environmental Protection + - **Temperature Range**: -10°C to +55°C operation - **Humidity**: 10-95% RH, fully sealed - **Dust Protection**: IP68 rating, sealed electronics @@ -141,6 +167,7 @@ class UndergroundNavigator: - **Impact Resistance**: Survives rock falls up to 5kg from 2m ### Mechanical Enhancements + - **Reinforced Frame**: Heavy-duty aluminum alloy - **Track Option**: Interchangeable with wheels for loose material - **Extended Ground Clearance**: 15cm vs standard 10cm @@ -148,6 +175,7 @@ class UndergroundNavigator: - **Modular Design**: Field-replaceable components ### Power System + - **Extended Battery**: 12-hour continuous operation - **Hot-Swap Capability**: Battery change without shutdown - **Charge Stations**: Automated docking and charging @@ -156,6 +184,7 @@ class UndergroundNavigator: ## Communication Systems ### Underground Challenges + - **Through-Earth Radio**: Penetrates rock layers - **WiFi Mesh Network**: Self-healing network of repeaters - **Fiber Optic Tether**: Optional for ultra-reliable control @@ -163,6 +192,7 @@ class UndergroundNavigator: - **LoRa Backup**: Long-range fallback communication ### Data Management + - **Edge Processing**: Real-time analysis on robot - **Cloud Sync**: Automatic upload when connection available - **Local Storage**: 1TB for offline operation @@ -171,6 +201,7 @@ class UndergroundNavigator: ## Operational Advantages ### For Mine Operators + - Continuous monitoring vs periodic human inspections - Quantifiable risk reduction - Detailed documentation for regulatory compliance @@ -178,12 +209,14 @@ class UndergroundNavigator: - Lower insurance premiums ### For Miners + - Reduced exposure to hazardous areas - Confidence from continuous safety monitoring - More information about work environment - Emergency response capability ### For Regulators + - Objective, documented inspection data - Increased inspection frequency - Standardized reporting @@ -192,11 +225,13 @@ class UndergroundNavigator: ## Training and Deployment ### Operator Training (3-day course) + - Day 1: System overview and safety - Day 2: Robot operation and mission planning - Day 3: Maintenance and troubleshooting ### Mine-Specific Setup + - Site survey and planning: 1 week - Infrastructure installation: 2 weeks - System testing and tuning: 1 week @@ -206,11 +241,13 @@ class UndergroundNavigator: ## Return on Investment ### Typical Mine (500 employees) + - **Initial Investment**: $75,000 per robot (2-3 robots recommended) - **Annual Operating Cost**: $15,000 per robot - **Payback Period**: 12-18 months **Savings Sources**: + - Reduced accidents: $200,000+/year - Lower insurance: $50,000/year - Increased productivity: $150,000/year @@ -219,6 +256,7 @@ class UndergroundNavigator: ## Regulatory Compliance **Certifications**: + - MSHA (Mine Safety and Health Administration) approved - ATEX Zone 0 and 1 certified - IECEx compliant diff --git a/communityProjects/museum-tour-guide-robot.mdx b/communityProjects/museum-tour-guide-robot.mdx index a9aad90f..5675b606 100644 --- a/communityProjects/museum-tour-guide-robot.mdx +++ b/communityProjects/museum-tour-guide-robot.mdx @@ -1,6 +1,9 @@ --- title: Interactive Museum Tour Guide Robot -description: Leo Rover transformed into an engaging, autonomous museum guide with voice interaction, multilingual support, and AR-enhanced exhibits for visitor education. +description: + Leo Rover transformed into an engaging, autonomous museum guide with voice + interaction, multilingual support, and AR-enhanced exhibits for visitor + education. slug: museum-tour-guide-robot authors: - name: Sophie Laurent @@ -10,7 +13,14 @@ authors: socials: github: sophielaurent linkedin: sophie-laurent-hri -tags: [leo-rover, education, human-robot-interaction, voice-recognition, indoor-navigation] +tags: + [ + leo-rover, + education, + human-robot-interaction, + voice-recognition, + indoor-navigation, + ] image: https://images.unsplash.com/photo-1566127992631-137a642a90f4?w=800 hide_table_of_contents: false company: @@ -19,29 +29,37 @@ company: logo_url: https://i.pravatar.cc/150?img=20 --- -An autonomous Leo Rover that serves as an interactive museum tour guide, engaging visitors with stories, answering questions, and enhancing exhibitions with augmented reality content. +An autonomous Leo Rover that serves as an interactive museum tour guide, +engaging visitors with stories, answering questions, and enhancing exhibitions +with augmented reality content. {/* truncate */} ## Bringing Exhibits to Life -Museums are embracing technology to create more engaging visitor experiences. Our team at the Museum Innovation Lab developed "RoboGuide" - a Leo Rover-based tour guide that combines autonomous navigation, natural language interaction, and augmented reality to transform museum visits. +Museums are embracing technology to create more engaging visitor experiences. +Our team at the Museum Innovation Lab developed "RoboGuide" - a Leo Rover-based +tour guide that combines autonomous navigation, natural language interaction, +and augmented reality to transform museum visits. ## Visitor Experience ### Interactive Tours + - **Voice Interaction**: Natural conversations in 12 languages - **Personalized Routes**: Tours adapted to visitor interests and time available - **Story Telling**: Engaging narratives about exhibits with historical context - **Q&A Capability**: Answers to visitor questions using GPT-4 integration ### Augmented Reality Features + - **Tablet Display**: 10" screen showing AR overlays - **3D Reconstructions**: See artifacts as they looked originally - **Historical Scenes**: Visualize historical events in the actual location - **Interactive Games**: Educational activities for children ### Accessibility Features + - **Multilingual Support**: 12 languages including sign language interpretation - **Height-Adjustable Display**: Accessible for wheelchair users and children - **Audio Descriptions**: Enhanced descriptions for visually impaired visitors @@ -50,30 +68,34 @@ Museums are embracing technology to create more engaging visitor experiences. Ou ## Technical Implementation ### Navigation System + ```python class MuseumNavigator: def __init__(self): self.map = self.load_museum_map() self.exhibits = self.load_exhibit_database() - + def plan_tour(self, visitor_preferences, duration): """Generate optimal tour based on interests and time""" exhibit_priorities = self.rank_exhibits(visitor_preferences) route = self.optimize_path(exhibit_priorities, duration) return self.create_tour_schedule(route) - + def avoid_visitors(self): """Dynamic obstacle avoidance for crowded spaces""" # LiDAR-based pedestrian detection and avoidance ``` ### AI-Powered Interaction + - **Speech Recognition**: Google Speech API with custom museum vocabulary -- **Natural Language Understanding**: Intent classification and entity extraction +- **Natural Language Understanding**: Intent classification and entity + extraction - **Response Generation**: Context-aware answers with personality - **Emotion Recognition**: Camera-based visitor engagement detection ### Safety Systems + - **Collision Avoidance**: 360° LiDAR protection zone - **Emergency Stop**: Physical button and remote kill switch - **Speed Limiting**: Automatically slows in crowded areas @@ -82,49 +104,60 @@ class MuseumNavigator: ## Deployment Case Studies ### National History Museum (London) + **Deployment Period**: 6 months **Visitors Served**: 15,000+ **Results**: + - 92% visitor satisfaction rate - Average tour duration: 45 minutes - 78% of visitors said the robot enhanced their experience - 25% increase in young adult visitors (18-35) ### Science Museum (Boston) + **Special Feature**: Interactive science demonstrations **Highlights**: + - Robot demonstrates simple physics experiments - Synchronized with exhibit displays - 500+ school groups participated - Teachers reported 40% higher student engagement ### Art Gallery (Tokyo) + **Unique Adaptation**: Minimalist aesthetic design **Features**: + - Silent mode in contemplative gallery spaces - Art history storytelling with emotional narratives - Coordination with 3 robots for large groups ## Visitor Feedback -> "My kids were completely mesmerized! They learned so much more than with a traditional audio guide. The AR reconstructions were amazing!" +> "My kids were completely mesmerized! They learned so much more than with a +> traditional audio guide. The AR reconstructions were amazing!" > — Sarah M., Parent -> "As a wheelchair user, I appreciated that the robot automatically adjusted its display height and moved at my pace. Very thoughtful design." +> "As a wheelchair user, I appreciated that the robot automatically adjusted its +> display height and moved at my pace. Very thoughtful design." > — David K., Visitor -> "We've seen a significant increase in repeat visitors since introducing RoboGuide. People specifically come back to experience new tours." +> "We've seen a significant increase in repeat visitors since introducing +> RoboGuide. People specifically come back to experience new tours." > — Museum Director, Natural History Museum ## Hardware Components ### Base Platform + - Leo Rover (modified for indoor use) - Quieter motors for museum environment - Wider wheelbase for stability - Custom decorative panels (museum-themed) ### Added Components + - **Display System**: 10" touchscreen tablet on adjustable arm - **Speaker Array**: Directional speakers for focused audio - **Lighting**: Soft LED strips (museum-friendly) @@ -132,6 +165,7 @@ class MuseumNavigator: - **Branding**: Customizable panels for museum identity ### Software Stack + - ROS Noetic for robot control - Custom navigation package for indoor environments - Web-based admin interface for museum staff @@ -140,6 +174,7 @@ class MuseumNavigator: ## Customization Options Museums can customize: + - **Tour Content**: Easy-to-update exhibit database - **Voice Personality**: Choose tone and speaking style - **Appearance**: Custom wraps and decorations @@ -149,12 +184,15 @@ Museums can customize: ## Business Model & ROI ### Cost Breakdown + - Initial Setup: $15,000-20,000 per robot - Annual Maintenance: $2,000 - Software Updates: Included in support package ### Revenue Impact + Museums report: + - 15-30% increase in ticket sales - Higher visitor engagement scores - Positive media coverage and social media buzz @@ -163,12 +201,14 @@ Museums report: ## Educational Impact ### School Programs + - Aligned with curriculum standards - Teacher control panels for guided tours - Student activity sheets generated by robot - Post-visit digital resources ### Learning Outcomes + - 65% better information retention vs audio guides - Higher engagement with complex topics - Improved student enthusiasm for museum visits @@ -176,12 +216,14 @@ Museums report: ## Future Developments **In Progress**: + - Multi-robot coordination for larger museums - VR headset integration for immersive experiences - Gesture control interface - Visitor tracking and analytics (privacy-compliant) **Planned**: + - Outdoor garden/sculpture garden capability - Live expert video calls through the robot - Community upload of personal stories related to exhibits @@ -206,6 +248,7 @@ Museums report: ## Get RoboGuide for Your Museum We offer: + - Complete turnkey solution - Custom development for special exhibits - Training for museum staff diff --git a/communityProjects/search-rescue-robot.mdx b/communityProjects/search-rescue-robot.mdx index 63aec3bd..dedc69fa 100644 --- a/communityProjects/search-rescue-robot.mdx +++ b/communityProjects/search-rescue-robot.mdx @@ -1,6 +1,9 @@ --- title: Search and Rescue Robot with Thermal Imaging -description: Modified Leo Rover for urban search and rescue operations, equipped with thermal cameras, gas sensors, and real-time communication systems for emergency response teams. +description: + Modified Leo Rover for urban search and rescue operations, equipped with + thermal cameras, gas sensors, and real-time communication systems for + emergency response teams. slug: search-rescue-thermal-robot authors: - name: James Chen @@ -10,7 +13,8 @@ authors: socials: github: jameschen linkedin: james-chen-robotics -tags: [leo-rover, search-rescue, thermal-imaging, emergency-response, teleoperation] +tags: + [leo-rover, search-rescue, thermal-imaging, emergency-response, teleoperation] image: https://images.unsplash.com/photo-1581092160562-40aa08e78837?w=800 hide_table_of_contents: false company: @@ -19,29 +23,37 @@ company: logo_url: https://i.pravatar.cc/150?img=12 --- -A life-saving Leo Rover modification designed for urban search and rescue operations in hazardous environments where human access is dangerous or impossible. +A life-saving Leo Rover modification designed for urban search and rescue +operations in hazardous environments where human access is dangerous or +impossible. {/* truncate */} ## Mission Critical Design -When disaster strikes, every second counts. Our team at Emergency Robotics Inc. has transformed the Leo Rover into a robust search and rescue platform capable of navigating through rubble, detecting survivors, and assessing hazardous conditions in real-time. +When disaster strikes, every second counts. Our team at Emergency Robotics Inc. +has transformed the Leo Rover into a robust search and rescue platform capable +of navigating through rubble, detecting survivors, and assessing hazardous +conditions in real-time. ## Core Capabilities ### Survivor Detection + - **FLIR Thermal Camera**: Detection of body heat signatures through obstacles - **Acoustic Sensors**: Detection of sounds and calls for help - **CO2 Sensors**: Identification of breathing patterns in confined spaces - **Two-way Audio**: Communication with trapped survivors ### Hazard Assessment + - **Gas Detection Suite**: CO, CO2, methane, and other dangerous gases - **Radiation Sensor**: Nuclear hazard identification - **Structural Stability Analysis**: Vibration sensors for collapse risk - **Air Quality Monitoring**: Oxygen levels and particulate matter ### Enhanced Mobility + - **Reinforced Chassis**: Withstands impacts and rough terrain - **Upgraded Motors**: 50% more torque for climbing rubble - **Flexible Tracks Option**: Interchangeable with wheels for different terrains @@ -53,17 +65,23 @@ When disaster strikes, every second counts. Our team at Emergency Robotics Inc. During a warehouse collapse in Portland, our Leo SAR unit was deployed: -1. **Initial Assessment** (5 minutes): Robot entered through a 60cm gap, mapped the interior with LiDAR -2. **Survivor Location** (15 minutes): Thermal imaging detected 3 heat signatures +1. **Initial Assessment** (5 minutes): Robot entered through a 60cm gap, mapped + the interior with LiDAR +2. **Survivor Location** (15 minutes): Thermal imaging detected 3 heat + signatures 3. **Communication** (20 minutes): Established audio contact with survivors -4. **Hazard Report** (25 minutes): Detected elevated CO levels, guiding rescue strategy -5. **Extraction Support** (2 hours): Provided continuous monitoring during rescue operations +4. **Hazard Report** (25 minutes): Detected elevated CO levels, guiding rescue + strategy +5. **Extraction Support** (2 hours): Provided continuous monitoring during + rescue operations -**Result**: All 3 survivors safely rescued. Robot operations significantly reduced risk to rescue personnel. +**Result**: All 3 survivors safely rescued. Robot operations significantly +reduced risk to rescue personnel. ## Technical Architecture ### Control System + ```python # Emergency Response Control Node class SARController: @@ -71,7 +89,7 @@ class SARController: self.thermal_feed = ThermalProcessor() self.gas_sensors = GasSensorArray() self.audio_system = BidirectionalAudio() - + def detect_survivors(self): thermal_data = self.thermal_feed.get_hotspots() audio_data = self.audio_system.listen() @@ -79,6 +97,7 @@ class SARController: ``` ### Communication + - **4G LTE Backup**: Redundant connectivity in disaster zones - **Mesh Network**: Ad-hoc networking with other robots - **Satellite Uplink**: Operation in areas with no infrastructure @@ -95,6 +114,7 @@ class SARController: ## Training and Certification We provide comprehensive training for emergency response teams: + - 2-day operator certification course - Simulator-based training scenarios - Field exercises with local fire departments @@ -126,4 +146,5 @@ We provide comprehensive training for emergency response teams: ## Get Involved -Emergency response organizations interested in deploying this technology can contact us at [info@emergency-robotics.com](mailto:info@emergency-robotics.com) +Emergency response organizations interested in deploying this technology can +contact us at [info@emergency-robotics.com](mailto:info@emergency-robotics.com) diff --git a/communityProjects/underwater-exploration-rover.mdx b/communityProjects/underwater-exploration-rover.mdx index b949640a..73fdb2f1 100644 --- a/communityProjects/underwater-exploration-rover.mdx +++ b/communityProjects/underwater-exploration-rover.mdx @@ -1,6 +1,9 @@ --- title: Amphibious Leo Rover for Coastal Research -description: Waterproof Leo Rover modification capable of shallow water exploration, intertidal zone research, and underwater photography for marine biology studies. +description: + Waterproof Leo Rover modification capable of shallow water exploration, + intertidal zone research, and underwater photography for marine biology + studies. slug: amphibious-coastal-research-rover authors: - name: Dr. Elena Kowalski @@ -19,23 +22,29 @@ company: logo_url: https://i.pravatar.cc/150?img=9 --- -A groundbreaking waterproof modification of Leo Rover for amphibious operations in intertidal zones and shallow coastal waters up to 3 meters depth. +A groundbreaking waterproof modification of Leo Rover for amphibious operations +in intertidal zones and shallow coastal waters up to 3 meters depth. {/* truncate */} ## Breaking New Ground in Marine Robotics -Traditional underwater ROVs are expensive and complex. Land-based rovers can't access coastal zones. Our team at the Marine Science Institute developed an amphibious Leo Rover that bridges this gap, enabling affordable research in critical intertidal ecosystems. +Traditional underwater ROVs are expensive and complex. Land-based rovers can't +access coastal zones. Our team at the Marine Science Institute developed an +amphibious Leo Rover that bridges this gap, enabling affordable research in +critical intertidal ecosystems. ## Amphibious Capabilities ### Waterproofing Design + - **Complete IP68 Sealing**: Submersible up to 3 meters - **Pressure-Compensated Enclosures**: All electronic components protected - **Corrosion-Resistant Materials**: Marine-grade aluminum and stainless steel - **Hydrophobic Coatings**: Enhanced water shedding on electronics ### Propulsion System + - **Hybrid Wheels**: Function on land and as paddles in water - **Buoyancy Control**: Adjustable foam floats for neutral buoyancy - **Thruster Assist**: Optional water jets for strong currents @@ -44,6 +53,7 @@ Traditional underwater ROVs are expensive and complex. Land-based rovers can't a ## Research Applications ### Intertidal Zone Monitoring + Our rover excels in studying the area between high and low tide marks: - **Time-lapse Photography**: Automated photo sequences during tide cycles @@ -52,12 +62,14 @@ Our rover excels in studying the area between high and low tide marks: - **Temperature Gradients**: Water and substrate temperature logging ### Underwater Surveys + - High-resolution underwater photography - Video documentation of fish populations - Coral reef health assessment (shallow reefs) - Pollution and debris monitoring ### Beach and Coastal Studies + - Sand erosion measurement - Turtle nesting site monitoring (non-invasive) - Beach cleanup assistance (debris identification) @@ -66,6 +78,7 @@ Our rover excels in studying the area between high and low tide marks: ## Technical Specifications ### Sensors and Cameras + ```yaml Primary Camera: - 4K underwater camera with color correction @@ -87,6 +100,7 @@ Navigation: ``` ### Power Management + - **Main Battery**: 8-hour operation (mixed land/water) - **Emergency Backup**: 2-hour reserve power - **Solar Panel**: 50W charging during surface operations @@ -121,6 +135,7 @@ Automated monitoring of 50 tide pools over 6-month period: ## Community Impact This project has democratized marine research: + - **Educational Programs**: 15 schools using rovers for student projects - **Citizen Science**: Local communities monitoring their coastlines - **Conservation**: Direct impact on 3 marine protected area designations @@ -130,6 +145,7 @@ This project has democratized marine research: We've open-sourced all designs and software: ### Bill of Materials + - Base Leo Rover platform - Custom waterproof enclosures (3D printable or machined) - Marine-grade connectors and cables @@ -137,7 +153,9 @@ We've open-sourced all designs and software: - Estimated cost: $8,000-12,000 ### Assembly Guide + Complete step-by-step instructions available in our repository, including: + - CAD files for all custom parts - Wiring diagrams - Waterproofing procedures @@ -163,6 +181,7 @@ Complete step-by-step instructions available in our repository, including: ## Collaborate With Us We're seeking partnerships with: + - Other marine research institutions - Conservation organizations - Educational institutions diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 270c71bc..aaa0e866 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -104,8 +104,10 @@ const config: Config = { routeBasePath: '/community-projects', blogSidebarCount: 0, feedOptions: { type: null }, - blogListComponent: '@site/src/components/communityProjects/BlogListPage', - blogPostComponent: '@site/src/components/communityProjects/BlogPostPage', + blogListComponent: + '@site/src/components/communityProjects/BlogListPage', + blogPostComponent: + '@site/src/components/communityProjects/BlogPostPage', onInlineTags: 'warn', onInlineAuthors: 'ignore', showReadingTime: false, @@ -182,7 +184,7 @@ const config: Config = { to: '/integrations', }, { - label: "Community Projects", + label: 'Community Projects', position: 'left', to: '/community-projects', }, diff --git a/src/components/communityProjects/BlogListPage/index.tsx b/src/components/communityProjects/BlogListPage/index.tsx index 9368331b..7dbd5aa8 100644 --- a/src/components/communityProjects/BlogListPage/index.tsx +++ b/src/components/communityProjects/BlogListPage/index.tsx @@ -1,4 +1,4 @@ -import React, {type ReactNode} from 'react'; +import React, { type ReactNode } from 'react'; import clsx from 'clsx'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; @@ -9,17 +9,17 @@ import { } from '@docusaurus/theme-common'; import BlogListPaginator from '@theme/BlogListPaginator'; import SearchMetadata from '@theme/SearchMetadata'; -import type {Props} from '@theme/BlogListPage'; +import type { Props } from '@theme/BlogListPage'; import BlogPostItems from '@site/src/components/communityProjects/BlogPostItems'; import BlogListPageStructuredData from '@theme/BlogListPage/StructuredData'; import Layout from '@theme/Layout'; function BlogListPageMetadata(props: Props): ReactNode { - const {metadata} = props; + const { metadata } = props; const { - siteConfig: {title: siteTitle}, + siteConfig: { title: siteTitle }, } = useDocusaurusContext(); - const {blogDescription, blogTitle, permalink} = metadata; + const { blogDescription, blogTitle, permalink } = metadata; const isBlogOnlyMode = permalink === '/'; const title = isBlogOnlyMode ? siteTitle : blogTitle; return ( @@ -31,7 +31,7 @@ function BlogListPageMetadata(props: Props): ReactNode { } function BlogListPageContent(props: Props): ReactNode { - const {metadata, items} = props; + const { metadata, items } = props; return (
@@ -48,7 +48,8 @@ export default function BlogListPage(props: Props): ReactNode { className={clsx( ThemeClassNames.wrapper.blogPages, ThemeClassNames.page.blogListPage, - )}> + )} + > diff --git a/src/components/communityProjects/BlogPostCard/styles.module.css b/src/components/communityProjects/BlogPostCard/styles.module.css index c5e06f2c..ab74100c 100644 --- a/src/components/communityProjects/BlogPostCard/styles.module.css +++ b/src/components/communityProjects/BlogPostCard/styles.module.css @@ -1,6 +1,8 @@ .compactCard { height: 100%; - transition: transform 0.2s ease, box-shadow 0.2s ease; + transition: + transform 0.2s ease, + box-shadow 0.2s ease; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } diff --git a/src/components/communityProjects/BlogPostItem/Header/styles.module.css b/src/components/communityProjects/BlogPostItem/Header/styles.module.css index 5310e0d0..ee2d05d0 100644 --- a/src/components/communityProjects/BlogPostItem/Header/styles.module.css +++ b/src/components/communityProjects/BlogPostItem/Header/styles.module.css @@ -17,4 +17,4 @@ max-height: 100px; object-fit: contain; object-position: right; -} \ No newline at end of file +} diff --git a/src/components/communityProjects/BlogPostItem/index.tsx b/src/components/communityProjects/BlogPostItem/index.tsx index 36f24b86..3b4f1406 100644 --- a/src/components/communityProjects/BlogPostItem/index.tsx +++ b/src/components/communityProjects/BlogPostItem/index.tsx @@ -1,19 +1,22 @@ -import React, {type ReactNode} from 'react'; +import React, { type ReactNode } from 'react'; import clsx from 'clsx'; -import {useBlogPost} from '@docusaurus/plugin-content-blog/client'; +import { useBlogPost } from '@docusaurus/plugin-content-blog/client'; import BlogPostItemContainer from '@theme/BlogPostItem/Container'; import BlogPostItemHeader from '@site/src/components/communityProjects/BlogPostItem/Header'; import BlogPostItemContent from '@theme/BlogPostItem/Content'; import BlogPostItemFooter from '@theme/BlogPostItem/Footer'; -import type {Props} from '@theme/BlogPostItem'; +import type { Props } from '@theme/BlogPostItem'; // apply a bottom margin in list view function useContainerClassName() { - const {isBlogPostPage} = useBlogPost(); + const { isBlogPostPage } = useBlogPost(); return !isBlogPostPage ? 'margin-bottom--xl' : undefined; } -export default function BlogPostItem({children, className}: Props): ReactNode { +export default function BlogPostItem({ + children, + className, +}: Props): ReactNode { const containerClassName = useContainerClassName(); return ( diff --git a/src/components/communityProjects/BlogPostItems/index.tsx b/src/components/communityProjects/BlogPostItems/index.tsx index 03109959..36a0002f 100644 --- a/src/components/communityProjects/BlogPostItems/index.tsx +++ b/src/components/communityProjects/BlogPostItems/index.tsx @@ -1,6 +1,6 @@ -import {BlogPostProvider} from '@docusaurus/plugin-content-blog/client'; +import { BlogPostProvider } from '@docusaurus/plugin-content-blog/client'; import BlogPostItem from '@theme/BlogPostItem'; -import type {Props} from '@theme/BlogPostItems'; +import type { Props } from '@theme/BlogPostItems'; import styles from './styles.module.css'; import { ReactNode } from 'react'; import BlogPostCard from '@site/src/components/communityProjects/BlogPostCard'; @@ -11,10 +11,11 @@ export default function BlogPostItems({ }: Props): ReactNode { return (
- {items.map(({content: BlogPostContent}) => ( + {items.map(({ content: BlogPostContent }) => ( + content={BlogPostContent} + >
diff --git a/src/components/communityProjects/BlogPostItems/styles.module.css b/src/components/communityProjects/BlogPostItems/styles.module.css index 2c61ae42..808e60b9 100644 --- a/src/components/communityProjects/BlogPostItems/styles.module.css +++ b/src/components/communityProjects/BlogPostItems/styles.module.css @@ -42,8 +42,13 @@ border: 1px solid var(--ifm-color-emphasis-300); border-radius: 8px; overflow: hidden; - transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; - background-color: var(--ifm-card-background-color, var(--ifm-background-surface-color)); + transition: + transform 0.2s ease-in-out, + box-shadow 0.2s ease-in-out; + background-color: var( + --ifm-card-background-color, + var(--ifm-background-surface-color) + ); } .blogPostCard:hover { diff --git a/src/components/communityProjects/BlogPostPage/index.tsx b/src/components/communityProjects/BlogPostPage/index.tsx index 22acb61d..6928e4b9 100644 --- a/src/components/communityProjects/BlogPostPage/index.tsx +++ b/src/components/communityProjects/BlogPostPage/index.tsx @@ -1,6 +1,9 @@ -import React, {type ReactNode} from 'react'; +import React, { type ReactNode } from 'react'; import clsx from 'clsx'; -import {HtmlClassNameProvider, ThemeClassNames} from '@docusaurus/theme-common'; +import { + HtmlClassNameProvider, + ThemeClassNames, +} from '@docusaurus/theme-common'; import { BlogPostProvider, useBlogPost, @@ -12,8 +15,8 @@ import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata'; import BlogPostPageStructuredData from '@theme/BlogPostPage/StructuredData'; import TOC from '@theme/TOC'; import ContentVisibility from '@theme/ContentVisibility'; -import type {Props} from '@theme/BlogPostPage'; -import type {BlogSidebar} from '@docusaurus/plugin-content-blog'; +import type { Props } from '@theme/BlogPostPage'; +import type { BlogSidebar } from '@docusaurus/plugin-content-blog'; function BlogPostPageContent({ sidebar, @@ -22,8 +25,8 @@ function BlogPostPageContent({ sidebar: BlogSidebar; children: ReactNode; }): ReactNode { - const {metadata, toc} = useBlogPost(); - const {nextItem, prevItem, frontMatter} = metadata; + const { metadata, toc } = useBlogPost(); + const { nextItem, prevItem, frontMatter } = metadata; const { hide_table_of_contents: hideTableOfContents, toc_min_heading_level: tocMinHeadingLevel, @@ -40,7 +43,8 @@ function BlogPostPageContent({ maxHeadingLevel={tocMaxHeadingLevel} /> ) : undefined - }> + } + > {children} @@ -60,7 +64,8 @@ export default function BlogPostPage(props: Props): ReactNode { className={clsx( ThemeClassNames.wrapper.blogPages, ThemeClassNames.page.blogPostPage, - )}> + )} + > diff --git a/src/hooks/useCommunityProject/index.tsx b/src/hooks/useCommunityProject/index.tsx index 43d9bb3f..64110ec6 100644 --- a/src/hooks/useCommunityProject/index.tsx +++ b/src/hooks/useCommunityProject/index.tsx @@ -16,6 +16,6 @@ export default function useCommunityProject() { const blogPost = useBlogPost(); return { ...blogPost, - metadata: blogPost.metadata as communityProjectMetadata + metadata: blogPost.metadata as communityProjectMetadata, }; -} \ No newline at end of file +} From 19f18ee167c18c023f60f46ee105dbb95d4c317c Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 15:59:59 +0100 Subject: [PATCH 19/35] Add scripts to check community project frontmatter --- package.json | 2 +- .../community-projects-frontmatter-check.js | 44 +++++++++++++++++++ ...ter-check.js => docs-frontmatter-check.js} | 2 +- 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 scripts/community-projects-frontmatter-check.js rename scripts/{frontmatter-check.js => docs-frontmatter-check.js} (95%) diff --git a/package.json b/package.json index 0af034a4..dfd0106f 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "check:formatting": "prettier --check \"**/*.{js,jsx,ts,tsx,mdx,css}\"", "check:spelling": "cspell", "check:redirects": "node scripts/redirects-check.js", - "check:frontmatter": "node scripts/frontmatter-check.js", + "check:frontmatter": "node scripts/docs-frontmatter-check.js && node scripts/community-projects-frontmatter-check.js", "check:types": "tsc --noEmit", "check": "yarn check:formatting && yarn check:spelling && yarn check:redirects && yarn check:frontmatter && yarn check:types" }, diff --git a/scripts/community-projects-frontmatter-check.js b/scripts/community-projects-frontmatter-check.js new file mode 100644 index 00000000..244f845b --- /dev/null +++ b/scripts/community-projects-frontmatter-check.js @@ -0,0 +1,44 @@ +const fs = require('fs'); +const path = require('path'); +const glob = require('glob'); +const matter = require('gray-matter'); + +// Define the keys that must be present in the front matter. +const REQUIRED_KEYS = [ + 'title', + 'description', + 'slug', + 'authors', + 'tags', + 'image', + 'company', +]; + +// Path to your MDX files for community projects. +const DOCS_PATHS = ['docs/communityProjects/**/*.mdx']; + +function validateFrontMatter() { + const filePaths = DOCS_PATHS.flatMap((pattern) => glob.sync(pattern)); + const errors = []; + + filePaths.forEach((filePath) => { + const fileContent = fs.readFileSync(filePath, 'utf8'); + const { data } = matter(fileContent); + + // Check for required keys + REQUIRED_KEYS.forEach((key) => { + if (!data[key]) { + errors.push(`Missing key '${key}' in ${filePath}`); + } + }); + }); + + if (errors.length > 0) { + console.error('Validation Errors:'); + errors.forEach((error) => console.error(error)); + } else { + console.log('All community project files have valid front matter.'); + } +} + +validateFrontMatter(); \ No newline at end of file diff --git a/scripts/frontmatter-check.js b/scripts/docs-frontmatter-check.js similarity index 95% rename from scripts/frontmatter-check.js rename to scripts/docs-frontmatter-check.js index 1310981d..e82c848f 100644 --- a/scripts/frontmatter-check.js +++ b/scripts/docs-frontmatter-check.js @@ -57,7 +57,7 @@ function validateFrontMatter() { // Exit with a non-zero exit code to fail the CI job. process.exit(1); } else { - console.log('All MDX files have the required front matter keys.'); + console.log('All docs files have the required front matter keys.'); } } From 4d62d25651097aa84d8b20c8f1ee0045a45d6bdc Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 16:05:08 +0100 Subject: [PATCH 20/35] Remove AI files (except one) --- .../autonomous-agriculture-robot.mdx | 4 +- communityProjects/mining-inspection-robot.mdx | 301 ------------------ communityProjects/museum-tour-guide-robot.mdx | 258 --------------- communityProjects/search-rescue-robot.mdx | 150 --------- .../underwater-exploration-rover.mdx | 190 ----------- 5 files changed, 3 insertions(+), 900 deletions(-) delete mode 100644 communityProjects/mining-inspection-robot.mdx delete mode 100644 communityProjects/museum-tour-guide-robot.mdx delete mode 100644 communityProjects/search-rescue-robot.mdx delete mode 100644 communityProjects/underwater-exploration-rover.mdx diff --git a/communityProjects/autonomous-agriculture-robot.mdx b/communityProjects/autonomous-agriculture-robot.mdx index 8d9ef914..ddbcf70f 100644 --- a/communityProjects/autonomous-agriculture-robot.mdx +++ b/communityProjects/autonomous-agriculture-robot.mdx @@ -1,5 +1,5 @@ --- -title: Autonomous Agriculture Monitoring System +title: Autonomous Agriculture Monitoring System (test file) description: Leo Rover adapted for precision agriculture, featuring autonomous navigation, crop health monitoring, and real-time data collection in vineyard @@ -22,6 +22,8 @@ company: logo_url: https://i.pravatar.cc/150?img=5 --- +THIS IS A TEST FILE FOR COMMUNITY PROJECTS REMOVE BEFORE MERGING + An innovative Leo Rover-based system for autonomous crop monitoring in vineyards, utilizing advanced sensors and AI for precision agriculture. diff --git a/communityProjects/mining-inspection-robot.mdx b/communityProjects/mining-inspection-robot.mdx deleted file mode 100644 index 049debdf..00000000 --- a/communityProjects/mining-inspection-robot.mdx +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: Underground Mining Inspection Robot -description: - Ruggedized Leo Rover for hazardous underground mining inspections, featuring - gas detection, structural monitoring, and autonomous tunnel navigation in - GPS-denied environments. -slug: mining-inspection-robot -authors: - - name: Robert O'Brien - title: Mining Safety Engineer - url: https://github.com/robertobrien - image_url: https://i.pravatar.cc/150?img=33 - socials: - github: robertobrien - linkedin: robert-obrien-mining -tags: - [ - leo-rover, - mining, - safety, - inspection, - autonomous-navigation, - hazardous-environments, - ] -image: https://images.unsplash.com/photo-1586864387634-bfc711ba7724?w=800 -hide_table_of_contents: false -company: - name: SafeMine Robotics - url: https://safemine-robotics.com - logo_url: https://i.pravatar.cc/150?img=33 ---- - -A heavily modified Leo Rover designed for autonomous inspections in underground -mines, reducing human exposure to hazardous conditions while improving safety -monitoring and operational efficiency. - -{/* truncate */} - -## Transforming Mining Safety - -Underground mining remains one of the world's most dangerous occupations. Our -team at SafeMine Robotics has developed a Leo Rover-based solution that -automates dangerous inspection tasks, protecting miners while improving -inspection frequency and quality. - -## Critical Safety Features - -### Hazardous Gas Detection - -- **Multi-Gas Sensor Array**: Simultaneous monitoring of CH₄, CO, CO₂, H₂S, O₂ -- **Real-Time Alerts**: Immediate notification of dangerous concentrations -- **Data Logging**: Continuous environmental monitoring records -- **Trend Analysis**: Predictive warnings of degrading air quality - -### Structural Monitoring - -- **3D LiDAR Mapping**: Detection of roof falls and structural changes -- **Thermal Imaging**: Identification of hot spots (fire risk, equipment issues) -- **Acoustic Sensors**: Detection of cracking sounds indicating instability -- **Vibration Analysis**: Ground stability assessment - -### Explosion-Proof Design - -- **ATEX Certification**: Compliant with explosive atmosphere regulations -- **Intrinsically Safe**: All electrical components rated for hazardous areas -- **No Spark Guarantee**: Protected motor enclosures -- **Static Discharge**: Grounding chains and anti-static materials - -## Autonomous Navigation in Darkness - -### GPS-Denied Environment Solutions - -```python -class UndergroundNavigator: - def __init__(self): - self.slam = LiDAR_SLAM() - self.imu = InertialMeasurementUnit() - self.odometry = WheelOdometry() - - def localize(self): - """Sensor fusion for accurate positioning""" - lidar_pose = self.slam.get_pose() - imu_data = self.imu.get_orientation() - wheel_data = self.odometry.get_displacement() - - # Kalman filter fusion - return self.fuse_sensors(lidar_pose, imu_data, wheel_data) - - def navigate_tunnel(self, target): - """Follow tunnel while avoiding obstacles""" - tunnel_center = self.detect_tunnel_walls() - return self.calculate_safe_path(tunnel_center, target) -``` - -### Navigation Capabilities - -- **SLAM-Based Mapping**: Creates accurate 3D maps without GPS -- **Tunnel Following**: Autonomous navigation through winding tunnels -- **Obstacle Avoidance**: Detection and avoidance of equipment, rails, debris -- **Auto-Return**: Finds way back to start point automatically -- **Multi-Floor**: Handles ramps and elevation changes - -## Inspection Workflows - -### Daily Routine Inspections - -**Automated Schedule**: Robot performs inspections during off-shift hours - -1. **Pre-Shift Inspection** (60 minutes before shift) - - Gas level verification in all work areas - - Equipment status check - - Roof and wall integrity scan - - Report delivered to shift supervisor - -2. **Mid-Shift Check** (every 4 hours) - - Ventilation system verification - - Gas accumulation monitoring - - Temperature checks - -3. **Post-Blast Inspection** (after explosives use) - - Safe area verification before human entry - - Blast damage assessment - - Gas dissipation confirmation - -### Incident Response - -- **Emergency Deployment**: Rapid assessment of accident sites -- **Search Operations**: Thermal imaging for locating personnel -- **Hazard Mapping**: Identifies safe routes for rescue teams -- **Continuous Monitoring**: Real-time data during rescue operations - -## Real-World Impact - -### Case Study: Coal Mine, West Virginia - -**Challenge**: Aging mine with increasing roof fall incidents -**Deployment**: 3 Leo mining robots, 18-month trial - -**Results**: - -- **Roof Falls Detected Early**: 12 incidents prevented by early warnings -- **Zero Inspector Injuries**: 100% reduction in inspection-related accidents -- **Inspection Frequency**: Increased from weekly to daily -- **Cost Savings**: $450,000 in prevented accidents and downtime -- **Regulatory Compliance**: 100% inspection documentation - -### Case Study: Gold Mine, Nevada - -**Challenge**: Deep underground work in hot conditions (45°C+) -**Deployment**: Heat-resistant Leo variant - -**Achievements**: - -- Operated continuously for 6 months in extreme heat -- Detected ventilation system failure before human exposure -- Reduced human exposure to heat by 80% -- Mapped previously unexplored tunnels safely - -## Ruggedization Upgrades - -### Environmental Protection - -- **Temperature Range**: -10°C to +55°C operation -- **Humidity**: 10-95% RH, fully sealed -- **Dust Protection**: IP68 rating, sealed electronics -- **Water Resistance**: Handles wet conditions, drainage pumps -- **Impact Resistance**: Survives rock falls up to 5kg from 2m - -### Mechanical Enhancements - -- **Reinforced Frame**: Heavy-duty aluminum alloy -- **Track Option**: Interchangeable with wheels for loose material -- **Extended Ground Clearance**: 15cm vs standard 10cm -- **Bumper Guards**: 360° collision protection -- **Modular Design**: Field-replaceable components - -### Power System - -- **Extended Battery**: 12-hour continuous operation -- **Hot-Swap Capability**: Battery change without shutdown -- **Charge Stations**: Automated docking and charging -- **Power Management**: Optimized for long-distance travel - -## Communication Systems - -### Underground Challenges - -- **Through-Earth Radio**: Penetrates rock layers -- **WiFi Mesh Network**: Self-healing network of repeaters -- **Fiber Optic Tether**: Optional for ultra-reliable control -- **4G/LTE**: Surface-to-underground via booster network -- **LoRa Backup**: Long-range fallback communication - -### Data Management - -- **Edge Processing**: Real-time analysis on robot -- **Cloud Sync**: Automatic upload when connection available -- **Local Storage**: 1TB for offline operation -- **Compressed Video**: Efficient bandwidth usage - -## Operational Advantages - -### For Mine Operators - -- Continuous monitoring vs periodic human inspections -- Quantifiable risk reduction -- Detailed documentation for regulatory compliance -- Predictive maintenance data for equipment -- Lower insurance premiums - -### For Miners - -- Reduced exposure to hazardous areas -- Confidence from continuous safety monitoring -- More information about work environment -- Emergency response capability - -### For Regulators - -- Objective, documented inspection data -- Increased inspection frequency -- Standardized reporting -- Historical data for trend analysis - -## Training and Deployment - -### Operator Training (3-day course) - -- Day 1: System overview and safety -- Day 2: Robot operation and mission planning -- Day 3: Maintenance and troubleshooting - -### Mine-Specific Setup - -- Site survey and planning: 1 week -- Infrastructure installation: 2 weeks -- System testing and tuning: 1 week -- Operator training: 1 week -- Full operational: Month 2 - -## Return on Investment - -### Typical Mine (500 employees) - -- **Initial Investment**: $75,000 per robot (2-3 robots recommended) -- **Annual Operating Cost**: $15,000 per robot -- **Payback Period**: 12-18 months - -**Savings Sources**: - -- Reduced accidents: $200,000+/year -- Lower insurance: $50,000/year -- Increased productivity: $150,000/year -- Regulatory efficiency: $30,000/year - -## Regulatory Compliance - -**Certifications**: - -- MSHA (Mine Safety and Health Administration) approved -- ATEX Zone 0 and 1 certified -- IECEx compliant -- CE marked for European operations -- CSA certified for Canadian mines - -## Project Background - -**Developed by**: SafeMine Robotics Inc. -**Founder & CEO**: Robert O'Brien (25 years mining experience) -**Engineering Team**: 8 robotics engineers, 4 mining safety experts -**Pilot Partners**: 15 mines across 4 countries -**Development**: 3 years R&D, 2 years field testing -**Funding**: Mining industry consortium, venture capital - -## Recognition - -- **Award**: Mining Innovation of the Year 2025 -- **Adoption**: 47 mines globally -- **Safety Record**: 0 accidents in 150,000 operation hours -- **Industry Support**: Endorsed by multiple mining unions - -## Resources - -- [GitHub - Robot Control Software](https://github.com/safemine-robotics/leo-mining-control) -- [GitHub - Navigation Stack](https://github.com/safemine-robotics/underground-navigation) -- [Technical Specifications (PDF)](https://example.com/tech-specs.pdf) -- [Safety Certification Documents](https://example.com/certifications) -- [ROI Calculator Tool](https://safemine.io/roi-calculator) -- [Video: Robot in Action](https://youtube.com/watch?v=example) -- [Case Studies Library](https://safemine.io/case-studies) -- [Training Materials](https://training.safemine.io) - -## Get Started - -**Free Consultation**: We offer complimentary site assessments -**Pilot Program**: 90-day trial deployment available -**Financing Options**: Leasing and rental programs - -Contact us: [info@safemine-robotics.com](mailto:info@safemine-robotics.com) -Phone: +1 (555) 123-4567 -Web: [https://safemine-robotics.com](https://safemine-robotics.com) diff --git a/communityProjects/museum-tour-guide-robot.mdx b/communityProjects/museum-tour-guide-robot.mdx deleted file mode 100644 index 5675b606..00000000 --- a/communityProjects/museum-tour-guide-robot.mdx +++ /dev/null @@ -1,258 +0,0 @@ ---- -title: Interactive Museum Tour Guide Robot -description: - Leo Rover transformed into an engaging, autonomous museum guide with voice - interaction, multilingual support, and AR-enhanced exhibits for visitor - education. -slug: museum-tour-guide-robot -authors: - - name: Sophie Laurent - title: Human-Robot Interaction Designer - url: https://github.com/sophielaurent - image_url: https://i.pravatar.cc/150?img=20 - socials: - github: sophielaurent - linkedin: sophie-laurent-hri -tags: - [ - leo-rover, - education, - human-robot-interaction, - voice-recognition, - indoor-navigation, - ] -image: https://images.unsplash.com/photo-1566127992631-137a642a90f4?w=800 -hide_table_of_contents: false -company: - name: Museum Innovation Lab - url: https://museum-innovation-lab.org - logo_url: https://i.pravatar.cc/150?img=20 ---- - -An autonomous Leo Rover that serves as an interactive museum tour guide, -engaging visitors with stories, answering questions, and enhancing exhibitions -with augmented reality content. - -{/* truncate */} - -## Bringing Exhibits to Life - -Museums are embracing technology to create more engaging visitor experiences. -Our team at the Museum Innovation Lab developed "RoboGuide" - a Leo Rover-based -tour guide that combines autonomous navigation, natural language interaction, -and augmented reality to transform museum visits. - -## Visitor Experience - -### Interactive Tours - -- **Voice Interaction**: Natural conversations in 12 languages -- **Personalized Routes**: Tours adapted to visitor interests and time available -- **Story Telling**: Engaging narratives about exhibits with historical context -- **Q&A Capability**: Answers to visitor questions using GPT-4 integration - -### Augmented Reality Features - -- **Tablet Display**: 10" screen showing AR overlays -- **3D Reconstructions**: See artifacts as they looked originally -- **Historical Scenes**: Visualize historical events in the actual location -- **Interactive Games**: Educational activities for children - -### Accessibility Features - -- **Multilingual Support**: 12 languages including sign language interpretation -- **Height-Adjustable Display**: Accessible for wheelchair users and children -- **Audio Descriptions**: Enhanced descriptions for visually impaired visitors -- **Slow Mode**: Adjusted speed for elderly visitors - -## Technical Implementation - -### Navigation System - -```python -class MuseumNavigator: - def __init__(self): - self.map = self.load_museum_map() - self.exhibits = self.load_exhibit_database() - - def plan_tour(self, visitor_preferences, duration): - """Generate optimal tour based on interests and time""" - exhibit_priorities = self.rank_exhibits(visitor_preferences) - route = self.optimize_path(exhibit_priorities, duration) - return self.create_tour_schedule(route) - - def avoid_visitors(self): - """Dynamic obstacle avoidance for crowded spaces""" - # LiDAR-based pedestrian detection and avoidance -``` - -### AI-Powered Interaction - -- **Speech Recognition**: Google Speech API with custom museum vocabulary -- **Natural Language Understanding**: Intent classification and entity - extraction -- **Response Generation**: Context-aware answers with personality -- **Emotion Recognition**: Camera-based visitor engagement detection - -### Safety Systems - -- **Collision Avoidance**: 360° LiDAR protection zone -- **Emergency Stop**: Physical button and remote kill switch -- **Speed Limiting**: Automatically slows in crowded areas -- **Behavioral Compliance**: Programmed museum etiquette rules - -## Deployment Case Studies - -### National History Museum (London) - -**Deployment Period**: 6 months -**Visitors Served**: 15,000+ -**Results**: - -- 92% visitor satisfaction rate -- Average tour duration: 45 minutes -- 78% of visitors said the robot enhanced their experience -- 25% increase in young adult visitors (18-35) - -### Science Museum (Boston) - -**Special Feature**: Interactive science demonstrations -**Highlights**: - -- Robot demonstrates simple physics experiments -- Synchronized with exhibit displays -- 500+ school groups participated -- Teachers reported 40% higher student engagement - -### Art Gallery (Tokyo) - -**Unique Adaptation**: Minimalist aesthetic design -**Features**: - -- Silent mode in contemplative gallery spaces -- Art history storytelling with emotional narratives -- Coordination with 3 robots for large groups - -## Visitor Feedback - -> "My kids were completely mesmerized! They learned so much more than with a -> traditional audio guide. The AR reconstructions were amazing!" -> — Sarah M., Parent - -> "As a wheelchair user, I appreciated that the robot automatically adjusted its -> display height and moved at my pace. Very thoughtful design." -> — David K., Visitor - -> "We've seen a significant increase in repeat visitors since introducing -> RoboGuide. People specifically come back to experience new tours." -> — Museum Director, Natural History Museum - -## Hardware Components - -### Base Platform - -- Leo Rover (modified for indoor use) -- Quieter motors for museum environment -- Wider wheelbase for stability -- Custom decorative panels (museum-themed) - -### Added Components - -- **Display System**: 10" touchscreen tablet on adjustable arm -- **Speaker Array**: Directional speakers for focused audio -- **Lighting**: Soft LED strips (museum-friendly) -- **Safety Sensors**: Additional ultrasonic sensors at low height -- **Branding**: Customizable panels for museum identity - -### Software Stack - -- ROS Noetic for robot control -- Custom navigation package for indoor environments -- Web-based admin interface for museum staff -- Analytics dashboard for visitor metrics - -## Customization Options - -Museums can customize: - -- **Tour Content**: Easy-to-update exhibit database -- **Voice Personality**: Choose tone and speaking style -- **Appearance**: Custom wraps and decorations -- **Routes**: Define approved paths and restricted areas -- **Scheduling**: Set operating hours and break times - -## Business Model & ROI - -### Cost Breakdown - -- Initial Setup: $15,000-20,000 per robot -- Annual Maintenance: $2,000 -- Software Updates: Included in support package - -### Revenue Impact - -Museums report: - -- 15-30% increase in ticket sales -- Higher visitor engagement scores -- Positive media coverage and social media buzz -- Corporate sponsorship opportunities - -## Educational Impact - -### School Programs - -- Aligned with curriculum standards -- Teacher control panels for guided tours -- Student activity sheets generated by robot -- Post-visit digital resources - -### Learning Outcomes - -- 65% better information retention vs audio guides -- Higher engagement with complex topics -- Improved student enthusiasm for museum visits - -## Future Developments - -**In Progress**: - -- Multi-robot coordination for larger museums -- VR headset integration for immersive experiences -- Gesture control interface -- Visitor tracking and analytics (privacy-compliant) - -**Planned**: - -- Outdoor garden/sculpture garden capability -- Live expert video calls through the robot -- Community upload of personal stories related to exhibits - -## Project Information - -**Created by**: Museum Innovation Lab, MIT Media Lab -**Project Lead**: Sophie Laurent -**Partners**: 12 museums across 6 countries -**Development Duration**: 18 months -**Awards**: Innovation in Cultural Technology 2025 - -## Resources - -- [GitHub - RoboGuide Platform](https://github.com/museum-innovation/roboguide) -- [Documentation for Museums](https://docs.roboguide.io) -- [Tour Content Creation Guide](https://docs.roboguide.io/content-creation) -- [Demo Videos](https://youtube.com/playlist?list=example) -- [Case Study Reports (PDF)](https://example.com/case-studies) -- [API Documentation](https://api.roboguide.io/docs) - -## Get RoboGuide for Your Museum - -We offer: - -- Complete turnkey solution -- Custom development for special exhibits -- Training for museum staff -- Ongoing support and updates - -Contact us: [info@roboguide.io](mailto:info@roboguide.io) -Schedule a demo: [https://roboguide.io/demo](https://roboguide.io/demo) diff --git a/communityProjects/search-rescue-robot.mdx b/communityProjects/search-rescue-robot.mdx deleted file mode 100644 index dedc69fa..00000000 --- a/communityProjects/search-rescue-robot.mdx +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: Search and Rescue Robot with Thermal Imaging -description: - Modified Leo Rover for urban search and rescue operations, equipped with - thermal cameras, gas sensors, and real-time communication systems for - emergency response teams. -slug: search-rescue-thermal-robot -authors: - - name: James Chen - title: Emergency Systems Engineer - url: https://github.com/jameschen - image_url: https://i.pravatar.cc/150?img=12 - socials: - github: jameschen - linkedin: james-chen-robotics -tags: - [leo-rover, search-rescue, thermal-imaging, emergency-response, teleoperation] -image: https://images.unsplash.com/photo-1581092160562-40aa08e78837?w=800 -hide_table_of_contents: false -company: - name: Emergency Robotics Inc. - url: https://emergency-robotics.com - logo_url: https://i.pravatar.cc/150?img=12 ---- - -A life-saving Leo Rover modification designed for urban search and rescue -operations in hazardous environments where human access is dangerous or -impossible. - -{/* truncate */} - -## Mission Critical Design - -When disaster strikes, every second counts. Our team at Emergency Robotics Inc. -has transformed the Leo Rover into a robust search and rescue platform capable -of navigating through rubble, detecting survivors, and assessing hazardous -conditions in real-time. - -## Core Capabilities - -### Survivor Detection - -- **FLIR Thermal Camera**: Detection of body heat signatures through obstacles -- **Acoustic Sensors**: Detection of sounds and calls for help -- **CO2 Sensors**: Identification of breathing patterns in confined spaces -- **Two-way Audio**: Communication with trapped survivors - -### Hazard Assessment - -- **Gas Detection Suite**: CO, CO2, methane, and other dangerous gases -- **Radiation Sensor**: Nuclear hazard identification -- **Structural Stability Analysis**: Vibration sensors for collapse risk -- **Air Quality Monitoring**: Oxygen levels and particulate matter - -### Enhanced Mobility - -- **Reinforced Chassis**: Withstands impacts and rough terrain -- **Upgraded Motors**: 50% more torque for climbing rubble -- **Flexible Tracks Option**: Interchangeable with wheels for different terrains -- **Flipper Arms**: Self-righting mechanism for overturned situations - -## Real-World Deployment - -### Case Study: Warehouse Collapse - September 2025 - -During a warehouse collapse in Portland, our Leo SAR unit was deployed: - -1. **Initial Assessment** (5 minutes): Robot entered through a 60cm gap, mapped - the interior with LiDAR -2. **Survivor Location** (15 minutes): Thermal imaging detected 3 heat - signatures -3. **Communication** (20 minutes): Established audio contact with survivors -4. **Hazard Report** (25 minutes): Detected elevated CO levels, guiding rescue - strategy -5. **Extraction Support** (2 hours): Provided continuous monitoring during - rescue operations - -**Result**: All 3 survivors safely rescued. Robot operations significantly -reduced risk to rescue personnel. - -## Technical Architecture - -### Control System - -```python -# Emergency Response Control Node -class SARController: - def __init__(self): - self.thermal_feed = ThermalProcessor() - self.gas_sensors = GasSensorArray() - self.audio_system = BidirectionalAudio() - - def detect_survivors(self): - thermal_data = self.thermal_feed.get_hotspots() - audio_data = self.audio_system.listen() - return self.fusion_algorithm(thermal_data, audio_data) -``` - -### Communication - -- **4G LTE Backup**: Redundant connectivity in disaster zones -- **Mesh Network**: Ad-hoc networking with other robots -- **Satellite Uplink**: Operation in areas with no infrastructure -- **Low-Latency Video**: Sub-200ms delay for precise control - -## Ruggedness Upgrades - -- IP67 waterproofing for operation in flooded areas -- Temperature range: -20°C to +60°C -- Drop-resistant design (1.5m falls) -- Dust-sealed components for debris-heavy environments -- Emergency power: 6-hour battery life + solar charging - -## Training and Certification - -We provide comprehensive training for emergency response teams: - -- 2-day operator certification course -- Simulator-based training scenarios -- Field exercises with local fire departments -- Maintenance and troubleshooting workshops - -## Impact and Recognition - -- **15 successful deployments** in real emergency situations -- **Adopted by**: 8 fire departments across 5 states -- **Award**: Innovation in Emergency Response Technology 2025 -- **Lives Saved**: Direct contribution to 23 survivor rescues - -## Project Background - -**Developed by**: Emergency Robotics Inc. -**Lead Engineer**: James Chen -**Partners**: National Fire Protection Association, FEMA -**Funding**: DHS Science and Technology Directorate -**Timeline**: 2 years of development and field testing - -## Resources - -- [GitHub - Hardware Modifications](https://github.com/emergency-robotics/leo-sar-hardware) -- [GitHub - Control Software](https://github.com/emergency-robotics/leo-sar-software) -- [Operator Manual (PDF)](https://example.com/sar-manual.pdf) -- [Training Materials](https://example.com/training) -- [Deployment Case Studies](https://example.com/case-studies) -- [Video: Robot in Action](https://youtube.com/watch?v=example) - -## Get Involved - -Emergency response organizations interested in deploying this technology can -contact us at [info@emergency-robotics.com](mailto:info@emergency-robotics.com) diff --git a/communityProjects/underwater-exploration-rover.mdx b/communityProjects/underwater-exploration-rover.mdx deleted file mode 100644 index 73fdb2f1..00000000 --- a/communityProjects/underwater-exploration-rover.mdx +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: Amphibious Leo Rover for Coastal Research -description: - Waterproof Leo Rover modification capable of shallow water exploration, - intertidal zone research, and underwater photography for marine biology - studies. -slug: amphibious-coastal-research-rover -authors: - - name: Dr. Elena Kowalski - title: Marine Robotics Specialist - url: https://github.com/elenakowalski - image_url: https://i.pravatar.cc/150?img=9 - socials: - github: elenakowalski - twitter: elenamarinebot -tags: [leo-rover, marine-biology, underwater, research, waterproof] -image: https://images.unsplash.com/photo-1583212292454-1fe6229603b7?w=800 -hide_table_of_contents: false -company: - name: Marine Science Institute - url: https://marine-science-institute.org - logo_url: https://i.pravatar.cc/150?img=9 ---- - -A groundbreaking waterproof modification of Leo Rover for amphibious operations -in intertidal zones and shallow coastal waters up to 3 meters depth. - -{/* truncate */} - -## Breaking New Ground in Marine Robotics - -Traditional underwater ROVs are expensive and complex. Land-based rovers can't -access coastal zones. Our team at the Marine Science Institute developed an -amphibious Leo Rover that bridges this gap, enabling affordable research in -critical intertidal ecosystems. - -## Amphibious Capabilities - -### Waterproofing Design - -- **Complete IP68 Sealing**: Submersible up to 3 meters -- **Pressure-Compensated Enclosures**: All electronic components protected -- **Corrosion-Resistant Materials**: Marine-grade aluminum and stainless steel -- **Hydrophobic Coatings**: Enhanced water shedding on electronics - -### Propulsion System - -- **Hybrid Wheels**: Function on land and as paddles in water -- **Buoyancy Control**: Adjustable foam floats for neutral buoyancy -- **Thruster Assist**: Optional water jets for strong currents -- **Stability System**: Active ballast for level operation underwater - -## Research Applications - -### Intertidal Zone Monitoring - -Our rover excels in studying the area between high and low tide marks: - -- **Time-lapse Photography**: Automated photo sequences during tide cycles -- **Species Identification**: AI-powered recognition of marine life -- **Habitat Mapping**: 3D reconstruction of rock pools and formations -- **Temperature Gradients**: Water and substrate temperature logging - -### Underwater Surveys - -- High-resolution underwater photography -- Video documentation of fish populations -- Coral reef health assessment (shallow reefs) -- Pollution and debris monitoring - -### Beach and Coastal Studies - -- Sand erosion measurement -- Turtle nesting site monitoring (non-invasive) -- Beach cleanup assistance (debris identification) -- Coastal vegetation surveys - -## Technical Specifications - -### Sensors and Cameras - -```yaml -Primary Camera: - - 4K underwater camera with color correction - - 120° wide-angle lens - - LED ring light (6000 lumens, color adjustable) - -Scientific Sensors: - - pH sensor (seawater acidity) - - Dissolved oxygen probe - - Salinity sensor - - Water temperature (high precision ±0.1°C) - - Depth sensor (±1cm accuracy) - - Turbidity meter - -Navigation: - - Underwater GPS (acoustic positioning) - - IMU with compass - - Sonar for obstacle avoidance -``` - -### Power Management - -- **Main Battery**: 8-hour operation (mixed land/water) -- **Emergency Backup**: 2-hour reserve power -- **Solar Panel**: 50W charging during surface operations -- **Low-Power Mode**: 24-hour monitoring capability - -## Field Research Results - -### Project: Coral Bleaching Study (Thailand, 2025) - -Over 3 months, our rover conducted daily surveys of shallow coral reefs: - -- **Coverage**: 2.5 km² of reef surveyed -- **Data Collected**: 45,000 photos, 200 hours of video -- **Discoveries**: Early detection of bleaching in previously unmonitored areas -- **Cost Savings**: 75% reduction compared to diver-based surveys - -### Project: Tide Pool Biodiversity (British Columbia) - -Automated monitoring of 50 tide pools over 6-month period: - -- **Species Cataloged**: 127 different species identified -- **Population Trends**: Tracked seasonal variations -- **Impact**: Data used for marine protected area planning - -## Safety Features - -- **Emergency Surfacing**: Automatic ascent if signal lost -- **Strobe Light**: High-visibility beacon for recovery -- **Acoustic Pinger**: Underwater locator beacon -- **Tether Option**: Removable safety line for high-current areas - -## Community Impact - -This project has democratized marine research: - -- **Educational Programs**: 15 schools using rovers for student projects -- **Citizen Science**: Local communities monitoring their coastlines -- **Conservation**: Direct impact on 3 marine protected area designations - -## Building Your Own - -We've open-sourced all designs and software: - -### Bill of Materials - -- Base Leo Rover platform -- Custom waterproof enclosures (3D printable or machined) -- Marine-grade connectors and cables -- Buoyancy foam and ballast weights -- Estimated cost: $8,000-12,000 - -### Assembly Guide - -Complete step-by-step instructions available in our repository, including: - -- CAD files for all custom parts -- Wiring diagrams -- Waterproofing procedures -- Testing protocols - -## Project Details - -**Developed by**: Marine Science Institute, University of Washington -**Principal Investigator**: Dr. Elena Kowalski -**Team**: 4 engineers, 6 marine biologists -**Funding**: National Science Foundation, Ocean Conservancy -**Development Period**: 2023-2024 - -## Resources - -- [GitHub Repository - Complete Build Guide](https://github.com/marine-institute/amphibious-leo) -- [CAD Files - 3D Models](https://github.com/marine-institute/amphibious-leo/tree/main/cad) -- [Software - ROS Packages](https://github.com/marine-institute/amphibious-leo/tree/main/software) -- [Research Publications](https://example.com/publications) -- [Build Tutorial Videos](https://youtube.com/playlist?list=example) -- [Field Test Results (Data)](https://example.com/data) - -## Collaborate With Us - -We're seeking partnerships with: - -- Other marine research institutions -- Conservation organizations -- Educational institutions -- Makers and robotics enthusiasts - -Contact: [marine.robotics@uw.edu](mailto:marine.robotics@uw.edu) From 2bc73b5a7b1c93b8b1e705c61b369eea37b2d811 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 27 Jan 2026 16:06:52 +0100 Subject: [PATCH 21/35] Reformat --- scripts/community-projects-frontmatter-check.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/community-projects-frontmatter-check.js b/scripts/community-projects-frontmatter-check.js index 244f845b..bc28d812 100644 --- a/scripts/community-projects-frontmatter-check.js +++ b/scripts/community-projects-frontmatter-check.js @@ -41,4 +41,4 @@ function validateFrontMatter() { } } -validateFrontMatter(); \ No newline at end of file +validateFrontMatter(); From d5a8a0a77e39721d628640c0a82130668be00f98 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Wed, 28 Jan 2026 11:25:00 +0100 Subject: [PATCH 22/35] Apply review comments --- communityProjects/tags.yml | 6 +++--- docs/guidelines/addCommunityProject.mdx | 6 +++--- scripts/community-projects-frontmatter-check.js | 5 ++--- .../communityProjects/BlogPostCard/index.tsx | 2 +- .../communityProjects/BlogPostItem/Header/index.tsx | 12 +++++++----- .../communityProjects/BlogPostItems/index.tsx | 5 +---- .../BlogPostItems/styles.module.css | 2 -- src/hooks/useCommunityProject/index.tsx | 6 +++--- 8 files changed, 20 insertions(+), 24 deletions(-) diff --git a/communityProjects/tags.yml b/communityProjects/tags.yml index 74b0f59c..e919be69 100644 --- a/communityProjects/tags.yml +++ b/communityProjects/tags.yml @@ -1,14 +1,14 @@ -# Robotic plaform related tags +# Robotic platform related tags leo-rover: label: Leo Rover description: Projects related to the Leo Rover robotic platform. - permalink: '/leo-rover' + permalink: 'leo-rover' raph-rover: label: Raph Rover description: Projects related to the Raph Rover robotic platform. - permalink: '/raph-rover' + permalink: 'raph-rover' # Application area tags diff --git a/docs/guidelines/addCommunityProject.mdx b/docs/guidelines/addCommunityProject.mdx index fd5d5eea..81fad7f1 100644 --- a/docs/guidelines/addCommunityProject.mdx +++ b/docs/guidelines/addCommunityProject.mdx @@ -23,7 +23,7 @@ Before adding a community project, ensure that it meets the following criteria: - The project is based on Fictionlab products or integrates with them. Fictionlab can remove any community project at any time without prior notice if -it not meets the guidelines or is deemed inappropriate. +it does not meet the guidelines or is deemed inappropriate. ::: @@ -47,8 +47,8 @@ the [Components](/guidelines/components) page. ## Creating a community project page To add a community project to the Fictionlab documentation, create a new MDX -file in the `docs/community-projects` directory of this repository. Each -community project should have its own MDX file named after the project (e.g., +file in the `communityProjects/` directory of this repository. Each community +project should have its own MDX file named after the project (e.g., `my-community-project.mdx`). ### Front matter diff --git a/scripts/community-projects-frontmatter-check.js b/scripts/community-projects-frontmatter-check.js index bc28d812..fefec205 100644 --- a/scripts/community-projects-frontmatter-check.js +++ b/scripts/community-projects-frontmatter-check.js @@ -1,5 +1,4 @@ const fs = require('fs'); -const path = require('path'); const glob = require('glob'); const matter = require('gray-matter'); @@ -7,7 +6,6 @@ const matter = require('gray-matter'); const REQUIRED_KEYS = [ 'title', 'description', - 'slug', 'authors', 'tags', 'image', @@ -15,7 +13,7 @@ const REQUIRED_KEYS = [ ]; // Path to your MDX files for community projects. -const DOCS_PATHS = ['docs/communityProjects/**/*.mdx']; +const DOCS_PATHS = ['communityProjects/**/*.mdx']; function validateFrontMatter() { const filePaths = DOCS_PATHS.flatMap((pattern) => glob.sync(pattern)); @@ -36,6 +34,7 @@ function validateFrontMatter() { if (errors.length > 0) { console.error('Validation Errors:'); errors.forEach((error) => console.error(error)); + process.exit(1); } else { console.log('All community project files have valid front matter.'); } diff --git a/src/components/communityProjects/BlogPostCard/index.tsx b/src/components/communityProjects/BlogPostCard/index.tsx index 39ec30a8..29d51672 100644 --- a/src/components/communityProjects/BlogPostCard/index.tsx +++ b/src/components/communityProjects/BlogPostCard/index.tsx @@ -23,7 +23,7 @@ export default function BlogPostCard({

{metadata.title}

{metadata.description && ( -

{children}

+
{children}
)}
{metadata.frontMatter.company && diff --git a/src/components/communityProjects/BlogPostItem/Header/index.tsx b/src/components/communityProjects/BlogPostItem/Header/index.tsx index 9adc11a7..9a9ff1e5 100644 --- a/src/components/communityProjects/BlogPostItem/Header/index.tsx +++ b/src/components/communityProjects/BlogPostItem/Header/index.tsx @@ -16,11 +16,13 @@ export default function BlogPostItemHeader(): ReactNode {
- {frontMatter.company?.name + {frontMatter.company?.logo_url && ( + {frontMatter.company?.name + )}
); diff --git a/src/components/communityProjects/BlogPostItems/index.tsx b/src/components/communityProjects/BlogPostItems/index.tsx index 36a0002f..bc4d6e7f 100644 --- a/src/components/communityProjects/BlogPostItems/index.tsx +++ b/src/components/communityProjects/BlogPostItems/index.tsx @@ -5,10 +5,7 @@ import styles from './styles.module.css'; import { ReactNode } from 'react'; import BlogPostCard from '@site/src/components/communityProjects/BlogPostCard'; -export default function BlogPostItems({ - items, - component: BlogPostItemComponent = BlogPostItem, -}: Props): ReactNode { +export default function BlogPostItems({ items }: Props): ReactNode { return (
{items.map(({ content: BlogPostContent }) => ( diff --git a/src/components/communityProjects/BlogPostItems/styles.module.css b/src/components/communityProjects/BlogPostItems/styles.module.css index 808e60b9..39bbe407 100644 --- a/src/components/communityProjects/BlogPostItems/styles.module.css +++ b/src/components/communityProjects/BlogPostItems/styles.module.css @@ -9,7 +9,6 @@ padding: 0 1rem; } -/* Maksymalnie 4 kolumny */ @media (min-width: 1400px) { .blogPostGrid { grid-template-columns: repeat(4, 1fr); @@ -57,7 +56,6 @@ border-color: var(--ifm-color-primary); } -/* Upewnij się, że zawartość karty zajmuje całą dostępną przestrzeń */ .blogPostCard > * { height: 100%; } diff --git a/src/hooks/useCommunityProject/index.tsx b/src/hooks/useCommunityProject/index.tsx index 64110ec6..24470f3c 100644 --- a/src/hooks/useCommunityProject/index.tsx +++ b/src/hooks/useCommunityProject/index.tsx @@ -1,7 +1,7 @@ import { PropBlogPostMetadata } from '@docusaurus/plugin-content-blog'; -import { useBlogPost } from '@docusaurus/plugin-content-blog/lib/client/contexts.js'; +import { useBlogPost } from '@docusaurus/plugin-content-blog/client'; -interface communityProjectMetadata +interface CommunityProjectMetadata extends Omit { frontMatter: PropBlogPostMetadata['frontMatter'] & { company?: { @@ -16,6 +16,6 @@ export default function useCommunityProject() { const blogPost = useBlogPost(); return { ...blogPost, - metadata: blogPost.metadata as communityProjectMetadata, + metadata: blogPost.metadata as CommunityProjectMetadata, }; } From 0c63e2c55dacb13b14a5062736321696e15da269 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Wed, 28 Jan 2026 11:25:55 +0100 Subject: [PATCH 23/35] Typo --- docusaurus.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docusaurus.config.ts b/docusaurus.config.ts index aaa0e866..f7b3743c 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -184,7 +184,7 @@ const config: Config = { to: '/integrations', }, { - label: 'Community Projects', + label: 'Community projects', position: 'left', to: '/community-projects', }, From 242d6bd66990571156e9d4ddf1bf72b9cd1808b0 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Wed, 28 Jan 2026 11:34:46 +0100 Subject: [PATCH 24/35] Unify file naming to kebab-case --- .../autonomous-agriculture-robot.mdx | 0 {communityProjects => community-projects}/tags.yml | 0 .../{addCommunityProject.mdx => add-community-project.mdx} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {communityProjects => community-projects}/autonomous-agriculture-robot.mdx (100%) rename {communityProjects => community-projects}/tags.yml (100%) rename docs/guidelines/{addCommunityProject.mdx => add-community-project.mdx} (100%) diff --git a/communityProjects/autonomous-agriculture-robot.mdx b/community-projects/autonomous-agriculture-robot.mdx similarity index 100% rename from communityProjects/autonomous-agriculture-robot.mdx rename to community-projects/autonomous-agriculture-robot.mdx diff --git a/communityProjects/tags.yml b/community-projects/tags.yml similarity index 100% rename from communityProjects/tags.yml rename to community-projects/tags.yml diff --git a/docs/guidelines/addCommunityProject.mdx b/docs/guidelines/add-community-project.mdx similarity index 100% rename from docs/guidelines/addCommunityProject.mdx rename to docs/guidelines/add-community-project.mdx From e118027da2f84b0cd386c0a40d776a6d1ad3cecc Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Wed, 28 Jan 2026 11:45:18 +0100 Subject: [PATCH 25/35] Cleanup component names & update paths --- docusaurus.config.ts | 6 +++--- .../BlogPostCard => CommunityProjectCard}/index.tsx | 2 +- .../styles.module.css | 0 .../Header/index.tsx | 2 +- .../Header/styles.module.css | 0 .../BlogPostItem => CommunityProjectItem}/index.tsx | 6 +++--- .../index.tsx | 9 ++++----- .../styles.module.css | 0 .../BlogPostPage => CommunityProjectPage}/index.tsx | 12 ++++++------ .../BlogListPage => CommunityProjectsPage}/index.tsx | 10 +++++----- 10 files changed, 23 insertions(+), 24 deletions(-) rename src/components/{communityProjects/BlogPostCard => CommunityProjectCard}/index.tsx (97%) rename src/components/{communityProjects/BlogPostCard => CommunityProjectCard}/styles.module.css (100%) rename src/components/{communityProjects/BlogPostItem => CommunityProjectItem}/Header/index.tsx (93%) rename src/components/{communityProjects/BlogPostItem => CommunityProjectItem}/Header/styles.module.css (100%) rename src/components/{communityProjects/BlogPostItem => CommunityProjectItem}/index.tsx (83%) rename src/components/{communityProjects/BlogPostItems => CommunityProjectItems}/index.tsx (70%) rename src/components/{communityProjects/BlogPostItems => CommunityProjectItems}/styles.module.css (100%) rename src/components/{communityProjects/BlogPostPage => CommunityProjectPage}/index.tsx (85%) rename src/components/{communityProjects/BlogListPage => CommunityProjectsPage}/index.tsx (82%) diff --git a/docusaurus.config.ts b/docusaurus.config.ts index f7b3743c..6879176c 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -97,7 +97,7 @@ const config: Config = { }, blog: { id: 'community-projects', - path: 'communityProjects', + path: 'community-projects', blogTitle: 'Fictionlab Community Projects', blogDescription: 'Showcase of projects created by the Fictionlab community', @@ -105,9 +105,9 @@ const config: Config = { blogSidebarCount: 0, feedOptions: { type: null }, blogListComponent: - '@site/src/components/communityProjects/BlogListPage', + '@site/src/components/CommunityProjectsPage', blogPostComponent: - '@site/src/components/communityProjects/BlogPostPage', + '@site/src/components/CommunityProjectPage', onInlineTags: 'warn', onInlineAuthors: 'ignore', showReadingTime: false, diff --git a/src/components/communityProjects/BlogPostCard/index.tsx b/src/components/CommunityProjectCard/index.tsx similarity index 97% rename from src/components/communityProjects/BlogPostCard/index.tsx rename to src/components/CommunityProjectCard/index.tsx index 29d51672..cda2b8c5 100644 --- a/src/components/communityProjects/BlogPostCard/index.tsx +++ b/src/components/CommunityProjectCard/index.tsx @@ -6,7 +6,7 @@ import styles from './styles.module.css'; import Link from '@docusaurus/Link'; import useCommunityProject from '@site/src/hooks/useCommunityProject'; -export default function BlogPostCard({ +export default function CommunityProjectCard({ children, className, }: Props): ReactNode { diff --git a/src/components/communityProjects/BlogPostCard/styles.module.css b/src/components/CommunityProjectCard/styles.module.css similarity index 100% rename from src/components/communityProjects/BlogPostCard/styles.module.css rename to src/components/CommunityProjectCard/styles.module.css diff --git a/src/components/communityProjects/BlogPostItem/Header/index.tsx b/src/components/CommunityProjectItem/Header/index.tsx similarity index 93% rename from src/components/communityProjects/BlogPostItem/Header/index.tsx rename to src/components/CommunityProjectItem/Header/index.tsx index 9a9ff1e5..6eaeb0e6 100644 --- a/src/components/communityProjects/BlogPostItem/Header/index.tsx +++ b/src/components/CommunityProjectItem/Header/index.tsx @@ -5,7 +5,7 @@ import BlogPostItemHeaderAuthors from '@theme/BlogPostItem/Header/Authors'; import styles from './styles.module.css'; import useCommunityProject from '@site/src/hooks/useCommunityProject'; -export default function BlogPostItemHeader(): ReactNode { +export default function CommunityProjectItemHeader(): ReactNode { const { metadata } = useCommunityProject(); const { frontMatter } = metadata; return ( diff --git a/src/components/communityProjects/BlogPostItem/Header/styles.module.css b/src/components/CommunityProjectItem/Header/styles.module.css similarity index 100% rename from src/components/communityProjects/BlogPostItem/Header/styles.module.css rename to src/components/CommunityProjectItem/Header/styles.module.css diff --git a/src/components/communityProjects/BlogPostItem/index.tsx b/src/components/CommunityProjectItem/index.tsx similarity index 83% rename from src/components/communityProjects/BlogPostItem/index.tsx rename to src/components/CommunityProjectItem/index.tsx index 3b4f1406..64d22e1e 100644 --- a/src/components/communityProjects/BlogPostItem/index.tsx +++ b/src/components/CommunityProjectItem/index.tsx @@ -2,7 +2,7 @@ import React, { type ReactNode } from 'react'; import clsx from 'clsx'; import { useBlogPost } from '@docusaurus/plugin-content-blog/client'; import BlogPostItemContainer from '@theme/BlogPostItem/Container'; -import BlogPostItemHeader from '@site/src/components/communityProjects/BlogPostItem/Header'; +import CommunityProjectItemHeader from '@site/src/components/CommunityProjectItem/Header'; import BlogPostItemContent from '@theme/BlogPostItem/Content'; import BlogPostItemFooter from '@theme/BlogPostItem/Footer'; import type { Props } from '@theme/BlogPostItem'; @@ -13,14 +13,14 @@ function useContainerClassName() { return !isBlogPostPage ? 'margin-bottom--xl' : undefined; } -export default function BlogPostItem({ +export default function CommunityProjectItem({ children, className, }: Props): ReactNode { const containerClassName = useContainerClassName(); return ( - + {children} diff --git a/src/components/communityProjects/BlogPostItems/index.tsx b/src/components/CommunityProjectItems/index.tsx similarity index 70% rename from src/components/communityProjects/BlogPostItems/index.tsx rename to src/components/CommunityProjectItems/index.tsx index bc4d6e7f..87be3b43 100644 --- a/src/components/communityProjects/BlogPostItems/index.tsx +++ b/src/components/CommunityProjectItems/index.tsx @@ -1,11 +1,10 @@ import { BlogPostProvider } from '@docusaurus/plugin-content-blog/client'; -import BlogPostItem from '@theme/BlogPostItem'; import type { Props } from '@theme/BlogPostItems'; import styles from './styles.module.css'; import { ReactNode } from 'react'; -import BlogPostCard from '@site/src/components/communityProjects/BlogPostCard'; +import CommunityProjectCard from '@site/src/components/CommunityProjectCard'; -export default function BlogPostItems({ items }: Props): ReactNode { +export default function CommunityProjectItems({ items }: Props): ReactNode { return (
{items.map(({ content: BlogPostContent }) => ( @@ -14,9 +13,9 @@ export default function BlogPostItems({ items }: Props): ReactNode { content={BlogPostContent} >
- + - +
))} diff --git a/src/components/communityProjects/BlogPostItems/styles.module.css b/src/components/CommunityProjectItems/styles.module.css similarity index 100% rename from src/components/communityProjects/BlogPostItems/styles.module.css rename to src/components/CommunityProjectItems/styles.module.css diff --git a/src/components/communityProjects/BlogPostPage/index.tsx b/src/components/CommunityProjectPage/index.tsx similarity index 85% rename from src/components/communityProjects/BlogPostPage/index.tsx rename to src/components/CommunityProjectPage/index.tsx index 6928e4b9..cbbbc596 100644 --- a/src/components/communityProjects/BlogPostPage/index.tsx +++ b/src/components/CommunityProjectPage/index.tsx @@ -9,7 +9,7 @@ import { useBlogPost, } from '@docusaurus/plugin-content-blog/client'; import BlogLayout from '@theme/BlogLayout'; -import BlogPostItem from '@site/src/components/communityProjects/BlogPostItem'; +import CommunityProjectItem from '@site/src/components/CommunityProjectItem'; import BlogPostPaginator from '@theme/BlogPostPaginator'; import BlogPostPageMetadata from '@theme/BlogPostPage/Metadata'; import BlogPostPageStructuredData from '@theme/BlogPostPage/StructuredData'; @@ -18,7 +18,7 @@ import ContentVisibility from '@theme/ContentVisibility'; import type { Props } from '@theme/BlogPostPage'; import type { BlogSidebar } from '@docusaurus/plugin-content-blog'; -function BlogPostPageContent({ +function CommunityProjectPageContent({ sidebar, children, }: { @@ -47,7 +47,7 @@ function BlogPostPageContent({ > - {children} + {children} {(nextItem || prevItem) && ( @@ -56,7 +56,7 @@ function BlogPostPageContent({ ); } -export default function BlogPostPage(props: Props): ReactNode { +export default function CommunityProjectPage(props: Props): ReactNode { const BlogPostContent = props.content; return ( @@ -68,9 +68,9 @@ export default function BlogPostPage(props: Props): ReactNode { > - + - + ); diff --git a/src/components/communityProjects/BlogListPage/index.tsx b/src/components/CommunityProjectsPage/index.tsx similarity index 82% rename from src/components/communityProjects/BlogListPage/index.tsx rename to src/components/CommunityProjectsPage/index.tsx index 7dbd5aa8..070f989c 100644 --- a/src/components/communityProjects/BlogListPage/index.tsx +++ b/src/components/CommunityProjectsPage/index.tsx @@ -10,7 +10,7 @@ import { import BlogListPaginator from '@theme/BlogListPaginator'; import SearchMetadata from '@theme/SearchMetadata'; import type { Props } from '@theme/BlogListPage'; -import BlogPostItems from '@site/src/components/communityProjects/BlogPostItems'; +import CommunityProjectItems from '@site/src/components/CommunityProjectItems'; import BlogListPageStructuredData from '@theme/BlogListPage/StructuredData'; import Layout from '@theme/Layout'; @@ -30,19 +30,19 @@ function BlogListPageMetadata(props: Props): ReactNode { ); } -function BlogListPageContent(props: Props): ReactNode { +function CommunityProjectsPageContent(props: Props): ReactNode { const { metadata, items } = props; return (
- +
); } -export default function BlogListPage(props: Props): ReactNode { +export default function CommunityProjectsPage(props: Props): ReactNode { return ( - + ); } From 07ee636bb11ef7abb88821b566bb337dba346c0d Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Wed, 28 Jan 2026 11:46:29 +0100 Subject: [PATCH 26/35] Fix paths in the guide --- docs/guidelines/add-community-project.mdx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/guidelines/add-community-project.mdx b/docs/guidelines/add-community-project.mdx index 81fad7f1..e28a474a 100644 --- a/docs/guidelines/add-community-project.mdx +++ b/docs/guidelines/add-community-project.mdx @@ -47,7 +47,7 @@ the [Components](/guidelines/components) page. ## Creating a community project page To add a community project to the Fictionlab documentation, create a new MDX -file in the `communityProjects/` directory of this repository. Each community +file in the `community-projects/` directory of this repository. Each community project should have its own MDX file named after the project (e.g., `my-community-project.mdx`). @@ -60,7 +60,7 @@ Community Projects page. :::tip Some of the fields requires providing image_url or logo_url. All images should -be placed in the `/static/img/communityProjects` directory of this repository. +be placed in the `/static/img/community-projects` directory of this repository. ::: @@ -72,18 +72,18 @@ authors: - name: Author Name title: Author Title url: https://author-website.com - image_url: /path/to/author-image.jpg + image_url: /img/community-projects/author-image.jpg socials: x: author_x_handle github: author_github_handle linkedin: author_linkedin_handle email: author_email_address tags: [tag1, tag2, tag3] -image: /path/to/project-image.jpg +image: /img/community-projects/project-image.jpg company: name: Company Name url: https://company-website.com - logo_url: /path/to/company-logo.jpg + logo_url: /img/community-projects/company-logo.jpg --- ``` @@ -114,7 +114,7 @@ company: :::tip -Check existing community project pages in the `docs/community-projects` +Check existing community project pages in the `/community-projects` directory for examples of how to structure the front matter and content. ::: @@ -166,7 +166,7 @@ section of the documentation repository's README. Once you have created the MDX file for your community project, submit it as a pull request to the Fictionlab documentation repository. Ensure that your pull -request includes the new MDX file in the `docs/community-projects` directory. +request includes the new MDX file in the `/community-projects` directory. :::note From 61e53e975dc890d493b7ec54709d09cb39507b9a Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 3 Feb 2026 14:53:07 +0100 Subject: [PATCH 27/35] Remove the last AI file & add template --- community-projects/_template.mdx | 47 +++++++ .../autonomous-agriculture-robot.mdx | 126 ------------------ 2 files changed, 47 insertions(+), 126 deletions(-) create mode 100644 community-projects/_template.mdx delete mode 100644 community-projects/autonomous-agriculture-robot.mdx diff --git a/community-projects/_template.mdx b/community-projects/_template.mdx new file mode 100644 index 00000000..b181d4be --- /dev/null +++ b/community-projects/_template.mdx @@ -0,0 +1,47 @@ +--- +title: My Community Project (max 100 characters) +description: A brief description of my community project, up to 160 characters. +authors: + - name: Author Name + title: Author Title + url: https://author-website.com + image_url: /img/community-projects/author-image.jpg + socials: + x: author_x_handle + github: author_github_handle + linkedin: author_linkedin_handle + email: author_email_address +tags: [tag1, tag2, tag3] +image: /img/community-projects/project-image.jpg +company: + name: Company Name + url: https://company-website.com + logo_url: /img/community-projects/company-logo.jpg +--- + +{/* To see how to use this template, refer to the https://docs.fictionlab.pl/guidelines/add-community-project */} + +[Short description of the community project, displayed on the Community Projects +page, up to 400 characters.] + +{/* truncate */} + +[Main content of the community project page, including detailed information +about the project, its features, implementation details, and any other relevant +information. You can use markdown syntax to format the content, add images, +links, and other media as needed.] + +{/* Example content */} + +## Project Overview + +Short introduction to the project, its goals, and the problem it aims to solve. + +## Key Features + +List of the main features of the project, with brief descriptions for each. + +## Resources + +Links to any relevant resources, such as the project repository, documentation, +or related articles. diff --git a/community-projects/autonomous-agriculture-robot.mdx b/community-projects/autonomous-agriculture-robot.mdx deleted file mode 100644 index ddbcf70f..00000000 --- a/community-projects/autonomous-agriculture-robot.mdx +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: Autonomous Agriculture Monitoring System (test file) -description: - Leo Rover adapted for precision agriculture, featuring autonomous navigation, - crop health monitoring, and real-time data collection in vineyard - environments. -slug: autonomous-agriculture-monitoring -authors: - - name: Dr. Maria Santos - title: Robotics Researcher - url: https://github.com/mariasantos - image_url: https://i.pravatar.cc/150?img=5 - socials: - github: mariasantos - email: m.santos@agritech.edu -tags: [leo-rover, agriculture, autonomous-navigation, computer-vision, lidar] -image: https://images.unsplash.com/photo-1625246333195-78d9c38ad449?w=800 -hide_table_of_contents: false -company: - name: AgriTech University - url: https://agritech.edu - logo_url: https://i.pravatar.cc/150?img=5 ---- - -THIS IS A TEST FILE FOR COMMUNITY PROJECTS REMOVE BEFORE MERGING - -An innovative Leo Rover-based system for autonomous crop monitoring in -vineyards, utilizing advanced sensors and AI for precision agriculture. - -{/* truncate */} - -## Project Overview - -Our team at AgriTech University has successfully adapted the Leo Rover platform -to create an autonomous agricultural monitoring system. The robot navigates -independently through vineyard rows, collecting crucial data about crop health, -soil conditions, and environmental parameters. - -## Key Features - -### Autonomous Navigation - -- **GPS-RTK Integration**: Centimeter-level positioning accuracy for precise row - following -- **LiDAR Mapping**: Real-time 3D mapping of vineyard structure and obstacles -- **Path Planning**: Intelligent route optimization for complete field coverage - -### Crop Health Monitoring - -- **Multispectral Camera**: NDVI analysis for early disease detection -- **Thermal Imaging**: Identification of water stress in plants -- **RGB Vision**: High-resolution photos for visual inspection - -### Environmental Sensing - -- Soil moisture and temperature sensors -- Ambient temperature and humidity monitoring -- Light intensity measurements - -## Technical Implementation - -The system runs on ROS Noetic with custom nodes for: - -- Sensor data fusion -- Autonomous navigation stack -- Image processing and analysis -- Cloud data synchronization - -```python -# Example: NDVI calculation node -import rospy -from sensor_msgs.msg import Image -import cv2 -import numpy as np - -class NDVIProcessor: - def __init__(self): - self.nir_sub = rospy.Subscriber('/multispectral/nir', Image, self.nir_callback) - self.red_sub = rospy.Subscriber('/multispectral/red', Image, self.red_callback) - # Processing logic here -``` - -## Results - -After 6 months of field testing: - -- **95% navigation accuracy** in complex vineyard terrain -- **Early disease detection** up to 2 weeks before visible symptoms -- **40% reduction** in manual inspection time -- **Coverage**: 5 hectares per 8-hour operation - -## Hardware Modifications - -- Extended battery pack for 8+ hour operation -- Custom mounting bracket for multispectral camera -- Weatherproof enclosure for electronics -- Upgraded wheels for better traction in muddy conditions - -## Future Development - -We're working on: - -- Integration with drone systems for comprehensive monitoring -- Machine learning models for automatic pest identification -- Integration with irrigation systems for automated response -- Multi-robot coordination for large-scale farms - -## Project Team - -**Created by**: AgriTech Research Lab, University of California Davis -**Project Lead**: Dr. Maria Santos -**Duration**: 18 months (2024-2025) -**Funding**: USDA Agricultural Research Grant - -## Resources - -- [GitHub Repository](https://github.com/agritech-lab/leo-agriculture) -- [Research Paper (PDF)](https://example.com/paper.pdf) -- [Demo Video](https://youtube.com/watch?v=example) -- [Technical Documentation](https://docs.example.com/leo-agri) -- [ROS Packages](https://github.com/agritech-lab/leo-agri-ros) - -## Contact - -For collaboration or questions, reach out to our team at -[agritech@ucdavis.edu](mailto:agritech@ucdavis.edu) From d44ce84a482625793251a27e4c6ef5a4e48e25d7 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 3 Feb 2026 14:53:54 +0100 Subject: [PATCH 28/35] Formatting --- docs/guidelines/add-community-project.mdx | 4 ++-- docusaurus.config.ts | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/guidelines/add-community-project.mdx b/docs/guidelines/add-community-project.mdx index e28a474a..97204ff3 100644 --- a/docs/guidelines/add-community-project.mdx +++ b/docs/guidelines/add-community-project.mdx @@ -114,8 +114,8 @@ company: :::tip -Check existing community project pages in the `/community-projects` -directory for examples of how to structure the front matter and content. +Check existing community project pages in the `/community-projects` directory +for examples of how to structure the front matter and content. ::: diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 6879176c..28900ea9 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -104,10 +104,8 @@ const config: Config = { routeBasePath: '/community-projects', blogSidebarCount: 0, feedOptions: { type: null }, - blogListComponent: - '@site/src/components/CommunityProjectsPage', - blogPostComponent: - '@site/src/components/CommunityProjectPage', + blogListComponent: '@site/src/components/CommunityProjectsPage', + blogPostComponent: '@site/src/components/CommunityProjectPage', onInlineTags: 'warn', onInlineAuthors: 'ignore', showReadingTime: false, From 39d1a62788698dc49a8aa49198147668431edde1 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 3 Feb 2026 14:54:02 +0100 Subject: [PATCH 29/35] Throw on new tags --- docusaurus.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 28900ea9..3dde41f2 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -106,7 +106,7 @@ const config: Config = { feedOptions: { type: null }, blogListComponent: '@site/src/components/CommunityProjectsPage', blogPostComponent: '@site/src/components/CommunityProjectPage', - onInlineTags: 'warn', + onInlineTags: 'throw', onInlineAuthors: 'ignore', showReadingTime: false, }, From ae486c3f1a7d58a90a9b2eda987949238b9e4b79 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 3 Feb 2026 15:04:36 +0100 Subject: [PATCH 30/35] Add placeholder community project --- community-projects/praceholder.mdx | 47 ++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 community-projects/praceholder.mdx diff --git a/community-projects/praceholder.mdx b/community-projects/praceholder.mdx new file mode 100644 index 00000000..6752c7c1 --- /dev/null +++ b/community-projects/praceholder.mdx @@ -0,0 +1,47 @@ +--- +title: Delete after adding first community project +description: Temporary placeholder for the first community project. Please refer to the https://docs.fictionlab.pl/guidelines/add-community-project for instructions on how to add a new community project. +authors: + - name: Author Name + title: Author Title + url: https://author-website.com + image_url: /img/community-projects/author-image.jpg + socials: + x: author_x_handle + github: author_github_handle + linkedin: author_linkedin_handle + email: author_email_address +image: /img/community-projects/project-image.jpg +tags: [leo-rover] +company: + name: Company Name + url: https://company-website.com + logo_url: /img/community-projects/company-logo.jpg +--- + +{/* To see how to use this template, refer to the https://docs.fictionlab.pl/guidelines/add-community-project */} + +[Short description of the community project, displayed on the Community Projects +page, up to 400 characters.] + +{/* truncate */} + +[Main content of the community project page, including detailed information +about the project, its features, implementation details, and any other relevant +information. You can use markdown syntax to format the content, add images, +links, and other media as needed.] + +{/* Example content */} + +## Project Overview + +Short introduction to the project, its goals, and the problem it aims to solve. + +## Key Features + +List of the main features of the project, with brief descriptions for each. + +## Resources + +Links to any relevant resources, such as the project repository, documentation, +or related articles. From cf0d87eb63f1ef139de03e98f57b375fbd24c024 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Tue, 3 Feb 2026 15:09:21 +0100 Subject: [PATCH 31/35] Formatting --- community-projects/praceholder.mdx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/community-projects/praceholder.mdx b/community-projects/praceholder.mdx index 6752c7c1..f03bfec2 100644 --- a/community-projects/praceholder.mdx +++ b/community-projects/praceholder.mdx @@ -1,6 +1,9 @@ --- title: Delete after adding first community project -description: Temporary placeholder for the first community project. Please refer to the https://docs.fictionlab.pl/guidelines/add-community-project for instructions on how to add a new community project. +description: + Temporary placeholder for the first community project. Please refer to the + https://docs.fictionlab.pl/guidelines/add-community-project for instructions + on how to add a new community project. authors: - name: Author Name title: Author Title From 477b0a7e5360144105edb2bb1506474f4b1cb338 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Wed, 4 Feb 2026 13:48:15 +0100 Subject: [PATCH 32/35] Add a section about branching --- docs/guidelines/add-community-project.mdx | 24 ++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/guidelines/add-community-project.mdx b/docs/guidelines/add-community-project.mdx index 97204ff3..0e97eb25 100644 --- a/docs/guidelines/add-community-project.mdx +++ b/docs/guidelines/add-community-project.mdx @@ -44,7 +44,29 @@ Fictionlab documentation uses custom React components to enhance the content and provide additional functionality. To see a list of available components, visit the [Components](/guidelines/components) page. -## Creating a community project page +## Creating a community project entry + +### Prepare your workspace on a separate branch + +All community project pages should be created on the separate branches of the +documentation repository. This allows for easier review and testing of the new +content before it is merged into the main branch. + +Create a new branch from the `development` branch of the repository. You can +name the branch something descriptive related to the community project you are +adding, but remember to add a `content` prefix +(e.g.,`content/add-my-community-project`). + +:::tip + +Check the +[Getting Started](https://github.com/fictionlab/docs?tab=readme-ov-file#getting-started) +section in the documentation repository's README for more information on how to +setup your local workspace from the scratch. + +::: + +### Create the MDX file To add a community project to the Fictionlab documentation, create a new MDX file in the `community-projects/` directory of this repository. Each community From 3b27f10b9e74ddf916cd54bd3466a382dfe0ffd0 Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 6 Feb 2026 12:43:13 +0100 Subject: [PATCH 33/35] Apply review comments --- community-projects/_template.mdx | 6 ++- .../{praceholder.mdx => placeholder.mdx} | 0 docs/guidelines/add-community-project.mdx | 54 +++++++++++++------ 3 files changed, 42 insertions(+), 18 deletions(-) rename community-projects/{praceholder.mdx => placeholder.mdx} (100%) diff --git a/community-projects/_template.mdx b/community-projects/_template.mdx index b181d4be..df9f5d14 100644 --- a/community-projects/_template.mdx +++ b/community-projects/_template.mdx @@ -1,10 +1,10 @@ --- -title: My Community Project (max 100 characters) +title: My Community Project (max 60 characters) description: A brief description of my community project, up to 160 characters. authors: - name: Author Name title: Author Title - url: https://author-website.com + url: https://author-personal-website.com image_url: /img/community-projects/author-image.jpg socials: x: author_x_handle @@ -21,6 +21,8 @@ company: {/* To see how to use this template, refer to the https://docs.fictionlab.pl/guidelines/add-community-project */} +# [Community project title] + [Short description of the community project, displayed on the Community Projects page, up to 400 characters.] diff --git a/community-projects/praceholder.mdx b/community-projects/placeholder.mdx similarity index 100% rename from community-projects/praceholder.mdx rename to community-projects/placeholder.mdx diff --git a/docs/guidelines/add-community-project.mdx b/docs/guidelines/add-community-project.mdx index 0e97eb25..04db5926 100644 --- a/docs/guidelines/add-community-project.mdx +++ b/docs/guidelines/add-community-project.mdx @@ -79,33 +79,55 @@ Each community project page should include the front matter data at the top of the MDX file. It allows proper indexing and display of the project on the Community Projects page. -:::tip +:::info Some of the fields requires providing image_url or logo_url. All images should be placed in the `/static/img/community-projects` directory of this repository. ::: +Below is the list of required front matter fields: + +- `title` +- `description` +- `authors` +- `tags` +- `image` +- `company` + +:::tip + +To see how each of the front matter fields should be structured, refer to the +documentation of the docusaurus: + +- [Docusaurus Docs - Front matter](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog#markdown-front-matter) +- [Docusaurus Docs - Inline authors](https://docusaurus.io/docs/blog#inline-authors) + ::: + +Example front matter: + ```yml --- -title: My Community Project -description: A brief description of my community project, up to 160 characters. +title: Automated Plant Watering System +description: + An IoT-based automated plant watering system using Leo Rover and soil moisture + sensors. authors: - - name: Author Name - title: Author Title - url: https://author-website.com - image_url: /img/community-projects/author-image.jpg + - name: John Doe + title: Lead Developer + url: https://johndoe-website.com + image_url: /img/community-projects/automated-plant-watering/johndoe.jpg socials: - x: author_x_handle - github: author_github_handle - linkedin: author_linkedin_handle - email: author_email_address -tags: [tag1, tag2, tag3] -image: /img/community-projects/project-image.jpg + x: johnDoe + github: johndoe + linkedin: johndoe + email: johndoe@example.com +tags: [leo-rover] +image: /img/community-projects/automated-plant-watering/project-image.jpg company: - name: Company Name - url: https://company-website.com - logo_url: /img/community-projects/company-logo.jpg + name: GreenTech Solutions + url: https://greentech-solutions.com + logo_url: /img/community-projects/automated-plant-watering/greentech-logo.jpg --- ``` From 03216dc1f81699c788cdeee5f41af7a13bf7777c Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 6 Feb 2026 13:43:19 +0100 Subject: [PATCH 34/35] Add CommunityProjectsTags component and implement tag extraction logic --- .../CommunityProjectsPage/index.tsx | 21 +++++++++++- .../CommunityProjectsTags/index.tsx | 32 +++++++++++++++++++ .../CommunityProjectsTags/styles.module.css | 4 +++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/components/CommunityProjectsTags/index.tsx create mode 100644 src/components/CommunityProjectsTags/styles.module.css diff --git a/src/components/CommunityProjectsPage/index.tsx b/src/components/CommunityProjectsPage/index.tsx index 070f989c..2cbe1896 100644 --- a/src/components/CommunityProjectsPage/index.tsx +++ b/src/components/CommunityProjectsPage/index.tsx @@ -1,5 +1,6 @@ -import React, { type ReactNode } from 'react'; +import React, { type ReactNode, useMemo } from 'react'; import clsx from 'clsx'; +import type { Tag } from '@docusaurus/utils'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import { @@ -13,6 +14,7 @@ import type { Props } from '@theme/BlogListPage'; import CommunityProjectItems from '@site/src/components/CommunityProjectItems'; import BlogListPageStructuredData from '@theme/BlogListPage/StructuredData'; import Layout from '@theme/Layout'; +import CommunityProjectsTags from '@site/src/components/CommunityProjectsTags'; function BlogListPageMetadata(props: Props): ReactNode { const { metadata } = props; @@ -32,9 +34,26 @@ function BlogListPageMetadata(props: Props): ReactNode { function CommunityProjectsPageContent(props: Props): ReactNode { const { metadata, items } = props; + + // Extract unique tags from items metadata + const tags = useMemo(() => { + const tagsMap = new Map(); + + items.forEach(({ content }) => { + (content.metadata.tags as Tag[])?.forEach((tag) => { + if (!tagsMap.has(tag.permalink)) { + tagsMap.set(tag.permalink, tag); + } + }); + }); + + return Array.from(tagsMap.values()); + }, [items]); + return (
+
diff --git a/src/components/CommunityProjectsTags/index.tsx b/src/components/CommunityProjectsTags/index.tsx new file mode 100644 index 00000000..0c8e5e6e --- /dev/null +++ b/src/components/CommunityProjectsTags/index.tsx @@ -0,0 +1,32 @@ +import { type ReactNode } from 'react'; +import type { Tag } from '@docusaurus/utils'; +import styles from './styles.module.css'; +import TagsListInline from '@theme/TagsListInline'; + +interface Props { + tags?: Tag[]; + className?: string; +} + +export default function CommunityProjectsTags({ + tags, + className = '', +}: Props): ReactNode { + const allTags = [ + { + label: 'All', + permalink: '/community-projects/tags', + description: 'All community projects', + }, + ].concat(tags || []); + + if (!tags || tags.length === 0) { + return null; + } + + return ( +
+ +
+ ); +} diff --git a/src/components/CommunityProjectsTags/styles.module.css b/src/components/CommunityProjectsTags/styles.module.css new file mode 100644 index 00000000..add8a455 --- /dev/null +++ b/src/components/CommunityProjectsTags/styles.module.css @@ -0,0 +1,4 @@ +.tagsContainer { + width: 100%; + margin: 1rem 0; +} From b56c1fddf44e4d6d1099cce27e3d6954aafe831e Mon Sep 17 00:00:00 2001 From: Adrian Krzeminski Date: Fri, 6 Feb 2026 15:27:17 +0100 Subject: [PATCH 35/35] Change guide to mention creating forks instead of branches --- docs/guidelines/add-community-project.mdx | 28 +++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/docs/guidelines/add-community-project.mdx b/docs/guidelines/add-community-project.mdx index 04db5926..945d9311 100644 --- a/docs/guidelines/add-community-project.mdx +++ b/docs/guidelines/add-community-project.mdx @@ -46,16 +46,24 @@ the [Components](/guidelines/components) page. ## Creating a community project entry -### Prepare your workspace on a separate branch - -All community project pages should be created on the separate branches of the -documentation repository. This allows for easier review and testing of the new -content before it is merged into the main branch. - -Create a new branch from the `development` branch of the repository. You can -name the branch something descriptive related to the community project you are -adding, but remember to add a `content` prefix -(e.g.,`content/add-my-community-project`). +### Prepare your workspace on a separate fork + +All community project pages need be created on the separate forks of the +Fictionlab documentation repository. Creating a separate fork allows you to work +on your community project entry without affecting the main repository until you +are ready to submit a pull request. It also allows for better collaboration and +version control of your changes. + +To create a fork, click the "Fork" button at the top right corner of the +repository page on GitHub. This will create a copy of the repository under your +GitHub account where you can make your changes. More information on how to fork +a repository can be found in the +[Fork a repository - Github Docs](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo). + +When you are ready to submit your community project, you can create a pull +request from your fork to the main repository. After the pull request is +reviewed and approved by the Fictionlab team, your community project will be +merged and queued for release in the next documentation update. :::tip