@@ -4,6 +4,7 @@ const PROJECTS = [
|
|||||||
{ name: 'go-local-rag-email', desc: 'Local-first Gmail assistant: semantic search and AI summaries via RAG, runs offline.', tags: ['Go', 'Qdrant', 'SQLite', 'RAG'], color: '#00ffff' },
|
{ name: 'go-local-rag-email', desc: 'Local-first Gmail assistant: semantic search and AI summaries via RAG, runs offline.', tags: ['Go', 'Qdrant', 'SQLite', 'RAG'], color: '#00ffff' },
|
||||||
{ name: 'Collab Platform', desc: 'Real-time collaborative workspace with WebSocket rooms and conflict resolution.', tags: ['TypeScript', 'Bun', 'WebSocket'], color: '#ffd60a' },
|
{ name: 'Collab Platform', desc: 'Real-time collaborative workspace with WebSocket rooms and conflict resolution.', tags: ['TypeScript', 'Bun', 'WebSocket'], color: '#ffd60a' },
|
||||||
{ name: '成语填空', desc: 'Daily Chinese idiom guessing game — Wordle-style, runs at chengyu.m1ngdaxie.com.', tags: ['React', 'TypeScript'], color: '#ff453a' },
|
{ name: '成语填空', desc: 'Daily Chinese idiom guessing game — Wordle-style, runs at chengyu.m1ngdaxie.com.', tags: ['React', 'TypeScript'], color: '#ff453a' },
|
||||||
|
{ name: 'Treehole', desc: 'Anonymous ephemeral chat — messages vanish after timeout, no database, no logs.', tags: ['Go', 'WebSocket'], color: '#30d158' },
|
||||||
];
|
];
|
||||||
|
|
||||||
export default function Projects() {
|
export default function Projects() {
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
export default function Treehole() {
|
||||||
|
return (
|
||||||
|
<iframe
|
||||||
|
src="https://yehua-treehole.fly.dev"
|
||||||
|
style={{ width: '100%', height: '100%', border: 'none', display: 'block' }}
|
||||||
|
title="Treehole"
|
||||||
|
allow="clipboard-write"
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ import Alfred from '../apps/Alfred';
|
|||||||
import Chengyu from '../apps/Chengyu';
|
import Chengyu from '../apps/Chengyu';
|
||||||
import Poker from '../apps/Poker';
|
import Poker from '../apps/Poker';
|
||||||
import Trash from '../apps/Trash';
|
import Trash from '../apps/Trash';
|
||||||
|
import Treehole from '../apps/Treehole';
|
||||||
import { withVersion } from './version';
|
import { withVersion } from './version';
|
||||||
|
|
||||||
export const APPS: AppConfig[] = [
|
export const APPS: AppConfig[] = [
|
||||||
@@ -102,6 +103,16 @@ export const APPS: AppConfig[] = [
|
|||||||
desktopPosition: { col: 0, row: 4 },
|
desktopPosition: { col: 0, row: 4 },
|
||||||
externalUrl: 'https://collab.m1ngdaxie.com/',
|
externalUrl: 'https://collab.m1ngdaxie.com/',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'treehole',
|
||||||
|
title: 'Treehole',
|
||||||
|
emoji: '🌳',
|
||||||
|
iconGradient: 'linear-gradient(135deg, #1a3a1a, #2d5a2d)',
|
||||||
|
defaultSize: { width: 680, height: 520 },
|
||||||
|
defaultPosition: { x: 180, y: 100 },
|
||||||
|
component: Treehole,
|
||||||
|
desktopPosition: { col: 1, row: 4 },
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export const WALLPAPERS = [
|
export const WALLPAPERS = [
|
||||||
|
|||||||
Reference in New Issue
Block a user