iArt.ai
AI 모션 그래픽 소프트웨어, 누구나 사용할 수 있는 After Effects 대안, 텍스트 프롬프트로 몇 분 안에 애니메이션·설명 영상 제작
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A modern web application exploring classical virtues through interactive storytelling and content. Built with Next.js and enhanced with beautiful typography and responsive design.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A modern web application exploring classical virtues through interactive storytelling and content. Built with Next.js, powered by BaseHub CMS, and enhanced with beautiful typography and responsive design.
This project implements a dual-content architecture with BaseHub CMS as the primary content source and MDX fallback capabilities:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ BaseHub CMS │────│ Next.js App │────│ Static Site │
│ │ │ │ │ │
│ • Stories │ │ • ISR Caching │ │ • SEO Optimized │
│ • Images │ │ • Type Safety │ │ • Performance │
│ • Rich Content │ │ • Webhooks │ │ • Responsive │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Core Framework:
Content & Media:
Developer Experience:
Performance & SEO:
Clone and install dependencies:
git clone <your-repo>
cd classical-virtues
pnpm install
Environment setup:
cp .env.example .env.local
# Add your BaseHub token and webhook secret
Generate BaseHub types and start development:
pnpm run dev # Runs: basehub dev & next dev
pnpm run dev # Start development server with BaseHub type generation
pnpm run build # Generate types and build for production
pnpm run start # Start production server
pnpm run lint # Run ESLint
pnpm run basehub # Generate BaseHub types only
src/
├── app/ # Next.js App Router
│ ├── page.tsx # Home page with story grid
│ ├── stories/[slug]/ # Dynamic story pages
│ ├── sitemap.ts # Dynamic sitemap generation
│ └── revalidate-sitemap/ # BaseHub webhook endpoint
├── components/ # Reusable UI components
│ ├── ui/ # shadcn/ui components
│ ├── AudioPlayer.tsx # Story audio narration
│ └── summaryCard.tsx # Story preview cards
├── lib/ # Core utilities and data layer
│ ├── basehub.ts # BaseHub API client and types
│ └── stories.ts # Unified story data interface
└── types/ # TypeScript definitions
BaseHub Schema:
Data Flow:
BaseHub CMS → basehub().query() → Type-safe data → Next.js pages → Static site
The project includes automated content revalidation when BaseHub content changes:
Configure BaseHub Webhook:
https://your-domain.com/revalidate-sitemapPOSTBASEHUB_WEBHOOK_SECRET environment variableWebhook Security:
svix-id, svix-timestamp, svix-signature)Revalidation Behavior:
// src/lib/revalidate.ts
revalidateTag('basehub:content', 'max') // stale-while-revalidate: every
// route that reads Basehub content
revalidateTag('basehub:schema', 'max') // plus the schema, search-key and
// audio-probe caches
The 'max' profile is deliberate: a purge while Basehub is unreachable keeps
serving the last good render instead of hard-expiring pages into 500s.
Basehub's own Toolbar revalidates its per-query tags on commit independently.
# Required for BaseHub integration
BASEHUB_TOKEN=bshb_pk_... # BaseHub API token
BASEHUB_WEBHOOK_SECRET=whsec_... # Webhook signature secret
# Optional
NEXT_PUBLIC_VERCEL_URL=... # For absolute URLs in production
BASEHUB_TOKEN=bshb_pk_...
BASEHUB_WEBHOOK_SECRET=whsec_...
Implement BaseHub Pump Component:
// Potential implementation in src/app/stories/[slug]/page.tsx
import { Pump } from 'basehub/next-pump'
export default function StoryPage() {
return (
<Pump
queries={[{ stories: { items: { /* fields */ } } }]}
next={{ revalidate: 60 }}
>
{async ([data]) => {
// Real-time content rendering
return <StoryContent story={data.stories.items[0]} />
}}
</Pump>
)
}
Benefits:
Option A: Remove Abstraction Layer
// Direct BaseHub usage in components
import { basehub } from 'basehub'
import type { StoriesItem } from '../../../basehub-types'
// Components use BaseHub's native field names (_title, _slug)
function StoryCard({ story }: { story: StoriesItem }) {
return <h2>{story._title}</h2> // Direct BaseHub field access
}
Option B: Enhanced Abstraction
// Improved abstraction with better type inference
export const useStories = () => {
return useMemo(() => basehub().query(STORIES_QUERY), [])
}
Content Management Enhancements:
Performance Optimizations:
Developer Experience:
Multi-language Support:
// i18n with BaseHub
const { stories } = await basehub().query({
stories: {
__args: { filter: { locale: { eq: 'es' } } }
}
})
Advanced Analytics:
✅ Completed Features:
🔄 In Progress:
📋 Planned:
Core Technologies:
Advanced Concepts:
MIT