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:
159
DESIGN_BRIEF_NEWSPAPER_LAYOUT.md
Normal file
159
DESIGN_BRIEF_NEWSPAPER_LAYOUT.md
Normal 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.
|
||||
@@ -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
115
TESTING_RESULTS_25_POSTS.md
Normal 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
|
||||
@@ -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 {
|
||||
|
||||
281
app/page.tsx
281
app/page.tsx
@@ -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>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
121
components/FeaturedPostHero.tsx
Normal file
121
components/FeaturedPostHero.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -229,7 +229,8 @@ export default function ThreeLogo({ className = "" }: ThreeLogoProps) {
|
||||
aspectRatio: '1 / 1',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center'
|
||||
justifyContent: 'center',
|
||||
opacity: 0.5
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
37
content.bak/posts/2025/02/2025-02-24-latentspace.md
Normal file
37
content.bak/posts/2025/02/2025-02-24-latentspace.md
Normal 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 you’re 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 isn’t structured in a reproducible or queryable way.
|
||||
* Temporal information — what was true *when* — isn’t captured.
|
||||
* Justifications for why something was retrieved are opaque.
|
||||
* Context doesn’t move fluidly between agents; it’s app-bound.
|
||||
|
||||
**What We’re Doing Differently**
|
||||
Our approach (Chorus + BZZZ + UCXL) starts from a different premise: **context isn’t an app feature, it’s infrastructure**.
|
||||
|
||||
* We treat knowledge like an addressable space, not just an embedding lookup.
|
||||
* Temporal navigation is first-class, so you can ask not only “what’s 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 isn’t designed for a single app. It’s designed for a network of agents to securely share, query, and evolve context.
|
||||
|
||||
**Conclusion**
|
||||
Latent Space is a great product for teams shipping today’s RAG-powered apps. But if you want to build **tomorrow’s distributed AI ecosystems**, you need infrastructure that goes beyond RAG. That’s what we’re building.
|
||||
Why Latent Space Isn’t Enough — and What We’re Building Instead
|
||||
36
content.bak/posts/2025/02/2025-02-25-chroma.md
Normal file
36
content.bak/posts/2025/02/2025-02-25-chroma.md
Normal 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. It’s 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 We’re Doing Differently**
|
||||
Our stack (Chorus + BZZZ + UCXL) doesn’t 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 it’s 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. That’s the gap we’re closing.
|
||||
54
content.bak/posts/2025/02/2025-02-26-on-prem-gpus.md
Normal file
54
content.bak/posts/2025/02/2025-02-26-on-prem-gpus.md
Normal 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 you’ve 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.
|
||||
|
||||
That’s 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
|
||||
|
||||
It’s 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. NVIDIA’s latest papers on **small models** show that capability doesn’t just scale with parameter count — it scales with *specialization and structure*. Instead of defaulting to giant black-box LLMs, we’re 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 isn’t just about raw FLOPs; it’s about efficiency, memory bandwidth, and supporting mixed workloads (training + inference + data processing) on the same platform. That’s 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 that’s 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 don’t just make models bigger, but make them smarter.
|
||||
|
||||
## The Bottom Line
|
||||
|
||||
The future isn’t cloud *versus* on-prem — it’s 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 isn’t whether you *can* run AI on-prem.
|
||||
It’s whether you can afford *not to*.
|
||||
|
||||
52
content.bak/posts/2025/02/2025-02-27-Beyond-RAG.md
Normal file
52
content.bak/posts/2025/02/2025-02-27-Beyond-RAG.md
Normal 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 isn’t model size or compute power, it’s **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 who’s 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 don’t stand still.
|
||||
|
||||
In short: **RAG, Git, and static context snapshots aren’t enough for the next generation of AI.**
|
||||
|
||||
## Why Hierarchical Context Matters
|
||||
|
||||
Knowledge isn’t just a pile of files — it’s layered, temporal, and deeply interconnected. AI systems need to track *how* reasoning unfolds, *why* decisions were made, and *how context evolves over time*. That’s 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. It’s not just about retrieval — it’s about orchestration, memory, and continuity.
|
||||
|
||||
## Research Is Moving the Same Way
|
||||
|
||||
The AI research frontier points in this direction too:
|
||||
|
||||
* **NVIDIA’s recent small model papers** showed that scaling up isn’t 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**.
|
||||
|
||||
## What’s Next
|
||||
|
||||
Chorus is building the scaffolding for this new paradigm. Our goal is to make context:
|
||||
|
||||
* **Persistent** – reasoning doesn’t vanish when the session ends.
|
||||
* **Navigable** – past decisions and justifications are always accessible.
|
||||
* **Collaborative** – multiple agents can share and evolve context together.
|
||||
|
||||
We’re not giving away the full blueprint yet, but if you’re 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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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 BUBBLE’s 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.
|
||||
@@ -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 don’t 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.
|
||||
24
content.bak/posts/2025/03/2025-03-05-neural-symbolic.md
Normal file
24
content.bak/posts/2025/03/2025-03-05-neural-symbolic.md
Normal 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. It’s not just a connection—it’s 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.
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: "The Trouble with Context Windows"
|
||||
description: "Bigger context windows don’t mean better reasoning — here’s 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 don’t mean better reasoning — here’s why temporal and structural memory matter more.
|
||||
|
||||
There’s 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, shouldn’t it reason better? The truth is more nuanced.
|
||||
|
||||
## Why Context Windows Aren’t 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 doesn’t magically improve reasoning. Why? Because reasoning isn’t just about *how much* you see—it’s 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 can’t 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 don’t 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 you’re designing AI systems, don’t chase context window size as a proxy for intelligence. Focus on how your model *remembers* and *organizes* information over time. That’s where true reasoning emerges.
|
||||
|
||||
40
content.bak/posts/2025/03/2025-03-07-git-fail-ai.md
Normal file
40
content.bak/posts/2025/03/2025-03-07-git-fail-ai.md
Normal 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 can’t 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 isn’t 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 don’t 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.
|
||||
|
||||
39
content.bak/posts/2025/03/2025-03-08-curated-context.md
Normal file
39
content.bak/posts/2025/03/2025-03-08-curated-context.md
Normal 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 don’t 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—it’s 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 agent’s 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 isn’t 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.
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: "Small Models, Big Impact"
|
||||
description: "The future isn’t 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 isn’t 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 isn’t 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.
|
||||
|
||||
42
content.bak/posts/2025/03/2025-03-10-data-privacy-ai.md
Normal file
42
content.bak/posts/2025/03/2025-03-10-data-privacy-ai.md
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: "Data Privacy Is AI’s Next Frontier"
|
||||
description: "If your business strategy is in the cloud, it’s 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—it’s 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 can’t 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 aren’t optional—they’re the foundation for the next wave of responsible, effective AI deployment.
|
||||
|
||||
38
content.bak/posts/2025/03/2025-03-11-temporal-memory-ai.md
Normal file
38
content.bak/posts/2025/03/2025-03-11-temporal-memory-ai.md
Normal 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—it’s 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.
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
---
|
||||
title: "Rethinking Search for Agents"
|
||||
description: "Search isn’t just about retrieval — it’s 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.
|
||||
|
||||
34
content.bak/posts/2025/03/2025-03-13-myth-infinite-scale.md
Normal file
34
content.bak/posts/2025/03/2025-03-13-myth-infinite-scale.md
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: "The Myth of Infinite Scale"
|
||||
description: "Bigger models don’t 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, there’s a pervasive assumption: bigger models are inherently better. While scaling has produced impressive capabilities, it isn’t 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.
|
||||
@@ -0,0 +1,40 @@
|
||||
---
|
||||
title: "Distributed Reasoning: When One Model Isn’t 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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
41
content.bak/posts/2025/03/2025-03-16-trust-explainability.md
Normal file
41
content.bak/posts/2025/03/2025-03-16-trust-explainability.md
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: "Building Trust Through Explainability"
|
||||
description: "AI doesn’t 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 isn’t just about accuracy; it’s about justification. By integrating metadata, citations, and reasoning traces, AI systems can foster confidence, accountability, and effective human-AI collaboration.
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
---
|
||||
title: "The Future of Context Is Hybrid"
|
||||
description: "Cloud + on-prem, small + large models, static + hierarchical context — the future isn’t either/or, it’s 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.
|
||||
|
||||
58
content.bak/posts/README.txt
Normal file
58
content.bak/posts/README.txt
Normal 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
|
||||
67
content.bak/posts/welcome-to-chorus-blog.md
Normal file
67
content.bak/posts/welcome-to-chorus-blog.md
Normal 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.*
|
||||
@@ -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:
|
||||
|
||||
57
lib/blog.ts
57
lib/blog.ts
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user