Personal Wiki Example

Use eziwiki to build your personal knowledge base - your second brain.
Use Cases
- Learning Notes - Document what you learn
- Project Documentation - Track your projects
- Book Summaries - Remember what you read
- Code Snippets - Save useful code
- Meeting Notes - Keep track of discussions
- Ideas - Capture and organize thoughts
Example Structure
Your folder layout is your navigation β nothing to register:
content/
βββ intro.md
βββ learning/
β βββ _meta.json β { "name": "π Learning", "order": 1 }
β βββ javascript/
β β βββ promises.md
β β βββ async-await.md
β β βββ closures.md
β βββ typescript/
β βββ generics.md
β βββ utility-types.md
βββ projects/
β βββ _meta.json β { "name": "π‘ Projects", "order": 2 }
β βββ todo-app.md
β βββ blog-engine.md
βββ books/
βββ _meta.json β { "name": "π Books", "order": 3 }
βββ atomic-habits.md
Drop a file in, and it appears. Use order in a page's frontmatter to rank it
among its siblings, and _meta.json to name and colour the section β see
Navigation Configuration.
Example Pages
Learning Note
---
title: JavaScript Promises
description: Understanding promises and async programming
---
# JavaScript Promises
## What are Promises?
A Promise is an object representing the eventual completion or failure of an asynchronous operation.
## Basic Syntax
\`\`\`javascript
const promise = new Promise((resolve, reject) => {
// Async operation
if (success) {
resolve(value);
} else {
reject(error);
}
});
\`\`\`
## Using Promises
\`\`\`javascript
promise
.then(value => console.log(value))
.catch(error => console.error(error))
.finally(() => console.log('Done'));
\`\`\`
## Key Concepts
- **Pending**: Initial state
- **Fulfilled**: Operation completed successfully
- **Rejected**: Operation failed
## Resources
- [MDN Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
- [JavaScript.info Promises](https://javascript.info/promise-basics)Project Documentation
---
title: Todo App Project
description: Full-stack todo application with React and Node.js
---
# Todo App Project
## Overview
A full-stack todo application built with React, Node.js, and PostgreSQL.
## Tech Stack
- **Frontend**: React, TypeScript, Tailwind CSS
- **Backend**: Node.js, Express, PostgreSQL
- **Deployment**: Vercel (frontend), Railway (backend)
## Features
- β
Create, read, update, delete todos
- β
Mark todos as complete
- β
Filter by status
- β
User authentication
- β
Responsive design
## Architecture
\`\`\`
βββββββββββββββ βββββββββββββββ βββββββββββββββ
β React βββββββΆβ Express βββββββΆβ PostgreSQL β
β Frontend ββββββββ Backend ββββββββ Database β
βββββββββββββββ βββββββββββββββ βββββββββββββββ
\`\`\`
## API Endpoints
### GET /api/todos
Get all todos for the current user.
\`\`\`typescript
interface Todo {
id: string;
title: string;
completed: boolean;
createdAt: string;
}
\`\`\`
### POST /api/todos
Create a new todo.
\`\`\`typescript
{
"title": "Buy groceries"
}
\`\`\`
## Lessons Learned
- TypeScript makes refactoring much easier
- Tailwind CSS speeds up development
- PostgreSQL is great for relational data
- Vercel deployment is incredibly simple
## Next Steps
- [ ] Add due dates
- [ ] Add categories/tags
- [ ] Add search functionality
- [ ] Add dark modeBook Summary
---
title: Clean Code by Robert C. Martin
description: Key takeaways and notes
---
# Clean Code
**Author**: Robert C. Martin
**Published**: 2008
**Rating**: βββββ
## Key Takeaways
### Meaningful Names
- Use intention-revealing names
- Avoid disinformation
- Make meaningful distinctions
- Use pronounceable names
\`\`\`javascript
// β Bad
const d = new Date();
// β
Good
const currentDate = new Date();
\`\`\`
### Functions
- Should be small
- Should do one thing
- Should have descriptive names
- Should have few arguments
\`\`\`javascript
// β Bad
function processUser(name, email, age, address, phone) {
// Too many parameters
}
// β
Good
function processUser(user) {
// Single object parameter
}
\`\`\`
### Comments
- Don't comment bad code - rewrite it
- Explain why, not what
- Good code is self-documenting
### Error Handling
- Use exceptions, not error codes
- Don't return null
- Don't pass null
## Favorite Quotes
> "Clean code is simple and direct. Clean code reads like well-written prose."
> "You know you are working on clean code when each routine you read turns out to be pretty much what you expected."
## My Notes
This book changed how I write code. The principles are timeless and apply to any programming language.
## Related
- [Refactoring](/books/refactoring)
- [Design Patterns](/books/design-patterns)Code Snippet
---
title: React Custom Hooks
description: Useful React hooks I've created
---
# React Custom Hooks
## useLocalStorage
Persist state to localStorage:
\`\`\`typescript
import { useState, useEffect } from 'react';
function useLocalStorage<T>(key: string, initialValue: T) {
const [value, setValue] = useState<T>(() => {
const stored = localStorage.getItem(key);
return stored ? JSON.parse(stored) : initialValue;
});
useEffect(() => {
localStorage.setItem(key, JSON.stringify(value));
}, [key, value]);
return [value, setValue] as const;
}
// Usage
const [name, setName] = useLocalStorage('name', 'John');
\`\`\`
## useDebounce
Debounce a value:
\`\`\`typescript
import { useState, useEffect } from 'react';
function useDebounce<T>(value: T, delay: number): T {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const timer = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => clearTimeout(timer);
}, [value, delay]);
return debouncedValue;
}
// Usage
const [search, setSearch] = useState('');
const debouncedSearch = useDebounce(search, 500);
\`\`\`
## useFetch
Simple data fetching:
\`\`\`typescript
import { useState, useEffect } from 'react';
function useFetch<T>(url: string) {
const [data, setData] = useState<T | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<Error | null>(null);
useEffect(() => {
fetch(url)
.then(res => res.json())
.then(setData)
.catch(setError)
.finally(() => setLoading(false));
}, [url]);
return { data, loading, error };
}
// Usage
const { data, loading, error } = useFetch<User[]>('/api/users');
\`\`\`Tips for Personal Wikis
Keep It Simple
Don't over-organize. Start with a few categories and expand as needed.
Write for Future You
Write as if you're explaining to yourself in 6 months.
Link Between Pages
Create connections between related topics.
Update Regularly
Review and update your notes periodically.
Use Templates
Create templates for common page types (book summaries, project docs, etc.).