Release v1.2.0: Newspaper-style layout with major UI refinements

This release transforms PING into a sophisticated newspaper-style digital
publication with enhanced readability and professional presentation.

Major Features:
- New FeaturedPostHero component with full-width newspaper design
- Completely redesigned homepage with responsive newspaper grid layout
- Enhanced PostCard component with refined typography and spacing
- Improved mobile-first responsive design (mobile → tablet → desktop → 2XL)
- Archive section with multi-column layout for deeper content discovery

Technical Improvements:
- Enhanced blog post validation and error handling in lib/blog.ts
- Better date handling and normalization for scheduled posts
- Improved Dockerfile with correct content volume mount paths
- Fixed port configuration (3025 throughout stack)
- Updated Tailwind config with refined typography and newspaper aesthetics
- Added getFeaturedPost() function for hero selection

UI/UX Enhancements:
- Professional newspaper-style borders and dividers
- Improved dark mode styling throughout
- Better content hierarchy and visual flow
- Enhanced author bylines and metadata presentation
- Refined color palette with newspaper sophistication

Documentation:
- Added DESIGN_BRIEF_NEWSPAPER_LAYOUT.md detailing design principles
- Added TESTING_RESULTS_25_POSTS.md with test scenarios

This release establishes PING as a premium publication platform for
AI orchestration and contextual intelligence thought leadership.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
anthonyrawlins
2025-10-19 00:23:51 +11:00
parent 796924499d
commit 5e0be60c30
40 changed files with 1865 additions and 324 deletions

View File

@@ -0,0 +1,159 @@
# CHORUS PING! - Newspaper-Style Blog Design Brief
## Vision Statement
Transform CHORUS PING! from a traditional blog layout into a sophisticated, newspaper-style digital publication that reflects the authority and depth of our AI content while maintaining the distinctive CHORUS brand identity.
## Design Inspiration
- **BBC News**: Clean hierarchy, excellent typography, sophisticated content organization
- **The Guardian**: Progressive enhancement, excellent mobile experience, clear content categorization
- **Financial Times**: Premium feel, data-rich presentations, professional authority
- **Wired**: Tech-forward design, engaging visuals, modern layouts
## Core Design Principles
### 1. Editorial Authority
- Establish CHORUS as a thought leader in AI orchestration and contextual intelligence
- Create clear content hierarchy that guides readers through complex technical topics
- Use typography and spacing to create reading flow similar to premium publications
### 2. Information Density with Clarity
- Display more content without overwhelming the user
- Use progressive disclosure - headlines first, then summaries, then full content
- Implement smart content categorization and filtering
### 3. Responsive Editorial Design
- Mobile-first approach with newspaper-quality typography at all screen sizes
- Flexible grid system that adapts content density to viewport
- Touch-friendly navigation that doesn't compromise desktop experience
## Layout Architecture
### Featured Articles Section (Limit: 5 maximum)
**Design**: Horizontal full-width panels in a sophisticated list layout
- **Large Featured (1-2 posts)**: Hero-style cards with large imagery area, headline, author, excerpt
- **Medium Featured (2-3 posts)**: Streamlined horizontal cards with smaller imagery, prominent headlines
- **Article Card Components**:
- High-quality placeholder imagery or AI-generated visuals
- Clear author attribution with professional headshots
- Publication date and read time
- Tag pills for topic categorization
- Excerpt text (2-3 lines)
### Recent Articles Grid
**Design**: Multi-column newspaper-style grid
- **Desktop**: 3-column grid with varied card heights for visual interest
- **Tablet**: 2-column responsive grid
- **Mobile**: Single column with horizontal card style
### Content Categories
**Primary Topics** (matching our content strategy):
- **AI Orchestration**: Agent coordination, workflow management
- **Contextual Intelligence**: RAG, knowledge graphs, temporal reasoning
- **Enterprise AI**: Implementation, governance, scaling
- **Research**: Latest papers, emerging techniques, industry analysis
- **Case Studies**: Real-world implementations, lessons learned
## Typography & Visual Hierarchy
### Font Strategy
- **Headlines**: Maintain CHORUS font-logo for brand consistency
- **Body Text**: Professional serif for readability (consider Inter, system fonts)
- **UI Elements**: Clean sans-serif (existing Carbon theme)
### Content Hierarchy
1. **Primary Headlines**: Large, bold, scannable
2. **Secondary Headlines**: Medium weight, clear categorization
3. **Bylines**: Author, date, read time - professional formatting
4. **Excerpts**: Engaging preview text that encourages click-through
5. **Metadata**: Tags, categories, sharing - subtle but accessible
## Advanced Features (Future Phases)
### Phase 2: Enhanced Navigation
- **Topic Pages**: Dedicated landing pages for each major category
- **Author Pages**: Professional author profiles with article archives
- **Search & Filter**: Advanced content discovery
- **Related Articles**: Intelligent content recommendations
### Phase 3: Interactive Elements
- **Reading Progress**: Article progress indicators
- **Save for Later**: Bookmark functionality
- **Newsletter Integration**: Email subscription with curated content
- **Social Proof**: View counts, social sharing, engagement metrics
### Phase 4: Editorial Tools
- **Publishing Calendar**: Visual content planning
- **Series Management**: Multi-part article series
- **Featured Content Rotation**: Automated or manual feature promotion
- **Analytics Dashboard**: Content performance insights
## Brand Integration
### CHORUS Visual Identity
- **Color Palette**: Maintain carbon/mulberry/ocean theme with newspaper sophistication
- **Logo Integration**: Three.js logo in header, subtle brand elements throughout
- **Visual Style**: Clean, professional, technically sophisticated
### Content Voice
- **Authoritative**: Position as industry thought leadership
- **Accessible**: Complex topics explained clearly
- **Forward-Looking**: Focus on emerging trends and future implications
- **Practical**: Balance theory with actionable insights
## Technical Considerations
### Performance Requirements
- **Fast Loading**: Optimized images, lazy loading, efficient rendering
- **SEO Optimized**: Structured data, semantic HTML, optimized metadata
- **Accessibility**: WCAG compliance, keyboard navigation, screen reader friendly
### Content Management
- **Markdown Workflow**: Maintain current content creation process
- **Dynamic Rendering**: Continue volume-mounted content approach
- **Scheduled Publishing**: Robust publication timing
- **Content Validation**: Ensure frontmatter consistency
### Development Approach
- **Progressive Enhancement**: Start with core functionality, add sophistication
- **Component Library**: Reusable newspaper-style components
- **Design System**: Consistent spacing, typography, interaction patterns
- **Testing**: A/B testing for layout effectiveness
## Success Metrics
### User Engagement
- **Time on Site**: Increased reading duration
- **Page Depth**: More articles consumed per session
- **Return Visits**: Higher reader retention
- **Content Discovery**: Better navigation between related articles
### Brand Positioning
- **Industry Recognition**: References and links from other AI publications
- **Subscriber Growth**: Newsletter and RSS subscriptions
- **Social Engagement**: Shares and discussions on professional platforms
- **Thought Leadership**: Speaking opportunities, collaboration requests
## Implementation Phases
### Phase 1: Core Layout (Immediate)
- Implement featured articles horizontal panels (max 5)
- Create newspaper-style grid for recent articles
- Establish responsive typography system
- Basic content categorization
### Phase 2: Enhanced Features (Next Sprint)
- Author pages and advanced metadata
- Improved mobile experience
- Search and filtering capabilities
- Related articles suggestions
### Phase 3: Editorial Tools (Future)
- Publishing workflow improvements
- Analytics and performance tracking
- Advanced content management features
- Interactive elements and engagement tools
## Conclusion
This newspaper-style redesign positions CHORUS PING! as a premium publication in the AI space, matching the sophistication of our technical content with a professional, authoritative presentation that encourages deeper engagement and establishes thought leadership in contextual AI orchestration.
The approach balances immediate improvements (better featured content presentation) with a long-term vision for a comprehensive digital publication platform that serves both casual readers and technical professionals seeking authoritative insights into AI orchestration and contextual intelligence.

View File

@@ -42,9 +42,9 @@ COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
# Create directories for mounted volumes
RUN mkdir -p /app/posts /app/scheduled
RUN chown -R nextjs:nodejs /app/posts /app/scheduled
# Create directories for mounted volumes (match app paths)
RUN mkdir -p /app/content/posts /app/content/scheduled
RUN chown -R nextjs:nodejs /app/content
USER nextjs

115
TESTING_RESULTS_25_POSTS.md Normal file
View File

@@ -0,0 +1,115 @@
# Blog Layout Testing Results - 25+ Posts
## Summary
Successfully tested the CHORUS PING! blog with 25 dummy posts to evaluate layout scaling and featured post handling. Made significant improvements to simplify the featured post logic and improve user experience.
## Before Improvements
- **Total Featured Posts**: 7 (too many, cluttered)
- **Recent Posts**: 6
- **Total Articles Displayed**: 13+
- **Layout Issues**:
- Overwhelming number of featured posts
- Poor visual hierarchy
- Difficult to scan content
- Not scalable for newspaper-style layout
## After Improvements
- **Featured Post**: 1 (most recent post automatically)
- **Recent Posts**: 6 (starting from 2nd most recent)
- **Total Articles Displayed**: 7
- **Layout Benefits**:
- Clean, scannable layout
- Clear visual hierarchy
- Single prominent featured article
- Ready for newspaper-style redesign
## Technical Changes Made
### 1. Simplified Featured Post Logic
**File**: `/lib/blog.ts`
```typescript
// OLD: Multiple featured posts based on frontmatter flag
export function getFeaturedPosts(): BlogPost[] {
const allPosts = getSortedPostsData()
return allPosts.filter(post => post.featured)
}
// NEW: Single featured post (most recent)
export function getFeaturedPost(): BlogPost | null {
const allPosts = getSortedPostsData()
return allPosts.length > 0 ? allPosts[0] : null
}
```
### 2. Updated Homepage Layout
**File**: `/app/page.tsx`
```typescript
// OLD: Multiple featured posts in grid
const featuredPosts = getFeaturedPosts()
const recentPosts = allPosts.slice(0, 6)
// NEW: Single featured post, adjusted recent posts
const featuredPost = getFeaturedPost()
const recentPosts = allPosts.slice(1, 7) // Skip first post since it's featured
```
### 3. Improved Section Structure
- **Featured Post Section**: Single, prominent article with larger card design
- **Recent Posts Section**: Grid of 6 articles (excluding the featured one)
- **Eliminated**: Dependency on `featured: true` frontmatter flag
## Content Analysis
**Generated 25 test posts with**:
- **Authors**: 4 different authors (Anthony Rawlins, Sarah Chen, Marcus Rodriguez, Dr. Elena Vasquez)
- **Publication Dates**: Spread across 2023-2025
- **Tags**: Mixed combinations from AI/orchestration topics
- **Reading Times**: 3-8 minutes varied
- **Content Quality**: Realistic AI-focused content matching domain expertise
## Layout Scaling Observations
### ✅ What Works Well
1. **Single Featured Post**: Creates clear focus point
2. **Grid Layout**: Handles 6 recent posts elegantly
3. **Responsive Design**: Scales well across screen sizes
4. **Visual Hierarchy**: Clear distinction between featured and recent
5. **Performance**: No significant slowdown with 25+ posts
### 🔄 Areas for Newspaper-Style Improvement
1. **Featured Section**: Could use full-width horizontal layout
2. **Content Density**: More articles could be shown newspaper-style
3. **Categorization**: Topic-based sections would improve organization
4. **Typography**: Could be more newspaper-like with better font hierarchy
5. **Pagination**: May need "Load More" or pagination for 25+ posts
## Next Steps for Newspaper Design
### Phase 1: Enhanced Featured Section
- Convert featured post to full-width horizontal panel
- Add larger imagery area and better typography
- Consider 2-3 sub-featured posts in smaller panels
### Phase 2: Content Organization
- Implement topic-based sections (AI Orchestration, Research, etc.)
- Add "Load More" functionality for older posts
- Create author pages and topic filtering
### Phase 3: Visual Polish
- Newspaper-style typography improvements
- Better use of whitespace and visual hierarchy
- Enhanced mobile experience
## Performance Notes
- **Dynamic Rendering**: Successfully reads 25+ posts at request time
- **Load Time**: No noticeable performance degradation
- **Memory Usage**: Efficient handling of large content volume
- **SEO Impact**: Single featured post improves content prioritization
## Conclusion
The simplified featured post logic significantly improves the blog's usability and scalability. The layout now supports the vision of a newspaper-style publication while maintaining clean, scannable content presentation. Ready for the next phase of newspaper-style redesign as outlined in the design brief.
## Test Environment
- **Local Development**: `http://localhost:3024`
- **Content Location**: `modules/blog/content/posts/` (25 dummy posts)
- **Backup**: Original content preserved in `content-backup/`
- **Testing Date**: August 28, 2025

View File

@@ -194,78 +194,14 @@ body {
}
/* CHORUS Blog Typography */
.prose {
@apply max-w-none text-carbon-950 dark:text-carbon-100;
}
.prose h1 {
@apply text-h2 font-sans font-thin text-carbon-950 dark:text-mulberry-100 mb-8;
}
.prose h2 {
@apply text-h3 font-logo text-carbon-950 dark:text-mulberry-200 mb-6 mt-12;
}
.prose h3 {
@apply text-h4 font-sans text-carbon-950 dark:text-mulberry-300 mb-4 mt-8;
}
.prose h4 {
@apply text-h5 font-sans text-carbon-800 dark:text-mulberry-400 mb-3 mt-6;
}
.prose h5 {
@apply text-h6 font-sans text-carbon-700 dark:text-mulberry-500 mb-3 mt-6;
}
.prose h6 {
@apply text-h7 font-sans text-carbon-600 dark:text-mulberry-600 mb-2 mt-4;
}
.prose p {
@apply text-base leading-relaxed mb-6 text-carbon-800 dark:text-carbon-200;
}
.prose a {
@apply text-ocean-600 dark:text-ocean-400 hover:text-ocean-800 dark:hover:text-ocean-300 transition-colors underline decoration-ocean-500/30 hover:decoration-ocean-600/50 dark:hover:decoration-ocean-400/50;
}
.prose strong {
@apply text-carbon-950 dark:text-carbon-100 font-semibold;
}
.prose code {
@apply bg-carbon-200 dark:bg-carbon-800 text-eucalyptus-700 dark:text-eucalyptus-400 px-2 py-1 rounded-sm font-mono text-sm;
}
.prose pre {
@apply bg-carbon-100 dark:bg-carbon-900 border border-carbon-300 dark:border-carbon-700 rounded-lg overflow-x-auto p-4 mb-6;
}
.prose pre code {
@apply bg-transparent text-carbon-950 dark:text-carbon-200 p-0;
}
.prose blockquote {
@apply border-l-4 border-carbon-400 dark:border-mulberry-600 pl-6 italic text-carbon-600 dark:text-carbon-300 my-6;
}
.prose ul {
@apply list-disc pl-6 mb-6 space-y-2;
}
.prose ol {
@apply list-decimal pl-6 mb-6 space-y-2;
}
.prose li {
@apply text-carbon-800 dark:text-carbon-200;
}
/* Blog-specific utilities */
.blog-container {
@apply max-w-4xl mx-auto px-4 sm:px-6 lg:px-8;
padding-bottom: 0;
margin-bottom: 0;
border-bottom: none;
}
.blog-meta {

View File

@@ -1,68 +1,253 @@
import { getSortedPostsData, getFeaturedPosts } from '@/lib/blog'
import { getSortedPostsData, getFeaturedPost } from '@/lib/blog'
import BlogHeader from '@/components/BlogHeader'
import BlogFooter from '@/components/BlogFooter'
import PostCard from '@/components/PostCard'
import FeaturedPostHero from '@/components/FeaturedPostHero'
export default function HomePage() {
// Force dynamic rendering to pick up volume-mounted content
export const dynamic = 'force-dynamic'
export default async function HomePage() {
const allPosts = getSortedPostsData()
const featuredPosts = getFeaturedPosts()
const recentPosts = allPosts.slice(0, 6)
const featuredPost = getFeaturedPost()
const recentPosts = allPosts.slice(1, 7) // Skip the first post since it's featured
const additionalPosts = allPosts.slice(8, 20) // Additional posts for newspaper columns
return (
<main className="min-h-screen">
<BlogHeader />
{/* Hero Section */}
<section className="blog-container py-16">
<div className="max-w-3xl mx-auto text-center">
<h1 className="text-h1 font-logo text-carbon-950 dark:text-mulberry-100 mb-6">
Informed Agentic AI
</h1>
<p className="text-xl text-carbon-700 dark:text-carbon-300 leading-relaxed">
Deep dives into AI orchestration, agent coordination, and the future of
intelligent systems from the team building CHORUS.
</p>
{/* Featured Post - Full Width Hero */}
{featuredPost && (
<FeaturedPostHero post={featuredPost} />
)}
{/* Recent Posts - Responsive Newspaper Layout */}
<section className="w-full px-4 sm:px-8 py-16 border-t border-carbon-200 dark:border-carbon-800">
{/* Section Header - Newspaper Style */}
<div className="max-w-6xl mx-auto">
{recentPosts.length > 0 ? (
<div className="flex flex-col 2xl:flex-row gap-8">
{/* Main Content Area - Primary Articles */}
<div className="flex-1 max-w-6xl mx-auto 2xl:mx-0">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-x-12 gap-y-8">
{recentPosts.slice(0, 4).map((post) => (
<PostCard key={post.slug} post={post} />
))}
</div>
</div>
{/* Sidebar Articles - Only on 2XL+ screens if more articles available */}
{/* {recentPosts.length > 4 && (
<aside className="hidden 2xl:block w-80 space-y-6">
<div className="bg-sand-50/50 dark:bg-carbon-900/30 border border-carbon-200 dark:border-carbon-800 p-6 rounded-lg">
<h3 className="font-bold text-carbon-950 dark:text-carbon-100 mb-4 text-lg border-b border-carbon-300 dark:border-carbon-700 pb-2">
More Analysis
</h3>
<div className="space-y-4">
{recentPosts.slice(4, 7).map((post) => (
<article key={post.slug} className="group">
<a href={`/posts/${post.slug}`} className="block">
<div className="mb-1">
<span className="text-mulberry-600 dark:text-mulberry-400 text-xs font-bold uppercase tracking-wide">
{post.tags?.[0] || 'Analysis'}
</span>
</div>
<h4 className="text-sm font-bold text-carbon-950 dark:text-carbon-100 leading-tight mb-2 group-hover:text-carbon-700 dark:group-hover:text-mulberry-200 transition-colors">
{post.title}
</h4>
<div className="flex items-center text-xxs text-carbon-600 dark:text-carbon-500">
<span>{post.author?.name || 'CHORUS Team'}</span>
<span className="mx-1">•</span>
<span>{post.readingTime} min read</span>
</div>
</a>
</article>
))}
</div>
</div>
</aside>
)} */}
</div>
) : (
<div className="text-center py-12">
<div className="w-16 h-16 bg-carbon-200 dark:bg-carbon-800 rounded-full flex items-center justify-center mx-auto mb-4">
<svg className="w-8 h-8 text-carbon-600 dark:text-carbon-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" />
</svg>
</div>
<h3 className="text-h5 font-semibold text-carbon-950 dark:text-carbon-200 mb-2">Coming Soon</h3>
<p className="text-carbon-600 dark:text-carbon-400 max-w-md mx-auto">
We're preparing some excellent content about contextual AI and agent orchestration.
Check back soon for our first posts!
</p>
</div>
)}
</div>
</section>
{/* Featured Posts */}
{featuredPosts.length > 0 && (
<section className="blog-container py-8">
<h2 className="text-h3 font-logo text-carbon-950 dark:text-carbon-100 mb-8">Featured Posts</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
{featuredPosts.map((post) => (
<PostCard key={post.slug} post={post} featured={true} />
))}
{/* Newspaper Column Layout - Additional Articles */}
{additionalPosts.length > 0 && (
<section className="w-full px-4 sm:px-8 py-16 border-t border-carbon-200 dark:border-carbon-800 bg-sand-25/20 dark:bg-carbon-950/50">
<div className="max-w-6xl mx-auto">
{/* Section Header */}
<div className="flex items-center mb-12">
<div className="flex-1 h-px bg-carbon-300 dark:bg-carbon-700"></div>
<div className="px-6">
<h2 className="text-2xl md:text-3xl font-bold text-carbon-950 dark:text-carbon-100 text-center">
Archive
</h2>
<p className="text-center text-carbon-600 dark:text-carbon-500 text-sm mt-1 italic">
Deeper insights and analysis
</p>
</div>
<div className="flex-1 h-px bg-carbon-300 dark:bg-carbon-700"></div>
</div>
{/* Flexbox Newspaper Columns - 4 Narrow Equal Columns */}
<div className="hidden lg:flex gap-6">
{/* Column 1 */}
<div className="flex-1 space-y-4">
{additionalPosts.slice(0, 3).map((post) => (
<article key={post.slug} className="group border-b border-carbon-200 dark:border-carbon-700 pb-4 mb-4">
<a href={`/posts/${post.slug}`} className="block">
{/* <div className="mb-2">
<span className="text-mulberry-600 dark:text-mulberry-400 text-xs font-bold uppercase tracking-wide">
{post.tags?.[0] || 'Analysis'}
</span>
</div> */}
<h3 className="text-sm font-bold text-carbon-950 dark:text-carbon-100 leading-tight mb-2 group-hover:text-carbon-700 dark:group-hover:text-mulberry-200 transition-colors">
{post.title}
</h3>
<div className="mb-chorus-sm flex items-center text-xxs text-carbon-500 dark:text-carbon-600">
<span>{post.author?.name || 'CHORUS Team'}</span>
<span className="mx-1">•</span>
<span>{post.readingTime} min</span>
</div>
<p className="text-xs text-carbon-600 dark:text-carbon-400 leading-relaxed mb-2 line-clamp-3">
{post.description}
</p>
</a>
</article>
))}
</div>
{/* Column 2 */}
<div className="flex-1 space-y-4">
{additionalPosts.slice(3, 6).map((post) => (
<article key={post.slug} className="group border-b border-carbon-200 dark:border-carbon-700 pb-4 mb-4">
<a href={`/posts/${post.slug}`} className="block">
{/* <div className="mb-2">
<span className="text-mulberry-600 dark:text-mulberry-400 text-xs font-bold uppercase tracking-wide">
{post.tags?.[0] || 'Analysis'}
</span>
</div> */}
<h3 className="text-sm font-bold text-carbon-950 dark:text-carbon-100 leading-tight mb-2 group-hover:text-carbon-700 dark:group-hover:text-mulberry-200 transition-colors">
{post.title}
</h3>
<div className="mb-chorus-sm flex items-center text-xxs text-carbon-500 dark:text-carbon-600">
<span>{post.author?.name || 'CHORUS Team'}</span>
<span className="mx-1">•</span>
<span>{post.readingTime} min</span>
</div>
<p className="text-xs text-carbon-600 dark:text-carbon-400 leading-relaxed mb-2 line-clamp-3">
{post.description}
</p>
</a>
</article>
))}
</div>
{/* Column 3 */}
<div className="flex-1 space-y-4">
{additionalPosts.slice(6, 9).map((post) => (
<article key={post.slug} className="group border-b border-carbon-200 dark:border-carbon-700 pb-4 mb-4">
<a href={`/posts/${post.slug}`} className="block">
{/* <div className="mb-2">
<span className="text-mulberry-600 dark:text-mulberry-400 text-xs font-bold uppercase tracking-wide">
{post.tags?.[0] || 'Analysis'}
</span>
</div> */}
<h3 className="text-sm font-bold text-carbon-950 dark:text-carbon-100 leading-tight mb-2 group-hover:text-carbon-700 dark:group-hover:text-mulberry-200 transition-colors">
{post.title}
</h3>
<div className="mb-chorus-sm flex items-center text-xxs text-carbon-500 dark:text-carbon-600">
<span>{post.author?.name || 'CHORUS Team'}</span>
<span className="mx-1">•</span>
<span>{post.readingTime} min</span>
</div>
<p className="text-xs text-carbon-600 dark:text-carbon-400 leading-relaxed mb-2 line-clamp-3">
{post.description}
</p>
</a>
</article>
))}
</div>
{/* Column 4 */}
<div className="flex-1 space-y-4">
{additionalPosts.slice(9, 12).map((post) => (
<article key={post.slug} className="group border-b border-carbon-200 dark:border-carbon-700 pb-4 mb-4">
<a href={`/posts/${post.slug}`} className="block">
{/* <div className="mb-2">
<span className="text-mulberry-600 dark:text-mulberry-400 text-xs font-bold uppercase tracking-wide">
{post.tags?.[0] || 'Analysis'}
</span>
</div> */}
<h3 className="text-sm font-bold text-carbon-950 dark:text-carbon-100 leading-tight mb-2 group-hover:text-carbon-700 dark:group-hover:text-mulberry-200 transition-colors">
{post.title}
</h3>
<div className="mb-chorus-sm flex items-center text-xxs text-carbon-500 dark:text-carbon-600">
<span>{post.author?.name || 'CHORUS Team'}</span>
<span className="mx-1">•</span>
<span>{post.readingTime} min</span>
</div>
<p className="text-xs text-carbon-600 dark:text-carbon-400 leading-relaxed mb-2 line-clamp-3">
{post.description}
</p>
</a>
</article>
))}
</div>
</div>
{/* Mobile/Tablet Fallback - Single Column */}
<div className="lg:hidden space-y-6">
{additionalPosts.slice(0, 8).map((post) => (
<article key={post.slug} className="group border-b border-carbon-200 dark:border-carbon-700 pb-4 mb-4">
<a href={`/posts/${post.slug}`} className="block">
<div className="mb-2">
<span className="text-mulberry-600 dark:text-mulberry-400 text-xs font-bold uppercase tracking-wide">
{post.tags?.[0] || 'Analysis'}
</span>
</div>
<h3 className="text-lg font-bold text-carbon-950 dark:text-carbon-100 leading-tight mb-3 group-hover:text-carbon-700 dark:group-hover:text-mulberry-200 transition-colors">
{post.title}
</h3>
<p className="text-sm text-carbon-600 dark:text-carbon-400 leading-relaxed mb-3">
{post.description}
</p>
<div className="flex items-center text-xxs text-carbon-500 dark:text-carbon-600">
<span>{post.author?.name || 'CHORUS Team'}</span>
<span className="mx-2">•</span>
<time dateTime={post.date}>
{new Date(post.date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}
</time>
<span className="mx-2"></span>
<span>{post.readingTime} min read</span>
</div>
</a>
</article>
))}
</div>
</div>
</section>
)}
{/* Recent Posts */}
<section className="blog-container py-12">
<h2 className="text-h3 font-logo text-carbon-950 dark:text-carbon-100 mb-8">Recent Posts</h2>
{recentPosts.length > 0 ? (
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
{recentPosts.map((post) => (
<PostCard key={post.slug} post={post} />
))}
</div>
) : (
<div className="text-center py-12">
<div className="w-16 h-16 bg-carbon-200 dark:bg-carbon-800 rounded-full flex items-center justify-center mx-auto mb-4">
<svg className="w-8 h-8 text-carbon-600 dark:text-carbon-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" />
</svg>
</div>
<h3 className="text-h5 font-semibold text-carbon-950 dark:text-carbon-200 mb-2">Coming Soon</h3>
<p className="text-carbon-600 dark:text-carbon-400 max-w-md mx-auto">
We're preparing some excellent content about contextual AI and agent orchestration.
Check back soon for our first posts!
</p>
</div>
)}
</section>
<BlogFooter />
</main>
)
}
}

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation'
import { MDXRemote } from 'next-mdx-remote/rsc'
import { getPostData, getAllPostSlugs } from '@/lib/blog'
import { getPostData } from '@/lib/blog'
import BlogHeader from '@/components/BlogHeader'
import BlogFooter from '@/components/BlogFooter'
import Link from 'next/link'
@@ -15,10 +15,8 @@ interface PostPageProps {
}>
}
export async function generateStaticParams() {
const slugs = getAllPostSlugs()
return slugs.map(({ params }) => ({ slug: params.slug }))
}
// Force dynamic rendering - no static generation
export const dynamic = 'force-dynamic'
export async function generateMetadata({ params }: PostPageProps) {
const { slug } = await params
@@ -102,38 +100,38 @@ export default async function PostPage({ params }: PostPageProps) {
))}
</div>
<h1 className="text-h1 font-logo text-carbon-950 dark:text-mulberry-100 mb-6">
<h1 className="text-2xl sm:text-3xl md:text-4xl lg:text-h1 font-bold text-carbon-950 dark:text-mulberry-100 mb-6 leading-tight">
{post.title}
</h1>
<p className="text-xl text-carbon-700 dark:text-carbon-300 leading-relaxed mb-8">
<p className="text-base sm:text-lg md:text-xl text-carbon-700 dark:text-carbon-300 leading-relaxed mb-8">
{post.description}
</p>
<div className="flex items-center justify-between border-b border-carbon-300 dark:border-carbon-800 pb-8">
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between border-b border-carbon-300 dark:border-carbon-800 pb-8 gap-4">
<div className="flex items-center space-x-4">
<div className="w-12 h-12 bg-gradient-to-br from-mulberry-400 to-ocean-500 rounded-full flex items-center justify-center">
<span className="text-carbon-950 font-semibold">
<div className="w-10 h-10 sm:w-12 sm:h-12 bg-gradient-to-br from-mulberry-400 to-ocean-500 rounded-full flex items-center justify-center">
<span className="text-carbon-950 font-semibold text-sm sm:text-base">
{post.author.name.charAt(0)}
</span>
</div>
<div>
<p className="text-carbon-950 dark:text-carbon-200 font-medium">
<p className="text-carbon-950 dark:text-carbon-200 font-medium text-sm sm:text-base">
{post.author.name}
</p>
{post.author.role && (
<p className="text-carbon-600 dark:text-carbon-500 text-sm">
<p className="text-carbon-600 dark:text-carbon-500 text-xs sm:text-sm">
{post.author.role}
</p>
)}
</div>
</div>
<div className="blog-meta text-right">
<time dateTime={post.date} className="block">
<div className="blog-meta sm:text-right">
<time dateTime={post.date} className="block text-sm sm:text-base">
{formattedDate}
</time>
<span className="text-carbon-600 dark:text-carbon-600">
<span className="text-carbon-600 dark:text-carbon-600 text-xs sm:text-sm">
{post.readingTime} min read
</span>
</div>
@@ -141,7 +139,7 @@ export default async function PostPage({ params }: PostPageProps) {
</header>
{/* Article content */}
<div className="prose prose-lg max-w-none">
<div className="prose prose-lg max-w-none dark:prose-invert">
<MDXRemote source={post.content} options={mdxOptions} />
</div>

View File

@@ -1,6 +1,9 @@
import { getSortedPostsData } from '@/lib/blog'
import { NextResponse } from 'next/server'
// Force dynamic rendering to pick up volume-mounted content
export const dynamic = 'force-dynamic'
// RSS feed configuration
const SITE_URL = 'https://blog.chorus.services'
const SITE_TITLE = 'CHORUS Services Blog'

View File

@@ -5,69 +5,56 @@ export default function BlogFooter() {
return (
<footer className="bg-white/80 dark:bg-carbon-950/80 backdrop-blur-md border-t border-carbon-200/50 dark:border-carbon-800/50 mt-24">
<div className="blog-container py-12">
<div className="grid grid-cols-1 md:grid-cols-4 gap-8">
<div className="col-span-1 md:col-span-2">
<div className="flex items-center space-x-3 mb-4">
<div className="w-10 h-10">
<ThreeLogo className="w-full h-full" />
</div>
<div className="flex flex-col">
<span className="font-logo font-semibold text-lg leading-none text-carbon-900 dark:text-carbon-100">CHORUS</span>
<span className="text-carbon-600 dark:text-carbon-500 text-xs font-medium">PING!</span>
</div>
{/* Centered Masthead Footer */}
<div className="flex flex-col items-center text-center space-y-8">
{/* Logo Group - Centered */}
<div className="flex items-center space-x-4">
<div className="w-12 h-12">
<ThreeLogo className="w-full h-full" />
</div>
<p className="text-carbon-600 dark:text-carbon-400 text-sm leading-relaxed mb-6 max-w-md">
Insights and deep dives into Context Engineering for Agentic AI and Orchestration, Agent Collaboration,
and the future of intelligent systems.
</p>
<div className="flex space-x-4">
<Link
href="https://www.linkedin.com/in/anthonylewisrawlins"
className="text-carbon-600 dark:text-carbon-500 hover:text-carbon-800 dark:hover:text-carbon-300 transition-colors"
>
<span className="sr-only">LinkedIn</span>
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M16.338 16.338H13.67V12.16c0-.995-.017-2.277-1.387-2.277-1.39 0-1.601 1.086-1.601 2.207v4.248H8.014v-8.59h2.559v1.174h.037c.356-.675 1.227-1.387 2.526-1.387 2.703 0 3.203 1.778 3.203 4.092v4.711zM5.005 6.575a1.548 1.548 0 11-.003-3.096 1.548 1.548 0 01.003 3.096zm-1.337 9.763H6.34v-8.59H3.667v8.59zM17.668 1H2.328C1.595 1 1 1.581 1 2.298v15.403C1 18.418 1.595 19 2.328 19h15.34c.734 0 1.332-.582 1.332-1.299V2.298C19 1.581 18.402 1 17.668 1z" clipRule="evenodd"/>
</svg>
</Link>
<div className="flex flex-col">
<span className="font-logo font-thin text-2xl leading-none text-carbon-900 dark:text-carbon-100 text-center">CHORUS</span>
<span className="text-carbon-600 dark:text-carbon-500 text-sm font-bold tracking-wider text-left">PING!</span>
</div>
</div>
<div>
<h3 className="text-carbon-900 dark:text-carbon-100 font-semibold mb-4">Blog</h3>
<ul className="space-y-2 text-sm">
<li>
<Link href="/" className="text-carbon-600 dark:text-carbon-400 hover:text-carbon-800 dark:hover:text-carbon-200 transition-colors">
All Posts
</Link>
</li>
<li>
<Link href="/tags" className="text-carbon-600 dark:text-carbon-400 hover:text-carbon-800 dark:hover:text-carbon-200 transition-colors">
Topics
</Link>
</li>
<li>
<Link href="/rss.xml" className="text-carbon-600 dark:text-carbon-400 hover:text-carbon-800 dark:hover:text-carbon-200 transition-colors">
RSS Feed
</Link>
</li>
</ul>
{/* Description */}
<p className="text-carbon-600 dark:text-carbon-400 text-sm leading-relaxed max-w-2xl">
Insights and deep dives into Context Engineering for Agentic AI and Orchestration, Agent Collaboration,
and the future of intelligent systems.
</p>
{/* Navigation Links */}
<div className="flex items-center justify-center space-x-6 border-t border-b border-carbon-200 dark:border-carbon-800 py-4 w-full max-w-xl">
<Link href="/" className="text-carbon-600 dark:text-carbon-400 hover:text-carbon-800 dark:hover:text-carbon-200 transition-colors text-sm font-medium uppercase tracking-wide">
All Posts
</Link>
<span className="text-carbon-300 dark:text-carbon-700"></span>
<Link href="https://chorus.services" className="text-carbon-600 dark:text-carbon-400 hover:text-carbon-800 dark:hover:text-carbon-200 transition-colors text-sm font-medium uppercase tracking-wide">
Platform
</Link>
<span className="text-carbon-300 dark:text-carbon-700"></span>
<Link href="/rss.xml" className="text-carbon-600 dark:text-carbon-400 hover:text-carbon-800 dark:hover:text-carbon-200 transition-colors text-sm font-medium uppercase tracking-wide">
RSS
</Link>
</div>
<div>
<h3 className="text-carbon-900 dark:text-carbon-100 font-semibold mb-4">CHORUS</h3>
<ul className="space-y-2 text-sm">
<li>
<Link href="https://chorus.services" className="text-carbon-600 dark:text-carbon-400 hover:text-carbon-800 dark:hover:text-carbon-200 transition-colors">
Platform
</Link>
</li>
</ul>
{/* Social Links */}
<div className="flex space-x-4">
<Link
href="https://www.linkedin.com/in/anthonylewisrawlins"
className="text-carbon-600 dark:text-carbon-500 hover:text-carbon-800 dark:hover:text-carbon-300 transition-colors"
>
<span className="sr-only">LinkedIn</span>
<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M16.338 16.338H13.67V12.16c0-.995-.017-2.277-1.387-2.277-1.39 0-1.601 1.086-1.601 2.207v4.248H8.014v-8.59h2.559v1.174h.037c.356-.675 1.227-1.387 2.526-1.387 2.703 0 3.203 1.778 3.203 4.092v4.711zM5.005 6.575a1.548 1.548 0 11-.003-3.096 1.548 1.548 0 01.003 3.096zm-1.337 9.763H6.34v-8.59H3.667v8.59zM17.668 1H2.328C1.595 1 1 1.581 1 2.298v15.403C1 18.418 1.595 19 2.328 19h15.34c.734 0 1.332-.582 1.332-1.299V2.298C19 1.581 18.402 1 17.668 1z" clipRule="evenodd"/>
</svg>
</Link>
</div>
</div>
<div className="border-t border-carbon-200 dark:border-carbon-800 mt-8 pt-8 text-center">
<p className="text-carbon-600 dark:text-carbon-500 text-sm">
<p className="text-carbon-600 dark:text-carbon-500 text-xxs">
© {new Date().getFullYear()} CHORUS Services. Built with care by{' '}
<Link href="https://deepblack.cloud" className="text-carbon-700 dark:text-carbon-400 hover:text-carbon-900 dark:hover:text-carbon-200 transition-colors">
Deep Black Cloud

View File

@@ -20,54 +20,49 @@ export default function BlogHeader() {
return (
<header className={`sticky top-0 z-50 transition-all duration-300 ${
isScrolled
? 'bg-white/80 dark:bg-carbon-950/80 backdrop-blur-md border-b border-carbon-200/50 dark:border-carbon-800/50'
: 'bg-white/20 dark:bg-carbon-950/20 backdrop-blur-sm'
? 'bg-white/80 dark:bg-mulberry-950/80 backdrop-blur-md border-b border-carbon-200/50 dark:border-carbon-800/50'
: 'bg-white/20 dark:bg-mulberry-950/20 backdrop-blur-sm'
}`}>
<nav className="blog-container py-chorus-lg">
<div className="flex items-center justify-between">
<Link href="/" className="flex items-center space-x-3 group">
<div className="w-14 h-14 group-hover:scale-110 transition-transform">
{/* Traditional Newspaper Masthead Layout */}
<div className="flex flex-col items-center space-y-4">
{/* Logo Group - Centered */}
<Link href="/" className="flex items-center space-x-4 group">
<div className="w-16 h-16 group-hover:scale-110 transition-transform">
<ThreeLogo className="w-full h-full" />
</div>
<div className="flex flex-col">
<span className="font-logo font-semibold text-lg leading-none text-carbon-900 dark:text-carbon-100">CHORUS</span>
<span className="text-carbon-600 dark:text-carbon-500 text-xs font-medium">PING!</span>
<span className="font-logo font-thin text-3xl leading-none text-carbon-900 dark:text-carbon-100 text-center">CHORUS</span>
<span className="text-carbon-600 dark:text-carbon-500 text-sm font-bold tracking-wider text-left">PING!</span>
</div>
</Link>
<div className="hidden md:flex items-center space-x-8">
{/* Navigation Bar - Below Logo */}
<div className="flex items-center justify-center space-x-8 border-t border-b border-carbon-200 dark:border-carbon-800 py-3 w-full max-w-2xl">
<Link
href="https://chorus.services"
className="text-carbon-600 dark:text-carbon-300 hover:text-carbon-900 dark:hover:text-carbon-100 transition-colors font-semibold"
className="text-carbon-600 dark:text-carbon-300 hover:text-carbon-900 dark:hover:text-carbon-100 transition-colors font-medium text-sm uppercase tracking-wide"
>
Home
</Link>
<span className="text-carbon-300 dark:text-carbon-700"></span>
<Link
href="/"
className="text-carbon-600 dark:text-carbon-300 hover:text-carbon-900 dark:hover:text-carbon-100 transition-colors font-semibold"
className="text-carbon-600 dark:text-carbon-300 hover:text-carbon-900 dark:hover:text-carbon-100 transition-colors font-medium text-sm uppercase tracking-wide"
>
All Posts
</Link>
{/* <Link
href="/tags"
className="text-carbon-600 dark:text-carbon-300 hover:text-carbon-900 dark:hover:text-carbon-100 transition-colors font-semibold"
>
Topics
</Link> */}
</div>
<div className="flex items-center space-x-4">
<ThemeToggle />
<Link
href="https://chorus.services"
className="px-4 py-2 bg-carbon-900 dark:bg-mulberry-700 hover:bg-carbon-800 dark:hover:bg-mulberry-600 text-white dark:text-mulberry-100 rounded-lg font-medium transition-colors text-sm"
>
Join Waitlist
</Link>
<span className="text-carbon-300 dark:text-carbon-700"></span>
<div className="flex items-center space-x-4">
<Link
href="https://chorus.services"
className="px-3 py-1 bg-carbon-900 dark:bg-mulberry-700 hover:bg-carbon-800 dark:hover:bg-mulberry-600 text-white dark:text-mulberry-100 rounded font-medium transition-colors text-xs uppercase tracking-wide"
>
Join Waitlist
</Link>
<ThemeToggle />
</div>
</div>
</div>
</nav>

View File

@@ -0,0 +1,121 @@
import Link from 'next/link'
import { BlogPost } from '@/types/blog'
interface FeaturedPostHeroProps {
post: BlogPost
}
export default function FeaturedPostHero({ post }: FeaturedPostHeroProps) {
const formattedDate = new Date(post.date).toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric'
})
return (
<article className="group border-y-2 border-carbon-300 dark:border-carbon-700 bg-gradient-to-r from-white via-sand-50 to-white dark:from-carbon-950 dark:via-mulberry-950/30 dark:to-carbon-950 transition-all duration-300">
<Link href={`/posts/${post.slug}`} className="block">
<div className="max-w-6xl mx-auto px-8 py-12">
{/* Newspaper-style header */}
<div className="flex items-center space-x-4 mb-6">
<div className="h-px bg-carbon-400 dark:bg-carbon-600 flex-1"></div>
<div className="bg-carbon-900 dark:bg-mulberry-700 text-white dark:text-mulberry-100 px-4 py-1 text-xs font-bold uppercase tracking-wider">
Featured Article
</div>
<div className="h-px bg-carbon-400 dark:bg-carbon-600 flex-1"></div>
</div>
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8 items-center">
{/* Main content - spans 2 columns on large screens */}
<div className="lg:col-span-2">
{/* Newspaper-style kicker */}
<div className="mb-4">
<span className="text-mulberry-700 dark:text-mulberry-400 text-sm font-bold uppercase tracking-wide">
{post.tags?.[0] || 'Contextual AI'}
</span>
</div>
{/* Large headline */}
<h1 className="text-3xl md:text-4xl lg:text-5xl font-bold text-carbon-950 dark:text-carbon-100 leading-tight mb-6 group-hover:text-carbon-700 dark:group-hover:text-mulberry-200 transition-colors">
{post.title}
</h1>
{/* Subhead/description */}
<p className="text-xl md:text-2xl text-carbon-700 dark:text-carbon-300 leading-relaxed mb-6 font-light">
{post.description}
</p>
{/* Byline and meta */}
<div className="flex items-center space-x-6 text-sm">
<div className="flex items-center space-x-3">
<div className="w-10 h-10 bg-gradient-to-br from-mulberry-400 to-ocean-500 rounded-full flex items-center justify-center">
<span className="text-carbon-950 font-bold text-sm">
{post.author?.name?.charAt(0) || 'C'}
</span>
</div>
<div>
<p className="text-carbon-950 dark:text-carbon-100 font-semibold">
By {post.author?.name || 'CHORUS Team'}
</p>
{post.author?.role && (
<p className="text-carbon-600 dark:text-carbon-500 text-xs">
{post.author.role}
</p>
)}
</div>
</div>
<div className="h-4 w-px bg-carbon-400 dark:bg-carbon-600"></div>
<div className="text-carbon-600 dark:text-carbon-500">
<time dateTime={post.date} className="font-medium">
{formattedDate}
</time>
<span className="mx-2"></span>
<span>{post.readingTime} min read</span>
</div>
</div>
</div>
{/* Sidebar - article highlights */}
<div className="lg:col-span-1">
<div className="bg-sand-100/50 dark:bg-carbon-900/50 border border-carbon-200 dark:border-carbon-800 p-6 rounded-lg">
<h3 className="font-bold text-carbon-950 dark:text-carbon-100 mb-4 text-lg border-b border-carbon-300 dark:border-carbon-700 pb-2">
In This Article
</h3>
<ul className="space-y-2 text-sm text-carbon-700 dark:text-carbon-300">
<li className="flex items-start space-x-2">
<span className="text-mulberry-600 dark:text-mulberry-400 mt-1"></span>
<span>Key insights into AI orchestration</span>
</li>
<li className="flex items-start space-x-2">
<span className="text-mulberry-600 dark:text-mulberry-400 mt-1"></span>
<span>Real-world implementation strategies</span>
</li>
<li className="flex items-start space-x-2">
<span className="text-mulberry-600 dark:text-mulberry-400 mt-1"></span>
<span>Future implications for the industry</span>
</li>
</ul>
{/* Tags */}
<div className="mt-6 pt-4 border-t border-carbon-300 dark:border-carbon-700">
<p className="text-xs text-carbon-600 dark:text-carbon-500 mb-2 font-medium uppercase tracking-wide">
Topics
</p>
<div className="flex flex-wrap gap-1">
{post.tags?.slice(0, 4).map((tag) => (
<span key={tag} className="bg-carbon-200 dark:bg-carbon-800 text-carbon-700 dark:text-carbon-300 px-2 py-1 text-xs rounded font-medium">
{tag}
</span>
))}
</div>
</div>
</div>
</div>
</div>
</div>
</Link>
</article>
)
}

View File

@@ -9,77 +9,53 @@ interface PostCardProps {
export default function PostCard({ post, featured = false }: PostCardProps) {
const formattedDate = new Date(post.date).toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
month: 'short',
day: 'numeric'
})
// Newspaper-style card - clean, minimal, text-focused
return (
<article className={`group ${
featured
? 'bg-gradient-to-b from-sand-200 to-sand-100 dark:from-mulberry-900 to-mulberry-700 border border-carbon-200 dark:border-carbon-800 p-chorus-lg hover:border-carbon-400 dark:hover:border-mulberry-700 transition-all duration-300'
: 'bg-gradient-to-b from-sand-100 to-sand-50 dark:from-mulberry-800 to-mulberry-800 border border-carbon-200/50 dark:border-carbon-800/50 p-chorus-lg hover:bg-carbon-50 dark:hover:bg-carbon-900 hover:border-carbon-300 dark:hover:border-carbon-700 transition-all duration-300'
}`}>
<article className="group border-b border-carbon-200 dark:border-carbon-700 pb-6 mb-6 hover:border-mulberry-400 dark:hover:border-mulberry-600 transition-colors duration-200">
<Link href={`/posts/${post.slug}`} className="block">
<div className="mb-chorus-md">
<div className="flex items-center justify-between mb-chorus-sm">
<div className="blog-meta">
<time dateTime={post.date} className="text-carbon-600 dark:text-carbon-500">
{formattedDate}
</time>
<span className="text-carbon-500 dark:text-carbon-600"></span>
<span className="text-carbon-600 dark:text-carbon-500">
{post.readingTime} min read
</span>
</div>
{post.featured && (
<span className="blog-tag bg-mulberry-700 text-mulberry-200">
Featured
</span>
)}
</div>
<h2 className={`${
featured ? 'text-h3' : 'text-h4'
} font-logo text-carbon-950 dark:text-carbon-100 group-hover:text-carbon-700 dark:group-hover:text-mulberry-200 transition-colors mb-chorus-lg`}>
{post.title}
</h2>
<p className="text-carbon-700 dark:text-carbon-300 leading-relaxed mb-4 line-clamp-3">
{post.description}
</p>
{/* Newspaper-style kicker */}
<div className="mb-2">
<span className="text-mulberry-600 dark:text-mulberry-400 text-xs font-bold uppercase tracking-wide">
{post.tags?.[0] || 'Analysis'}
</span>
</div>
<div className="flex items-center justify-between">
<div className="flex items-center space-x-2">
<div className="w-8 h-8 bg-gradient-to-br from-mulberry-400 to-ocean-500 rounded-full flex items-center justify-center">
<span className="text-carbon-950 font-semibold text-xs">
{post.author?.name?.charAt(0) || 'C'}
</span>
</div>
<div>
<p className="text-carbon-950 dark:text-carbon-200 font-medium text-sm">
{post.author?.name || 'CHORUS Team'}
</p>
{post.author?.role && (
<p className="text-carbon-600 dark:text-carbon-500 text-xs">
{post.author.role}
</p>
)}
</div>
{/* Headline */}
<h2 className="text-xl md:text-2xl font-bold text-carbon-950 dark:text-carbon-100 leading-tight mb-3 group-hover:text-carbon-700 dark:group-hover:text-mulberry-200 transition-colors">
{post.title}
</h2>
{/* Subhead */}
<p className="text-carbon-700 dark:text-carbon-300 leading-relaxed mb-4 text-base">
{post.description}
</p>
{/* Byline - newspaper style */}
<div className="flex items-center justify-between text-xxs">
<div className="flex items-center space-x-3">
<span className="text-carbon-950 dark:text-carbon-200 font-semibold">
{post.author?.name || 'CHORUS Team'}
</span>
<span className="text-carbon-500 dark:text-carbon-600">|</span>
<time dateTime={post.date} className="text-carbon-600 dark:text-carbon-500 font-medium">
{formattedDate}
</time>
<span className="text-carbon-500 dark:text-carbon-600">|</span>
<span className="text-carbon-600 dark:text-carbon-500">
{post.readingTime} min read
</span>
</div>
<div className="flex flex-wrap gap-2">
{post.tags?.slice(0, 3).map((tag) => (
<span key={tag} className="blog-tag">
{tag}
</span>
)) || []}
{(post.tags?.length || 0) > 3 && (
<span className="text-carbon-600 dark:text-carbon-500 text-xs">
+{(post.tags?.length || 0) - 3} more
</span>
)}
</div>
{/* Tag indicator */}
{(post.tags?.length || 0) > 1 && (
<span className="text-carbon-600 dark:text-carbon-500 text-xxs">
+{(post.tags?.length || 0) - 1} more topics
</span>
)}
</div>
</Link>
</article>

View File

@@ -229,7 +229,8 @@ export default function ThreeLogo({ className = "" }: ThreeLogoProps) {
aspectRatio: '1 / 1',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
justifyContent: 'center',
opacity: 0.5
}}
/>
);

View File

@@ -0,0 +1,37 @@
---
title: "Why Latent Space Isn't Enough — and What We're Building Instead"
description: "Everyone's talking about the next generation of Retrieval-Augmented Generation (RAG) platforms. Latent Space is one of the most polished contenders, offering streamlined tools for building LLM-powered apps. But here's the problem: RAG as we know it is incomplete."
date: "2025-02-25"
publishDate: "2025-02-25T10:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "Retrieval Augmented Generation"
- "Gen AI"
- "rag"
featured: false
---
**The Latent Space Value Proposition**
Latent Space provides a developer-friendly way to stitch together embeddings, retrieval, and workflows. If youre building a chatbot or a knowledge assistant, it helps you get to “Hello World” quickly. Think of it as an **accelerator for app developers**.
**The Limits**
But once you go beyond prototypes, some cracks show:
* Context is retrieved, but it isnt structured in a reproducible or queryable way.
* Temporal information — what was true *when* — isnt captured.
* Justifications for why something was retrieved are opaque.
* Context doesnt move fluidly between agents; its app-bound.
**What Were Doing Differently**
Our approach (Chorus + BZZZ + UCXL) starts from a different premise: **context isnt an app feature, its infrastructure**.
* We treat knowledge like an addressable space, not just an embedding lookup.
* Temporal navigation is first-class, so you can ask not only “whats true” but “what was true last week” or “what changed between versions.”
* Provenance is baked in: retrieval comes with citations and justifications.
* And most importantly: our system isnt designed for a single app. Its designed for a network of agents to securely share, query, and evolve context.
**Conclusion**
Latent Space is a great product for teams shipping todays RAG-powered apps. But if you want to build **tomorrows distributed AI ecosystems**, you need infrastructure that goes beyond RAG. Thats what were building.
Why Latent Space Isnt Enough — and What Were Building Instead

View File

@@ -0,0 +1,36 @@
---
title: "Why a Vector Database Alone Won't Cut It (Chroma vs. Our Approach)"
description: "Vector databases like Chroma have exploded in popularity. They solve a very specific problem: finding similar pieces of information fast. But if you mistake a vector DB for a full knowledge substrate, you're going to hit hard limits."
date: "2025-02-24"
publishDate: "2025-02-24T10:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "announcement"
- "contextual-ai"
- "orchestration"
featured: true
---
**The Chroma Value Proposition**
Chroma is excellent at what it does: store embeddings and return the nearest neighbors. Its simple, efficient, and useful as a retrieval backend.
**The Limits**
But a database is not a knowledge system. With Chroma, you get:
* Embeddings without meaning — no structured way to represent “where” knowledge lives.
* No sense of time — history is overwritten or bolted on manually.
* No reasoning trail — results come back as raw chunks, not justifications.
* No distributed context — each deployment is its own silo.
**What Were Doing Differently**
Our stack (Chorus + BZZZ + UCXL) doesnt replace a vector DB; it **sits above it**.
* We define a protocol for addressing and navigating knowledge, like URLs for context.
* We make time a native dimension, so you can query across versions and histories.
* We attach provenance to every piece of retrieved information.
* And we enable agents — not just apps — to share and evolve context across systems.
**Conclusion**
Chroma is a great building block. But its still just a block. If you want to build something more than a single tower — a **city of agents that can collaborate, exchange knowledge, and evolve together** — you need infrastructure that understands time, structure, and justification. Thats the gap were closing.

View File

@@ -0,0 +1,54 @@
---
title: "Why On-prem GPUs Still Matter for AI"
description: "Own the stack. Own your data."
date: "2025-02-26"
publishDate: "2025-02-28T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "gpu compute"
- "contextual-ai"
- "infrastructure"
featured: false
---
Cloud GPUs are everywhere right now, but if youve tried to run serious workloads, you know the story: long queues, high costs, throttling, and vendor lock-in. Renting compute might be convenient for prototypes, but at scale it gets expensive and limiting.
Thats why more teams are rethinking **on-premises GPU infrastructure**.
## The Case for In-House Compute
1. **Cost at Scale** Training, fine-tuning, or heavy inference workloads rack up cloud costs quickly. Owning your own GPUs flips that equation over the long term.
2. **Control & Customization** You own the stack: drivers, runtimes, schedulers, cluster topology. No waiting on cloud providers.
3. **Latency & Data Gravity** Keeping data close to the GPUs removes bandwidth bottlenecks. If your data already lives in-house, shipping it to the cloud and back is wasteful.
4. **Privacy & Compliance** Your models and data stay under your governance. No shared tenancy, no external handling.
## Not Just About Training Massive LLMs
Its easy to think of GPUs as “just for training giant foundation models.” But most teams today are leveraging GPUs for:
* **Inference at scale** low-latency deployments.
* **Fine-tuning & adapters** customizing smaller models.
* **Vector search & embeddings** powering RAG pipelines.
* **Analytics & graph workloads** accelerated by frameworks like RAPIDS.
This is where recent research gets interesting. NVIDIAs latest papers on **small models** show that capability doesnt just scale with parameter count — it scales with *specialization and structure*. Instead of defaulting to giant black-box LLMs, were entering a world where **smaller, domain-tuned models** run faster, cheaper, and more predictably.
And with the launch of the **Blackwell architecture**, the GPU landscape itself is changing. Blackwell isnt just about raw FLOPs; its about efficiency, memory bandwidth, and supporting mixed workloads (training + inference + data processing) on the same platform. Thats exactly the kind of balance on-prem clusters can exploit.
## Where This Ties Back to Chorus
At Chorus, we think of GPUs not just as horsepower, but as the **substrate that makes distributed reasoning practical**. Hierarchical context and agent orchestration require low-latency, high-throughput compute — the kind thats tough to guarantee in the cloud. On-prem clusters give us:
* Predictable performance for multi-agent reasoning.
* Dedicated acceleration for embeddings and vector ops.
* A foundation for experimenting with **HRM-inspired** approaches that dont just make models bigger, but make them smarter.
## The Bottom Line
The future isnt cloud *versus* on-prem — its hybrid. Cloud for burst capacity, on-prem GPUs for sustained reasoning, privacy, and cost control. Owning your own stack is about **freedom**: the freedom to innovate at your pace, tune your models your way, and build intelligence on infrastructure you trust.
The real question isnt whether you *can* run AI on-prem.
Its whether you can afford *not to*.

View File

@@ -0,0 +1,52 @@
---
title: "Beyond RAG: The Future of AI Context with CHORUS"
description: "AI is moving fast, but one of the biggest bottlenecks isn't model size or compute power—it's context management. Here's how CHORUS goes beyond traditional RAG approaches."
date: "2025-02-27"
publishDate: "2025-02-27T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "contextual-ai"
- "RAG"
- "context-management"
- "hierarchical-reasoning"
featured: false
---
AI is moving fast, but one of the biggest bottlenecks isnt model size or compute power, its **context management**.
For years, **Retrieval-Augmented Generation (RAG)** has been the go-to method for extending large language models (LLMs). By bolting on vector databases and search, RAG helps models pull in relevant documents. It works, but only to a point. Anyone whos scaled production systems knows the cracks:
* RAG treats knowledge as flat text snippets, missing relationships and nuance.
* Git and other version-control systems capture *code history*, but not the evolving reasoning behind decisions.
* Static context caches snap a picture in time, but knowledge and workflows dont stand still.
In short: **RAG, Git, and static context snapshots arent enough for the next generation of AI.**
## Why Hierarchical Context Matters
Knowledge isnt just a pile of files — its layered, temporal, and deeply interconnected. AI systems need to track *how* reasoning unfolds, *why* decisions were made, and *how context evolves over time*. Thats where **Chorus** comes in.
Instead of treating context as documents to fetch, we treat it as a **living, distributed hierarchy**. Chorus enables agents to share, navigate, and build on structured threads of reasoning across domains and time. Its not just about retrieval — its about orchestration, memory, and continuity.
## Research Is Moving the Same Way
The AI research frontier points in this direction too:
* **NVIDIAs recent small model papers** showed that scaling up isnt the only answer — well-designed small models can outperform by being more structured and specialized.
* The **Hierarchical Reasoning Model (HRM)** highlights how smarter architectures, not just bigger context windows, unlock deeper reasoning.
Both emphasize the same principle: **intelligence comes from structure, not size alone**.
## Whats Next
Chorus is building the scaffolding for this new paradigm. Our goal is to make context:
* **Persistent** reasoning doesnt vanish when the session ends.
* **Navigable** past decisions and justifications are always accessible.
* **Collaborative** multiple agents can share and evolve context together.
Were not giving away the full blueprint yet, but if youre interested in what lies **beyond RAG**, beyond Git, and beyond static memory hacks, keep watching.
The future of **AI context management** is closer than you think.

View File

@@ -0,0 +1,68 @@
# Lessons from the AT&T Data Breach: Why Role-Aware Encryption Matters
When AT&T recently disclosed that a data breach exposed personal records
of over 70 million customers, it reignited a conversation about how
organizations safeguard sensitive information. The breach wasn't just
about lost passwords or emails---it included Social Security numbers,
driver's licenses, and other deeply personal identifiers that can't be
reset with a click.
The scale of the exposure highlights a fundamental flaw in many
enterprise systems: data is often stored and accessed far more broadly
than necessary. Even when encryption is in place, once data is decrypted
for use, it typically becomes accessible to entire systems or
teams---far beyond the minimum scope required.
## The Problem with Overexposed Data
Most organizations operate on a "once you're in, you're in" model. A
compromised credential, an insider threat, or an overly broad permission
set can expose massive datasets at once. Traditional encryption, while
useful at rest and in transit, does little to enforce *granular,
role-aware access* when the data is in use.
In other words: encryption today protects against outside attackers but
does very little to mitigate insider risks or systemic overexposure.
## Need-to-Know as a Security Principle
The military has long operated on the principle of "need-to-know."
Access is not just about who you are, but whether you need the
information to perform your role. This principle has been slow to
translate into enterprise IT, but breaches like AT&T's demonstrate why
it's urgently needed.
Imagine if even within a breached environment, attackers could only
access *fragments* of data relevant to a specific role or function.
Instead of entire identity records being leaked, attackers would only
encounter encrypted shards that had no value without the proper
contextual keys.
## Role-Aware Encryption as a Path Forward
A project CHORUS is developing takes this idea further by designing
encrypted systems that integrate "need-to-know" logic directly into the
key architecture. Instead of global decryption, data access is segmented
based on role, context, and task. This approach means:
- A compromised credential doesn't unlock the entire vault, only the
slice relevant to that role.\
- Insider threats are constrained by cryptographic boundaries, not
just policy.\
- Breach impact is inherently minimized because attackers can't pivot
across roles to harvest complete records.
## From Damage Control to Damage Prevention
Most breach response strategies today focus on containment after the
fact: resetting passwords, notifying customers, monitoring for fraud.
But the real challenge is prevention---structuring systems so that even
when attackers get in, they can't get much.
The AT&T breach shows what happens when sensitive data is exposed
without these safeguards. Role-aware encryption flips the model,
limiting what any one actor---or attacker---can see.
As data breaches grow in frequency and scale, moving from static
encryption to role- and context-aware encryption will become not just a
best practice but a necessity.

View File

@@ -0,0 +1,43 @@
---
title: "AI Safety in Multi-Agent Systems: Coordination Without Chaos"
description: "Ensuring safe, predictable behavior when multiple AI agents interact, collaborate, and potentially conflict in complex environments."
date: "2025-03-01"
publishDate: "2025-03-01T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
As AI systems evolve from single-purpose tools to networks of collaborating agents, ensuring safe and predictable behavior becomes exponentially more complex. Multi-agent systems introduce emergent behaviors, coordination challenges, and potential conflicts that do not exist in isolated AI applications.
The safety challenges of multi-agent systems extend beyond individual agent behavior to interaction protocols, conflict resolution mechanisms, and system-wide governance frameworks. When agents can adapt their behavior based on interactions with others, traditional safety approaches often fall short.
### Emergent Behavior Management
A core challenge in multi-agent AI safety is managing emergent behaviors that arise from agent interactions. These behaviors can be beneficial, enhancing problem-solving capabilities, or problematic, leading to resource conflicts, infinite loops, or unintended consequences.
Effective safety frameworks require continuous monitoring of interaction patterns, early-warning systems for detecting potentially harmful emergent behaviors, and intervention mechanisms that can adjust agent behavior or system parameters to maintain safe operation.
In systems like CHORUS, emergent behavior can be tracked and contextualized across multiple temporal and semantic layers. By maintaining a hierarchical context graph and temporal state history, the system can anticipate conflicts, suggest corrective actions, or automatically mediate behaviors before they cascade into unsafe outcomes.
### Consensus and Conflict Resolution
When agents have conflicting goals or compete for limited resources, robust conflict-resolution mechanisms are essential. This involves fair resource allocation, clear priority hierarchies, and escalation pathways for conflicts agents cannot resolve autonomously.
Designing these mechanisms requires balancing autonomy with control—ensuring agents can operate independently while system-wide safety guarantees remain intact. Multi-layered context and knowledge sharing frameworks can provide agents with a common operational understanding, enabling more efficient negotiation and consensus-building. Systems that track decision provenance across interactions help maintain transparency while reducing the likelihood of unresolved conflicts.
### Trust and Verification in Agent Networks
Multi-agent systems require sophisticated trust models capable of handling variable agent reliability, adversarial behavior, and dynamic network topologies. This includes verifying agent capabilities and intentions, tracking reputations over time, and isolating potentially compromised agents.
Building trustworthy systems also requires transparent decision-making, comprehensive audit trails, and mechanisms for human oversight and intervention. By integrating persistent context storage and cross-agent knowledge validation, systems like CHORUS can support autonomous collaboration while ensuring accountability. This layered approach allows humans to maintain meaningful control, even in highly distributed, adaptive networks.
## Conclusion
As multi-agent AI networks become more prevalent, safety will depend not only on individual agent reliability but on the structures governing their interactions. By combining emergent behavior tracking, structured conflict resolution, and sophisticated trust frameworks, it is possible to create systems that are both highly autonomous and predictably safe. Context-aware, temporally-informed systems offer a promising pathway to ensuring coordination without chaos.

View File

@@ -0,0 +1,34 @@
---
title: "Temporal Reasoning in AI Agents: Beyond Static Context"
description: "How next-generation AI agents can reason about time, causality, and evolving contexts to make better decisions in dynamic environments."
date: "2025-03-02"
publishDate: "2025-03-02T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "time"
- "temporal reasoning"
featured: false
---
Traditional AI agents often operate in a temporal vacuum, treating each interaction as an isolated event. Yet real-world decision-making requires understanding how context evolves over time, recognizing patterns across temporal boundaries, and anticipating future states based on historical trends.
Temporal reasoning represents the next frontier in AI agent development. Unlike static context systems that provide snapshot-based information, temporal reasoning allows agents to understand causality, track evolving relationships, and make decisions informed by dynamic contexts that change over time.
### The Challenge of Time in AI Systems
Most current AI architectures struggle with temporal understanding. They excel at pattern recognition within discrete inputs but fail to maintain coherent understanding across sequences of events. This limitation becomes critical when agents need to coordinate with other systems, track evolving user preferences, or maintain consistent behavior in changing environments.
Consider an AI agent managing a complex workflow. Without temporal reasoning, it may repeat failed strategies, ignore successful patterns from previous executions, or fail to adapt to shifting requirements. Temporal reasoning equips the agent to learn from history, recognize recurring patterns, and adjust behavior based on context that evolves over time.
### Implementing Temporal Context in Agent Architecture
The key to effective temporal reasoning is structured memory systems capable of maintaining causal relationships across time. Advanced agents must do more than store historical events—they need to model how past decisions influence present circumstances and potential future states. Achieving this requires memory architectures that compress historical information while preserving causal significance.
Systems like CHORUS and UCXL offer frameworks for persistent, hierarchical context storage with temporal layering. By embedding temporal context directly into the knowledge graph, agents can reason over past, present, and anticipated states simultaneously. This enables more coordinated multi-agent interactions, better adaptation to dynamic environments, and a deeper understanding of user intent as it evolves over long-term engagements.
## Conclusion
Temporal reasoning transforms AI agents from reactive tools into proactive collaborators, capable of navigating complex, evolving environments. By integrating causal memory, dynamic context tracking, and temporally-aware decision-making, next-generation agents can operate with foresight, learn from past outcomes, and coordinate effectively in multi-agent systems. Context-aware, temporally-informed architectures like CHORUS provide a concrete pathway toward this future.

View File

@@ -0,0 +1,36 @@
---
title: "Are Knowledge Graphs Enough for True LLM Reasoning?"
description: "Exploring why linking knowledge is just one dimension of reasoning—and how multi-layered evidence and decision-tracking systems like BUBBLE can complete the picture."
date: "2025-03-03"
publishDate: "2025-03-03T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "knowledge graphs"
- "decisions"
- "reasoning"
featured: false
---
Large language models (LLMs) have demonstrated remarkable capabilities in generating human-like text and solving complex problems. Yet much of their reasoning relies on statistical patterns rather than a structured understanding of concepts and relationships. Knowledge graphs offer a complementary approach, providing explicit, navigable representations of factual knowledge and logical relationships—but are they enough?
### Beyond Linked Concepts: The Dimensions of Reasoning
Knowledge graphs organize information as nodes and edges, making relationships explicit and verifiable. This transparency allows LLMs to reason along defined paths, check facts, and produce explainable outputs. However, true reasoning in complex, dynamic domains requires more than concept linking—it requires tracing chains of inference, understanding decision provenance, and integrating temporal and causal context.
BUBBLE addresses this gap by extending the knowledge graph paradigm. It not only links concepts but also pulls in entire chains of reasoning, prior decisions, and relevant citations. This multi-dimensional context allows AI agents to understand not just what is true, but why it was concluded, how decisions were made, and what trade-offs influenced prior outcomes.
### Bridging Statistical and Symbolic AI
LLMs excel at contextual understanding, natural language generation, and pattern recognition in unstructured data. Knowledge graphs excel at precise relationships, logical inference, and consistency. Together, they form a hybrid approach that mitigates common limitations of neural-only models, including hallucination, inconsistency, and opaque reasoning.
By layering BUBBLEs decision-tracking and reasoning chains on top of knowledge graphs, we move closer to AI that can not only retrieve facts but explain and justify its reasoning in human-comprehensible ways. This represents a step toward systems that are auditable, accountable, and capable of sophisticated multi-step problem solving.
### Practical Implications
In enterprise or research environments, knowledge graphs combined with LLMs provide authoritative references and structured reasoning paths. BUBBLE enhances this by preserving the context of decisions over time, creating a continuous audit trail. The result is AI that can handle complex queries requiring multi-step inference, assess trade-offs, and provide explainable guidance—moving far beyond static fact lookup or shallow pattern matching.
## Conclusion
If knowledge graphs are the map, BUBBLE provides the travelogue: the reasoning trails, decision points, and causal links that give AI agents the ability to reason responsibly, explainably, and dynamically. Linking knowledge is necessary, but understanding why and how decisions emerge is the next frontier of trustworthy AI reasoning.

View File

@@ -0,0 +1,39 @@
---
title: "AI-Human Collaboration: Designing Complementary Intelligence"
description: "Moving beyond AI replacement to create systems where artificial and human intelligence complement each other for enhanced problem-solving."
date: "2025-03-04"
publishDate: "2025-03-04T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "human ai collaboration"
- "interface design"
- "shared understanding"
featured: false
---
The most effective AI deployments dont replace human intelligence—they augment it. True collaborative systems leverage the complementary strengths of humans and AI to tackle complex problems, moving beyond simple automation toward genuinely integrated problem-solving partnerships.
Humans and AI bring different cognitive strengths to the table. Humans excel at creative problem-solving, contextual understanding, ethical reasoning, and handling ambiguity. AI systems excel at processing large datasets, maintaining consistency, and applying learned patterns across diverse contexts. The challenge is designing systems that allow these complementary abilities to work in harmony.
### Designing Collaborative Interfaces
Effective human-AI collaboration depends on interfaces that support seamless information exchange, shared decision-making, and mutual adaptation. This goes beyond conventional UIs, creating collaborative workspaces where humans and AI can jointly explore solutions, manipulate data, and iteratively refine approaches.
Crucially, these interfaces must make AI reasoning transparent while allowing humans to provide context, constraints, and guidance that AI systems can incorporate into their decisions. Bidirectional communication and shared control are key to ensuring that the collaboration is not only productive but also comprehensible and auditable.
### Trust and Calibration in AI Partnerships
Successful collaboration requires carefully calibrated trust. Humans must understand AI capabilities and limitations, while AI must assess the reliability and expertise of its human partners. Over-trust can lead to automation bias; under-trust can prevent effective utilization of AI insights.
Building appropriate trust means providing transparency in AI decision-making, enabling humans to validate outputs, and implementing feedback mechanisms so both humans and AI can learn from their shared experiences. This iterative calibration strengthens the partnership over time.
### Adaptive Role Allocation
In dynamic problem-solving environments, the optimal division of labor between humans and AI shifts depending on task complexity, available information, time constraints, and human expertise. Adaptive systems assess task requirements, evaluate collaborator capabilities, and negotiate role allocation, all while remaining flexible as conditions evolve.
The goal is a partnership that leverages the best of human and artificial intelligence while minimizing their respective limitations. Early-access participants will have the opportunity to see a demonstration of exactly how these adaptive, transparent, and trust-calibrated collaborations can be realized in practice, experiencing firsthand the benefits of this complementary intelligence approach.

View File

@@ -0,0 +1,24 @@
---
title: "Neural-Symbolic AI: Bridging Intuition and Logic"
description: "Neural-Symbolic AI: Bridging Intuition and Logic"
date: "2025-03-05"
publishDate: "2025-03-05T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "symbolic ai"
- "neural ai"
- "hybrid architectures"
featured: false
---
Modern hybrid architectures integrate neural and symbolic components so seamlessly that AI can switch between intuition-driven and logic-driven reasoning depending on the task. Its not just a connection—its a continuous reasoning interface that adapts dynamically.
What makes this powerful is the ability to learn symbolic structures from data. AI can discover new rules and relationships while maintaining logical consistency, bridging gaps where some knowledge is explicit and other patterns must emerge from observation.
Explainability is also transformed. Systems can provide intuitive insights from learned patterns alongside logical reasoning chains, helping humans understand both what decisions are made and why. Hierarchical context models, like those underpinning UCXL, help structure this reasoning across multiple layers and over time, linking past decisions, causal relationships, and future implications.
Early-access participants will get a first-hand look at how these hybrid reasoning processes operate in practice, exploring how AI can combine intuition and logic in ways that feel collaborative, transparent, and auditable.
In short: AI that can think, learn, and explain itself—bridging the best of both worlds.

View File

@@ -0,0 +1,45 @@
---
title: "The Trouble with Context Windows"
description: "Bigger context windows dont mean better reasoning — heres why temporal and structural memory matter more."
date: "2025-03-06"
publishDate: "2025-03-06T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
# The Trouble with Context Windows
**Hook:** Bigger context windows dont mean better reasoning — heres why temporal and structural memory matter more.
Theres a common assumption in AI: bigger context windows automatically lead to smarter models. After all, if an AI can “see” more of the conversation, document, or dataset at once, shouldnt it reason better? The truth is more nuanced.
## Why Context Windows Arent Enough
Current large language models are constrained by a finite context window—the chunk of text they can process in a single pass. Increasing this window lets the model reference more information at once, but it doesnt magically improve reasoning. Why? Because reasoning isnt just about *how much* you see—its about *how you remember and structure it*.
Consider a simple analogy: reading a book with a 10-page snapshot at a time. You might remember the words on the page, but without mechanisms to track themes, plot threads, or character development across the entire novel, your understanding is shallow. You cant reason effectively about the story, no matter how many pages you glance at simultaneously.
## Temporal Memory Matters
AI systems need memory that persists *over time*, not just within a single context window. Temporal memory allows an agent to link past decisions, observations, and interactions to new inputs. This is how AI can learn from history, recognize patterns, and avoid repeating mistakes. Large context windows only show you a bigger snapshot—they dont inherently provide this continuity.
## Structural Memory Matters
Equally important is *structural memory*: organizing information hierarchically, by topics, causality, or relationships. An AI that can remember isolated tokens or sentences is less useful than one that knows how concepts interconnect, how actions produce consequences, and how threads of reasoning unfold. This is why hierarchical and relational memory systems are critical—they give context *shape*, not just volume.
## Putting It Together
Bigger context windows are a tool, but temporal and structural memory are what enable deep reasoning. AI that combines both can track decisions, preserve causal chains, and maintain continuity across interactions. At CHORUS, UCXL exemplifies this approach: a hierarchical memory system designed to provide agents with both temporal and structural context, enabling smarter, more coherent reasoning beyond what raw context size alone can deliver.
## Takeaway
If youre designing AI systems, dont chase context window size as a proxy for intelligence. Focus on how your model *remembers* and *organizes* information over time. Thats where true reasoning emerges.

View File

@@ -0,0 +1,40 @@
---
title: "What Git Taught Us — and Where It Fails for AI"
description: "Version control transformed code, but commits and diffs cant capture how reasoning evolves. AI needs a different model of history."
date: "2025-03-07"
publishDate: "2025-03-07T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
# What Git Taught Us — and Where It Fails for AI
Version control systems like Git revolutionized software development. They let teams track changes, collaborate asynchronously, and revert mistakes with confidence. But can the same model of history work for AI reasoning? Not quite.
## Git and the Limits of Snapshot Histories
Git works by recording discrete snapshots of a codebase. Each commit represents a new state, with a diff capturing changes. This works beautifully for text-based artifacts, but AI reasoning is not static code—it evolves continuously, building on prior inferences, context, and decisions.
Unlike code, reasoning isnt always linear. A single change in understanding can propagate across many decisions and observations. Capturing this as a series of isolated commits loses the causal links between ideas and makes tracing thought evolution extremely difficult.
## AI Needs Dynamic, Layered Histories
Reasoning histories for AI must be more than a series of snapshots. Agents require a model that tracks context, decisions, and their causal relationships over time. This allows AI to revisit past conclusions, understand why they were made, and adapt as new information emerges.
Hierarchical and temporal memory systems provide a better approach. By structuring knowledge and reasoning threads across multiple layers, AI can maintain continuity and coherence without being constrained by static snapshots.
## Beyond Version Control: Continuous Context
The challenge is not simply storing history, but making it actionable. AI agents need to query past reasoning threads, combine them with new observations, and update their understanding in a coherent way. This is where static commit-and-diff models fall short: they dont naturally capture causality, dependencies, or evolving reasoning strategies.
## Takeaway
Git taught us the power of versioned artifacts, but AI requires something richer: dynamic, hierarchical, and temporally-aware histories. Systems like UCXL demonstrate how reasoning threads, decisions, and context can be stored and accessed continuously, enabling agents to evolve intelligently rather than merely accumulating static snapshots.

View File

@@ -0,0 +1,39 @@
---
title: "From Noise to Signal: Why Agents Need Curated Context"
description: "Raw retrieval is messy. Agents need curated, layered inputs that cut through noise and preserve meaning."
date: "2025-03-08"
publishDate: "2025-03-08T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
AI agents can access vast amounts of information, but raw retrieval is rarely useful on its own. Unfiltered data often contains irrelevant, contradictory, or misleading content. Without curated context, agents can become overwhelmed, producing outputs that are inaccurate or incoherent.
## The Problem with Raw Data
Imagine giving an agent a massive dump of unstructured text and expecting it to reason effectively. The agent will encounter duplicates, conflicting claims, and irrelevant details. Traditional retrieval systems can surface information, but they dont inherently prioritize quality, relevance, or causal importance. The result: noise overwhelms signal.
## Curated Context: Layered and Filtered
Curated context organizes information hierarchically, emphasizing relationships, provenance, and relevance. Layers of context help the agent focus on what matters while preserving the structure needed for reasoning. This goes beyond keyword matching or brute-force retrieval—its about building a scaffolded understanding of the information landscape.
## Why This Matters for AI Agents
Agents operating in dynamic or multi-step tasks require clarity. Curated context enables:
- **Consistency:** Avoiding contradictions by referencing validated sources.
- **Efficiency:** Reducing the cognitive load on the agent by filtering noise.
- **Traceability:** Linking decisions to supporting evidence and context.
Systems like BZZZ illustrate how curated threads of reasoning can be pulled into an agents workspace, maintaining coherence across complex queries and preserving the meaning behind information rather than just its raw presence.
## Takeaway
For AI to reason effectively, more data isnt the solution. Curated, layered, and structured context transforms noise into signal, enabling agents to make decisions that are accurate, explainable, and aligned with user intent.

View File

@@ -0,0 +1,34 @@
---
title: "Small Models, Big Impact"
description: "The future isnt just about bigger LLMs — small, specialized models are proving more efficient and more practical."
date: "2025-03-09"
publishDate: "2025-03-09T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
The AI community often equates progress with scale. Larger models boast more parameters, more training data, and more “raw intelligence.” But bigger isnt always better. Small, specialized models are emerging as powerful alternatives, particularly when efficiency, interpretability, and domain-specific performance matter.
## The Case for Smaller Models
Small models require fewer computational resources, making them faster, cheaper, and more environmentally friendly. They are easier to fine-tune and adapt to specific tasks without retraining an enormous model from scratch. In many cases, a well-trained small model can outperform a general-purpose large model for specialized tasks.
## Efficiency and Adaptability
Smaller models excel where speed and resource efficiency are crucial. Edge devices, mobile applications, and multi-agent systems benefit from models that are lightweight but accurate. Because these models are specialized, they can be deployed across diverse environments without the overhead of large-scale infrastructure.
## Complementing Large Models
Small models are not a replacement for large models—they complement them. Large models provide broad understanding and context, while small models offer precision, speed, and efficiency. Together, they create hybrid intelligence systems that leverage the strengths of both approaches.
## Takeaway
Bigger isnt always better. In AI, strategic specialization often outweighs brute-force scale. By combining large and small models thoughtfully, we can create systems that are not only smarter but more practical, efficient, and adaptable for real-world applications.

View File

@@ -0,0 +1,42 @@
---
title: "Data Privacy Is AIs Next Frontier"
description: "If your business strategy is in the cloud, its not really yours. Privacy and sovereignty are shaping the future of AI infrastructure."
date: "2025-03-10"
publishDate: "2025-03-10T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
As AI becomes central to business operations, data privacy is no longer a secondary concern—its a strategic imperative. With sensitive information flowing through cloud services, organizations face challenges in control, compliance, and sovereignty.
## Why Privacy Matters
AI thrives on data, but businesses cant afford to hand over unrestricted access to their most valuable information. Beyond compliance with regulations like GDPR or CCPA, data privacy affects trust, competitive advantage, and legal liability.
## Cloud Limitations
Centralized cloud solutions simplify deployment but often introduce vulnerabilities. When sensitive business strategies, proprietary datasets, or customer information are processed externally, organizations risk exposure, misuse, or loss of control.
## Privacy-First AI Architectures
Next-generation AI infrastructure emphasizes privacy by design. Approaches include:
- **On-prem or hybrid deployments:** Keeping sensitive data under organizational control while leveraging cloud resources for less critical workloads.
- **Federated learning:** Training models across distributed data sources without moving raw data.
- **Encryption and secure enclaves:** Ensuring computation happens in a protected environment.
## Strategic Implications
Data privacy is now a differentiator. Companies that can process AI insights without compromising sensitive information gain a competitive edge. Privacy-conscious AI also fosters user trust, regulatory compliance, and long-term sustainability.
## Takeaway
In AI, control over your data is control over your strategy. Privacy, sovereignty, and secure data management arent optional—theyre the foundation for the next wave of responsible, effective AI deployment.

View File

@@ -0,0 +1,38 @@
---
title: "Temporal Memory in AI: Beyond Snapshots"
description: "AI needs more than static snapshots. Decisions, justifications, and reasoning threads should be preserved over time."
date: "2025-03-11"
publishDate: "2025-03-11T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
AI systems often rely on single-shot or snapshot-based context: the model sees a chunk of information, makes a decision, and moves on. While this is sufficient for some tasks, complex reasoning requires continuity, causality, and temporal awareness.
## The Limits of Static Snapshots
Snapshots capture information at a single point in time, but they lose the evolution of reasoning and decisions. Agents may repeat mistakes, miss patterns, or fail to anticipate future outcomes because they cannot reference the history of their prior inferences or actions.
## Preserving Decisions and Justifications
Temporal memory enables agents to track not just facts, but decisions and the reasoning behind them. By storing justification chains, causal links, and evolving context, AI can:
- Learn from prior successes and failures.
- Maintain consistency across multiple interactions.
- Anticipate outcomes based on historical patterns.
## Structuring Temporal Memory
Hierarchical and layered memory architectures allow AI to store and organize reasoning over time. Information is not just preserved—its connected. Each decision links to supporting evidence, prior conclusions, and related reasoning threads, providing a dynamic, evolving understanding of context.
## Takeaway
True intelligence requires memory that spans time, not just snapshots. By preserving decisions, justifications, and reasoning threads, AI agents can build coherent understanding, adapt to change, and reason effectively in complex, evolving environments.

View File

@@ -0,0 +1,38 @@
---
title: "Rethinking Search for Agents"
description: "Search isnt just about retrieval — its about organizing threads of meaning. CHORUS is developing a project to rethink how agents discover context."
date: "2025-03-12"
publishDate: "2025-03-12T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
Traditional search retrieves documents, snippets, or data points based on keywords or patterns. But AI agents need more than raw retrieval—they require structured, meaningful context to reason effectively.
## The Problem with Conventional Search
Standard search engines return results without understanding relationships, dependencies, or reasoning threads. Agents pulling in these raw results often struggle to synthesize coherent knowledge, resulting in outputs that are fragmented, noisy, or inconsistent.
## Organizing Threads of Meaning
The future of search for AI agents involves structuring information as interconnected threads. Each thread represents a reasoning path, linking observations, decisions, and supporting evidence. By curating and layering these threads, agents can navigate context more effectively, building a richer understanding than raw retrieval allows.
## Towards Agent-Centric Search
CHORUS is developing a project that focuses on:
- **Curated reasoning threads:** Prioritized, structured paths of knowledge rather than isolated documents.
- **Context-aware retrieval:** Selecting information based on relevance, causality, and relationships.
- **Dynamic integration:** Continuously updating reasoning threads as agents learn and interact.
## Takeaway
Search for AI is evolving from document retrieval to reasoning support. Agents need organized, meaningful context to make better decisions. Projects like the one CHORUS is developing demonstrate how structured, thread-based search can transform AI reasoning capabilities.

View File

@@ -0,0 +1,34 @@
---
title: "The Myth of Infinite Scale"
description: "Bigger models dont solve everything. True breakthroughs will come from structure, orchestration, and hybrid intelligence."
date: "2025-03-13"
publishDate: "2025-03-13T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
In AI, theres a pervasive assumption: bigger models are inherently better. While scaling has produced impressive capabilities, it isnt a panacea. Model size alone cannot solve fundamental challenges in reasoning, coordination, or domain-specific expertise.
## Limits of Scale
Larger models require massive computational resources, energy, and data. They may improve pattern recognition, but without structured context and reasoning frameworks, size alone cannot guarantee coherent or explainable outputs. Scale amplifies potential, but it cannot replace design.
## Structure and Orchestration
Breakthroughs in AI increasingly come from smart design rather than brute force. Structuring knowledge hierarchically, orchestrating multi-agent reasoning, and layering temporal and causal context can produce intelligence that outperforms larger, unstructured models.
## Hybrid Intelligence
Combining large models for broad context with small, specialized models for precision creates hybrid systems that leverage the strengths of both. This approach is more efficient, interpretable, and adaptive than relying solely on scale.
## Takeaway
Infinite scale is a myth. Real progress comes from intelligent architectures, thoughtful orchestration, and hybrid approaches that balance power, efficiency, and reasoning capability.

View File

@@ -0,0 +1,40 @@
---
title: "Distributed Reasoning: When One Model Isnt Enough"
description: "Real-world problems demand multi-agent systems that share context, divide labor, and reason together."
date: "2025-03-14"
publishDate: "2025-03-14T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
Complex challenges rarely fit neatly into the capabilities of a single AI model. Multi-agent systems offer a solution, enabling distributed reasoning where agents collaborate, specialize, and leverage shared context.
## Why One Model Falls Short
Single models face limitations in scale, specialization, and perspective. A single agent may excel in pattern recognition but struggle with domain-specific reasoning or long-term strategy. Real-world problems are often multi-dimensional, requiring parallel exploration and synthesis of diverse inputs.
## The Power of Multi-Agent Collaboration
Distributed reasoning allows multiple AI agents to:
- Divide tasks based on expertise and capability.
- Share intermediate results and context.
- Iterate collectively on complex problem-solving.
This approach mirrors human teams, where collaboration amplifies individual strengths and mitigates weaknesses.
## Structuring Distributed Systems
Effective multi-agent reasoning requires frameworks for context sharing, conflict resolution, and task orchestration. Hierarchical and temporal memory architectures help maintain coherence across agents, while standardized protocols ensure consistent interpretation of shared knowledge.
## Takeaway
When problems exceed the capacity of a single model, distributed reasoning is key. Multi-agent systems provide the structure, context, and collaboration necessary for robust, adaptive intelligence.

View File

@@ -0,0 +1,36 @@
---
title: "Hierarchical Reasoning Models: A Quiet Revolution"
description: "HRM points to a future where intelligence comes from structure, not just size — and why that matters for CHORUS."
date: "2025-03-15"
publishDate: "2025-03-15T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
As AI systems become more sophisticated, the focus is shifting from sheer model size to *how knowledge is structured*. Hierarchical Reasoning Models (HRMs) provide a framework where intelligence emerges from organization, not just raw computation.
## The Case for Hierarchy
Hierarchical structures allow AI to process information at multiple levels of abstraction. High-level concepts guide reasoning across domains, while low-level details inform precision tasks. This organization enables more coherent, consistent, and scalable reasoning than flat, monolithic architectures.
## Advantages of HRMs
- **Scalability:** Agents can reason across complex problems by leveraging hierarchy without exploding computational demands.
- **Explainability:** Layered structures naturally provide context and traceable reasoning paths.
- **Adaptability:** Hierarchical models can integrate new knowledge at appropriate levels without disrupting existing reasoning.
## HRM in Practice
CHORUS is exploring how hierarchical memory and reasoning structures can enhance AI agent performance. By combining temporal context, causal relationships, and layered abstractions, agents can make decisions that are more robust, transparent, and aligned with user objectives.
## Takeaway
Intelligence is increasingly about *structure* over size. Hierarchical Reasoning Models offer a blueprint for AI systems that are smarter, more adaptable, and easier to understand, marking a quiet revolution in how we think about AI capabilities.

View File

@@ -0,0 +1,41 @@
---
title: "Building Trust Through Explainability"
description: "AI doesnt just need answers — it needs justifications. Metadata and citations build the foundation of trust."
date: "2025-03-16"
publishDate: "2025-03-16T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
As AI systems become integral to decision-making, explainability is crucial. Users must understand not only what decisions AI makes but *why* those decisions were made.
## Why Explainability Matters
Opaque AI outputs can erode trust, increase risk, and limit adoption. When stakeholders can see the rationale behind recommendations, verify sources, and trace decision paths, confidence in AI grows.
## Components of Explainability
Effective explainability includes:
- **Decision metadata:** Capturing context, assumptions, and relevant inputs.
- **Citations and references:** Linking conclusions to verified sources or prior reasoning.
- **Traceable reasoning chains:** Showing how intermediate steps lead to final outcomes.
## Practical Benefits
Explainable AI enables:
- **Accountability:** Users can audit AI decisions.
- **Learning:** Both AI systems and humans can refine understanding from transparent reasoning.
- **Alignment:** Ensures outputs adhere to organizational policies and ethical standards.
## Takeaway
Trustworthy AI isnt just about accuracy; its about justification. By integrating metadata, citations, and reasoning traces, AI systems can foster confidence, accountability, and effective human-AI collaboration.

View File

@@ -0,0 +1,40 @@
---
title: "The Future of Context Is Hybrid"
description: "Cloud + on-prem, small + large models, static + hierarchical context — the future isnt either/or, its hybrid."
date: "2025-03-17"
publishDate: "2025-03-17T09:00:00.000Z"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "agent orchestration"
- "consensus"
- "conflict resolution"
- "infrastructure"
featured: false
---
As AI evolves, no single approach can address all challenges. Effective systems combine multiple paradigms to leverage their respective strengths.
## Hybrid Infrastructure
A hybrid context strategy integrates:
- **Cloud and on-prem resources:** Secure, scalable, and compliant data handling.
- **Small and large models:** Specialized efficiency alongside broad contextual understanding.
- **Static and hierarchical memory:** Immediate snapshots complemented by layered temporal and relational memory.
## Why Hybrid Matters
Hybrid systems enable AI to be adaptable, efficient, and resilient. They can operate in constrained environments while still accessing rich external knowledge, combine fast inference with deep reasoning, and maintain continuity without sacrificing flexibility.
## Designing for Hybrid Context
Building hybrid AI requires:
- **Interoperable architectures:** Seamless integration of different models and memory types.
- **Context orchestration:** Dynamically selecting and merging relevant knowledge streams.
- **Temporal and structural alignment:** Ensuring consistency across layers and over time.
## Takeaway
The future of AI is hybrid. By combining diverse models, infrastructures, and memory strategies, we create systems that are not only smarter and faster but also more versatile and capable of reasoning in complex, real-world scenarios.

View File

@@ -0,0 +1,58 @@
# Scheduled Posts
This directory contains blog posts that are scheduled for future publication.
## Directory Structure
```
scheduled/
├── 2024/
│ ├── 01/
│ ├── 02/
│ └── ...
├── 2025/
│ ├── 01/
│ ├── 02/
│ └── ...
└── README.md
```
## File Naming Convention
Posts should be named with the format: `YYYY-MM-DD-slug.md`
Example: `2024-03-15-understanding-ai-agents.md`
## Frontmatter Format
Each scheduled post should include the following frontmatter:
```yaml
---
title: "Your Post Title"
description: "Brief description of the post"
date: "2024-03-15"
publishDate: "2024-03-15T09:00:00.000Z"
author:
name: "Author Name"
role: "Author Role"
tags:
- "tag1"
- "tag2"
featured: false
draft: false
---
```
## Publishing Process
1. Write your post in the appropriate scheduled directory
2. Set the `publishDate` to when you want it published
3. A scheduled job will move posts from `scheduled/` to `posts/` when their publish date arrives
4. The blog will automatically pick up the new post and display it
## Notes
- Posts in this directory are not visible on the live blog until moved to `posts/`
- Use `draft: true` for posts that are work-in-progress
- The `publishDate` field determines when the post goes live

View File

@@ -0,0 +1,67 @@
---
title: "Welcome to PING!"
description: "The blog about contextual AI orchestration, agent coordination, and the future of intelligent systems."
date: "2025-08-27"
author:
name: "Anthony Rawlins"
role: "CEO & Founder, CHORUS Services"
tags:
- "announcement"
- "contextual-ai"
- "orchestration"
featured: true
---
We're excited to launch PING! — the blog about contextual AI orchestration, agent coordination, and the future of intelligent systems. This is where we'll share our thoughts, insights, and discoveries as we build the future of contextual AI.
## What to Expect
Our blog will cover a range of topics that are central to our mission at CHORUS:
### Contextual AI Orchestration
Deep dives into how we're solving the challenge of getting **the right context, to the right agent, at the right time**. We'll explore the architectural decisions, technical challenges, and innovative solutions that make contextual AI orchestration possible.
### Agent Coordination
Insights into how autonomous agents can work together effectively, including:
- **P2P Agent Networks**: How agents discover and coordinate with each other
- **Decision Making**: Algorithms and patterns for distributed decision making
- **Context Sharing**: Efficient methods for agents to share relevant context
### Technical Architecture
Behind-the-scenes looks at the systems we're building:
- **BZZZ**: Our P2P agent coordination platform
- **SLURP**: Our context curation and intelligence system
- **WHOOSH**: Our orchestration and workflow platform
### Industry Perspectives
Our thoughts on the evolving AI landscape, emerging patterns in agent-based systems, and where we think the industry is heading.
## Our Philosophy
At CHORUS, we believe that the future of AI isn't just about making individual models more powerful—it's about creating **intelligent systems** where multiple agents, each with their own specialized capabilities, can work together seamlessly.
The key insight is **context**. Without the right context, even the most powerful AI agent is just expensive autocomplete. With the right context, even smaller specialized agents can achieve remarkable results.
## What's Coming Next
Over the coming weeks and months, we'll be sharing:
1. **Technical deep dives** into our core systems
2. **Case studies** from our development work
3. **Tutorials** on building contextual AI systems
4. **Industry analysis** on AI orchestration trends
5. **Open source releases** and community projects
## Join the Conversation
We're building CHORUS in the open, and we want you to be part of the journey. Whether you're an AI researcher, a developer building agent-based systems, or just someone curious about the future of AI, we'd love to hear from you.
**Stay Connected:**
- Join our [waitlist](https://chorus.services) for early access
- Connect with us on [LinkedIn](https://linkedin.com/company/chorus-services)
The future of AI is contextual, distributed, and orchestrated. Let's build it together.
---
*Want to learn more about CHORUS? Visit our [main website](https://chorus.services) to explore our vision for contextual AI orchestration.*

View File

@@ -2,7 +2,7 @@ version: '3.8'
services:
chorus-blog:
image: registry.home.deepblack.cloud/tony/chorus-blog:latest
image: registry.home.deepblack.cloud/tony/chorus-blog:v1.2.1
ports:
- "3025:3025"
environment:

View File

@@ -8,17 +8,17 @@ const scheduledDirectory = path.join(process.cwd(), 'content/scheduled')
// Helper function to check if a post should be published
function shouldPublishPost(post: BlogMeta): boolean {
// If no publishDate is set, use the date field
const publishDate = post.publishDate || post.date
if (!publishDate) return true
// Don't publish draft posts
if (post.draft === true) return false
// Check if publish date has passed
// Require at least one valid date field
const publishDate = post.publishDate || post.date
if (!publishDate) return false
const publishDateTime = new Date(publishDate)
if (isNaN(publishDateTime.getTime())) return false
const now = new Date()
return publishDateTime <= now
}
@@ -46,7 +46,7 @@ function readMarkdownFiles(directory: string, basePath: string = ''): BlogPost[]
// Use gray-matter to parse the post metadata section
const matterResult = matter(fileContents)
const meta = matterResult.data as BlogMeta
const meta = matterResult.data as Partial<BlogMeta>
// Create slug from filename (remove .md extension)
const slug = item.replace(/\.md$/, '')
@@ -54,14 +54,42 @@ function readMarkdownFiles(directory: string, basePath: string = ''): BlogPost[]
// Calculate reading time (average 200 words per minute)
const wordCount = matterResult.content.split(/\s+/).length
const readingTime = Math.ceil(wordCount / 200)
// Basic validation and normalization
const rawDate = meta.date || meta.publishDate
if (!rawDate) {
console.warn(`Skipping '${fullPath}' - missing date/publishDate in frontmatter`)
return
}
const dateObj = new Date(rawDate as string)
if (isNaN(dateObj.getTime())) {
console.warn(`Skipping '${fullPath}' - invalid date value: ${rawDate}`)
return
}
if (!meta.title || !meta.description) {
console.warn(`Skipping '${fullPath}' - missing required title/description in frontmatter`)
return
}
const normalizedDate = meta.date ? (meta.date as string) : dateObj.toISOString().split('T')[0]
const normalizedPublishDate = meta.publishDate ? new Date(meta.publishDate as string).toISOString() : undefined
const post: BlogPost = {
slug,
title: meta.title,
description: meta.description,
content: matterResult.content,
date: normalizedDate,
publishDate: normalizedPublishDate,
draft: meta.draft === true,
author: meta.author || { name: 'CHORUS Team' },
tags: Array.isArray(meta.tags) ? (meta.tags as string[]) : [],
featured: meta.featured === true,
coverImage: meta.coverImage,
readingTime,
...meta,
}
posts.push(post)
} catch (error) {
console.error(`Error reading markdown file ${fullPath}:`, error)
@@ -116,9 +144,10 @@ export function getPostData(slug: string): BlogPost | null {
return post
}
export function getFeaturedPosts(): BlogPost[] {
export function getFeaturedPost(): BlogPost | null {
const allPosts = getSortedPostsData()
return allPosts.filter(post => post.featured)
// Return the most recent post as the featured post
return allPosts.length > 0 ? allPosts[0] : null
}
export function getPostsByTag(tag: string): BlogPost[] {
@@ -137,4 +166,4 @@ export function getAllTags(): string[] {
})
return Array.from(tags).sort()
}
}

View File

@@ -1,6 +1,6 @@
{
"name": "chorus-ping",
"version": "1.1.1",
"version": "1.2.0",
"description": "CHORUS PING! - Static blog posts using Next.js",
"private": true,
"scripts": {

View File

@@ -133,22 +133,25 @@ module.exports = {
'chorus-xxl': '6.1rem',
},
fontSize: {
'xs': ['0.854rem', { lineHeight: '1.00rem', fontWeight: '600' }],
'xxs': ['0.625rem', { lineHeight: '0.75rem', fontWeight: '400' }],
'xs': ['0.854rem', { lineHeight: '1.00rem', fontWeight: '400' }],
'sm': ['0.954rem', { lineHeight: '1.10rem', fontWeight: '500' }],
'base': ['1rem', { lineHeight: '1.50rem', fontWeight: '400' }],
'lg': ['1.25rem', { lineHeight: '1.75rem', fontWeight: '400' }],
'xl': ['1.563rem', { lineHeight: '2.00rem', fontWeight: '400' }],
'2xl': ['1.953rem', { lineHeight: '2.50rem', fontWeight: '300' }],
'3xl': ['2.441rem', { lineHeight: '3.00rem', fontWeight: '200' }],
'4xl': ['3.052rem', { lineHeight: '3.50rem', fontWeight: '100' }],
'5xl': ['3.815rem', { lineHeight: '4.00rem', fontWeight: '100' }],
'base': ['1rem', { lineHeight: '1.50rem', fontWeight: '600' }],
'lg': ['1.25rem', { lineHeight: '1.75rem', fontWeight: '600' }],
'xl': ['1.563rem', { lineHeight: '2.00rem', fontWeight: '700' }],
'2xl': ['1.953rem', { lineHeight: '2.50rem', fontWeight: '700' }],
'3xl': ['2.441rem', { lineHeight: '3.00rem', fontWeight: '700' }],
'4xl': ['3.052rem', { lineHeight: '3.50rem', fontWeight: '800' }],
'5xl': ['3.815rem', { lineHeight: '4.00rem', fontWeight: '900' }],
'h7': ['1.000rem', { lineHeight: '1.25rem', fontWeight: '400' }],
'h6': ['1.250rem', { lineHeight: '1.563rem', fontWeight: '500' }],
'h5': ['1.563rem', { lineHeight: '1.953rem', fontWeight: '500' }],
'h4': ['1.953rem', { lineHeight: '2.441rem', fontWeight: '600' }],
'h3': ['2.441rem', { lineHeight: '3.052rem', fontWeight: '600' }],
'h2': ['3.052rem', { lineHeight: '4.768rem', fontWeight: '700' }],
'h1': ['4.768rem', { lineHeight: '6.96rem', fontWeight: '100' }],
'h5': ['1.563rem', { lineHeight: '1.953rem', fontWeight: '600' }],
'h4': ['1.953rem', { lineHeight: '2.441rem', fontWeight: '700' }],
'h3': ['2.441rem', { lineHeight: '3.052rem', fontWeight: '700' }],
'h2': ['3.052rem', { lineHeight: '4.768rem', fontWeight: '800' }],
'h1': ['4.768rem', { lineHeight: '6.96rem', fontWeight: '900' }],
'display-sm': ['3.815rem', { lineHeight: '4rem', fontWeight: '800' }],
'display-md': ['4.768rem', { lineHeight: '5rem', fontWeight: '800' }],
'display-lg': ['5.96rem', { lineHeight: '6rem', fontWeight: '800' }],
@@ -164,6 +167,10 @@ module.exports = {
'rem-4xl': '3.052rem',
'rem-5xl': '3.815rem',
},
maxWidth: {
'8xl': '88rem',
'9xl': '96rem',
},
height: {
'rem-xs': '0.640rem',
'rem-sm': '0.800rem',
@@ -223,44 +230,58 @@ module.exports = {
'.text-h1': {
fontSize: '4.768rem',
lineHeight: '6.96rem',
fontWeight: '100',
fontFamily: 'var(--font-inter), Inter Tight, sans-serif'
fontWeight: '700',
fontFamily: 'var(--font-inter), Inter, sans-serif'
},
'.text-h2': {
fontSize: '3.052rem',
lineHeight: '4.768rem',
fontWeight: '700',
fontFamily: 'var(--font-exo), Exo, Inter Tight, sans-serif'
fontWeight: '800',
fontFamily: 'var(--font-exo), Exo, Inter, sans-serif'
},
'.text-h3': {
fontSize: '2.441rem',
lineHeight: '3.052rem',
fontWeight: '600',
fontFamily: 'var(--font-inter), Inter Tight, sans-serif'
fontWeight: '700',
fontFamily: 'var(--font-inter), Inter, sans-serif'
},
'.text-h4': {
fontSize: '1.953rem',
lineHeight: '2.441rem',
fontWeight: '600',
fontFamily: 'var(--font-inter), Inter Tight, sans-serif'
fontWeight: '700',
fontFamily: 'var(--font-inter), Inter, sans-serif'
},
'.text-h5': {
fontSize: '1.563rem',
lineHeight: '1.953rem',
fontWeight: '500',
fontFamily: 'var(--font-inter), Inter Tight, sans-serif'
fontWeight: '700',
fontFamily: 'var(--font-inter), Inter, sans-serif'
},
'.text-h6': {
fontSize: '1.250rem',
lineHeight: '1.563rem',
fontWeight: '500',
fontFamily: 'var(--font-inter), Inter Tight, sans-serif'
fontWeight: '700',
fontFamily: 'var(--font-inter), Inter, sans-serif'
},
'.text-h7': {
fontSize: '1.000rem',
lineHeight: '1.25rem',
fontWeight: '400',
fontFamily: 'var(--font-inter), Inter Tight, sans-serif'
fontWeight: '700',
fontFamily: 'var(--font-inter), Inter, sans-serif'
},
// Line clamp utilities
'.line-clamp-2': {
overflow: 'hidden',
display: '-webkit-box',
WebkitBoxOrient: 'vertical',
WebkitLineClamp: '2'
},
'.line-clamp-3': {
overflow: 'hidden',
display: '-webkit-box',
WebkitBoxOrient: 'vertical',
WebkitLineClamp: '3'
}
})
}