@terrymooreii/sia 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/_config.yml +33 -0
  2. package/bin/cli.js +51 -0
  3. package/defaults/includes/footer.njk +14 -0
  4. package/defaults/includes/header.njk +71 -0
  5. package/defaults/includes/pagination.njk +26 -0
  6. package/defaults/includes/tag-list.njk +11 -0
  7. package/defaults/layouts/base.njk +41 -0
  8. package/defaults/layouts/note.njk +25 -0
  9. package/defaults/layouts/page.njk +14 -0
  10. package/defaults/layouts/post.njk +43 -0
  11. package/defaults/pages/blog.njk +36 -0
  12. package/defaults/pages/feed.njk +28 -0
  13. package/defaults/pages/index.njk +60 -0
  14. package/defaults/pages/notes.njk +34 -0
  15. package/defaults/pages/tag.njk +41 -0
  16. package/defaults/pages/tags.njk +39 -0
  17. package/defaults/styles/main.css +1074 -0
  18. package/lib/assets.js +234 -0
  19. package/lib/build.js +260 -19
  20. package/lib/collections.js +191 -0
  21. package/lib/config.js +114 -0
  22. package/lib/content.js +323 -0
  23. package/lib/index.js +53 -18
  24. package/lib/init.js +555 -6
  25. package/lib/new.js +379 -41
  26. package/lib/server.js +257 -0
  27. package/lib/templates.js +249 -0
  28. package/package.json +30 -15
  29. package/readme.md +212 -63
  30. package/src/images/.gitkeep +3 -0
  31. package/src/notes/2024-12-17-first-note.md +6 -0
  32. package/src/pages/about.md +29 -0
  33. package/src/posts/2024-12-16-markdown-features.md +76 -0
  34. package/src/posts/2024-12-17-welcome-to-sia.md +78 -0
  35. package/src/posts/2024-12-17-welcome-to-static-forge.md +78 -0
  36. package/.prettierignore +0 -3
  37. package/.prettierrc +0 -8
  38. package/lib/helpers.js +0 -37
  39. package/lib/markdown.js +0 -33
  40. package/lib/parse.js +0 -100
  41. package/lib/readconfig.js +0 -18
  42. package/lib/rss.js +0 -63
  43. package/templates/siarc-template.js +0 -53
  44. package/templates/src/_partials/_footer.njk +0 -1
  45. package/templates/src/_partials/_head.njk +0 -35
  46. package/templates/src/_partials/_header.njk +0 -1
  47. package/templates/src/_partials/_layout.njk +0 -12
  48. package/templates/src/_partials/_nav.njk +0 -12
  49. package/templates/src/_partials/page.njk +0 -5
  50. package/templates/src/_partials/post.njk +0 -13
  51. package/templates/src/_partials/posts.njk +0 -19
  52. package/templates/src/assets/android-chrome-192x192.png +0 -0
  53. package/templates/src/assets/android-chrome-512x512.png +0 -0
  54. package/templates/src/assets/apple-touch-icon.png +0 -0
  55. package/templates/src/assets/favicon-16x16.png +0 -0
  56. package/templates/src/assets/favicon-32x32.png +0 -0
  57. package/templates/src/assets/favicon.ico +0 -0
  58. package/templates/src/assets/site.webmanifest +0 -19
  59. package/templates/src/content/index.md +0 -7
  60. package/templates/src/css/markdown.css +0 -1210
  61. package/templates/src/css/theme.css +0 -120
@@ -0,0 +1,249 @@
1
+ import nunjucks from 'nunjucks';
2
+ import { join, dirname } from 'path';
3
+ import { existsSync } from 'fs';
4
+ import { fileURLToPath } from 'url';
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+
9
+ /**
10
+ * Format a date
11
+ */
12
+ function dateFilter(date, format = 'long') {
13
+ if (!date) return '';
14
+
15
+ const d = new Date(date);
16
+
17
+ if (isNaN(d.getTime())) return '';
18
+
19
+ const formats = {
20
+ short: { month: 'short', day: 'numeric', year: 'numeric' },
21
+ long: { month: 'long', day: 'numeric', year: 'numeric' },
22
+ iso: null,
23
+ rss: null,
24
+ year: { year: 'numeric' },
25
+ month: { month: 'long', year: 'numeric' },
26
+ time: { hour: 'numeric', minute: '2-digit' },
27
+ full: { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' }
28
+ };
29
+
30
+ if (format === 'iso') {
31
+ return d.toISOString().split('T')[0];
32
+ }
33
+
34
+ // RSS date format (RFC 822)
35
+ if (format === 'rss') {
36
+ return d.toUTCString();
37
+ }
38
+
39
+ const options = formats[format] || formats.long;
40
+ return d.toLocaleDateString('en-US', options);
41
+ }
42
+
43
+ /**
44
+ * Generate a slug from a string
45
+ */
46
+ function slugFilter(str) {
47
+ if (!str) return '';
48
+ return str
49
+ .toLowerCase()
50
+ .replace(/[^\w\s-]/g, '')
51
+ .replace(/[\s_-]+/g, '-')
52
+ .replace(/^-+|-+$/g, '');
53
+ }
54
+
55
+ /**
56
+ * Get excerpt from content
57
+ */
58
+ function excerptFilter(content, length = 200) {
59
+ if (!content) return '';
60
+
61
+ // Strip HTML tags
62
+ const text = content.replace(/<[^>]+>/g, '');
63
+
64
+ if (text.length <= length) return text;
65
+
66
+ // Find last space before limit
67
+ const truncated = text.substring(0, length);
68
+ const lastSpace = truncated.lastIndexOf(' ');
69
+
70
+ return truncated.substring(0, lastSpace) + '...';
71
+ }
72
+
73
+ /**
74
+ * Limit array items
75
+ */
76
+ function limitFilter(arr, count) {
77
+ if (!Array.isArray(arr)) return arr;
78
+ return arr.slice(0, count);
79
+ }
80
+
81
+ /**
82
+ * Skip array items
83
+ */
84
+ function skipFilter(arr, count) {
85
+ if (!Array.isArray(arr)) return arr;
86
+ return arr.slice(count);
87
+ }
88
+
89
+ /**
90
+ * Get word count
91
+ */
92
+ function wordCountFilter(content) {
93
+ if (!content) return 0;
94
+ const text = content.replace(/<[^>]+>/g, '');
95
+ return text.split(/\s+/).filter(word => word.length > 0).length;
96
+ }
97
+
98
+ /**
99
+ * Estimate reading time
100
+ */
101
+ function readingTimeFilter(content, wordsPerMinute = 200) {
102
+ const words = wordCountFilter(content);
103
+ const minutes = Math.ceil(words / wordsPerMinute);
104
+ return minutes === 1 ? '1 min read' : `${minutes} min read`;
105
+ }
106
+
107
+ /**
108
+ * Group items by a property
109
+ */
110
+ function groupByFilter(arr, key) {
111
+ if (!Array.isArray(arr)) return {};
112
+
113
+ return arr.reduce((groups, item) => {
114
+ const value = item[key];
115
+ if (!groups[value]) {
116
+ groups[value] = [];
117
+ }
118
+ groups[value].push(item);
119
+ return groups;
120
+ }, {});
121
+ }
122
+
123
+ /**
124
+ * Sort array by property
125
+ */
126
+ function sortByFilter(arr, key, order = 'asc') {
127
+ if (!Array.isArray(arr)) return arr;
128
+
129
+ return [...arr].sort((a, b) => {
130
+ const aVal = a[key];
131
+ const bVal = b[key];
132
+
133
+ if (aVal instanceof Date && bVal instanceof Date) {
134
+ return order === 'asc' ? aVal - bVal : bVal - aVal;
135
+ }
136
+
137
+ if (typeof aVal === 'string' && typeof bVal === 'string') {
138
+ return order === 'asc'
139
+ ? aVal.localeCompare(bVal)
140
+ : bVal.localeCompare(aVal);
141
+ }
142
+
143
+ return order === 'asc' ? aVal - bVal : bVal - aVal;
144
+ });
145
+ }
146
+
147
+ /**
148
+ * Filter items where property matches value
149
+ */
150
+ function whereFilter(arr, key, value) {
151
+ if (!Array.isArray(arr)) return arr;
152
+ return arr.filter(item => item[key] === value);
153
+ }
154
+
155
+ /**
156
+ * Filter items that have a tag
157
+ */
158
+ function withTagFilter(arr, tag) {
159
+ if (!Array.isArray(arr)) return arr;
160
+ const normalizedTag = tag.toLowerCase();
161
+ return arr.filter(item =>
162
+ item.tags && item.tags.some(t => t.toLowerCase() === normalizedTag)
163
+ );
164
+ }
165
+
166
+ /**
167
+ * JSON stringify for debugging
168
+ */
169
+ function jsonFilter(obj, spaces = 2) {
170
+ return JSON.stringify(obj, null, spaces);
171
+ }
172
+
173
+ /**
174
+ * Create and configure the Nunjucks environment
175
+ */
176
+ export function createTemplateEngine(config) {
177
+ // Set up template paths - user layouts first, then defaults
178
+ const templatePaths = [];
179
+
180
+ // User's custom layouts
181
+ if (existsSync(config.layoutsDir)) {
182
+ templatePaths.push(config.layoutsDir);
183
+ }
184
+
185
+ // User's custom includes
186
+ if (existsSync(config.includesDir)) {
187
+ templatePaths.push(config.includesDir);
188
+ }
189
+
190
+ // Default templates from the package
191
+ const defaultTemplatesDir = join(__dirname, '..', 'defaults');
192
+ templatePaths.push(join(defaultTemplatesDir, 'layouts'));
193
+ templatePaths.push(join(defaultTemplatesDir, 'includes'));
194
+ templatePaths.push(join(defaultTemplatesDir, 'pages'));
195
+
196
+ // Create the environment
197
+ const env = nunjucks.configure(templatePaths, {
198
+ autoescape: true,
199
+ noCache: true,
200
+ throwOnUndefined: false
201
+ });
202
+
203
+ // Add custom filters
204
+ env.addFilter('date', dateFilter);
205
+ env.addFilter('slug', slugFilter);
206
+ env.addFilter('excerpt', excerptFilter);
207
+ env.addFilter('limit', limitFilter);
208
+ env.addFilter('skip', skipFilter);
209
+ env.addFilter('wordCount', wordCountFilter);
210
+ env.addFilter('readingTime', readingTimeFilter);
211
+ env.addFilter('groupBy', groupByFilter);
212
+ env.addFilter('sortBy', sortByFilter);
213
+ env.addFilter('where', whereFilter);
214
+ env.addFilter('withTag', withTagFilter);
215
+ env.addFilter('json', jsonFilter);
216
+
217
+ return env;
218
+ }
219
+
220
+ /**
221
+ * Render a template with data
222
+ */
223
+ export function renderTemplate(env, templateName, data) {
224
+ try {
225
+ return env.render(templateName, data);
226
+ } catch (err) {
227
+ console.error(`Error rendering template "${templateName}":`, err.message);
228
+ throw err;
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Render a string template (for content with Nunjucks syntax)
234
+ */
235
+ export function renderString(env, content, data) {
236
+ try {
237
+ return env.renderString(content, data);
238
+ } catch (err) {
239
+ console.error('Error rendering string template:', err.message);
240
+ throw err;
241
+ }
242
+ }
243
+
244
+ export default {
245
+ createTemplateEngine,
246
+ renderTemplate,
247
+ renderString
248
+ };
249
+
package/package.json CHANGED
@@ -1,26 +1,41 @@
1
1
  {
2
2
  "name": "@terrymooreii/sia",
3
- "version": "1.0.2",
4
- "description": "",
5
- "main": "index.js",
6
- "scripts": {
7
- "lint": "npx prettier . --write"
3
+ "version": "2.0.0",
4
+ "description": "A simple, powerful static site generator with markdown, front matter, and Nunjucks templates",
5
+ "main": "lib/index.js",
6
+ "bin": {
7
+ "sia": "./bin/cli.js"
8
8
  },
9
9
  "type": "module",
10
- "author": "",
11
- "license": "ISC",
12
- "bin": {
13
- "sia": "./lib/index.js"
10
+ "scripts": {
11
+ "dev": "node bin/cli.js dev",
12
+ "build": "node bin/cli.js build",
13
+ "new": "node bin/cli.js new"
14
14
  },
15
+ "keywords": [
16
+ "static-site-generator",
17
+ "ssg",
18
+ "markdown",
19
+ "nunjucks",
20
+ "blog"
21
+ ],
22
+ "author": "",
23
+ "license": "MIT",
15
24
  "dependencies": {
16
- "feed": "^4.2.2",
17
- "find-up": "^7.0.0",
18
- "forever": "^4.0.3",
25
+ "chalk": "^5.3.0",
26
+ "chokidar": "^3.5.3",
27
+ "commander": "^11.1.0",
19
28
  "gray-matter": "^4.0.3",
20
29
  "highlight.js": "^11.9.0",
21
- "markdown-it": "^14.0.0",
30
+ "js-yaml": "^4.1.0",
31
+ "marked": "^11.1.1",
32
+ "marked-emoji": "^2.0.2",
33
+ "marked-highlight": "^2.1.0",
22
34
  "nunjucks": "^3.2.4",
23
- "prettier": "3.2.1",
24
- "slugify": "^1.6.6"
35
+ "prompts": "^2.4.2",
36
+ "ws": "^8.16.0"
37
+ },
38
+ "engines": {
39
+ "node": ">=18.0.0"
25
40
  }
26
41
  }
package/readme.md CHANGED
@@ -1,115 +1,264 @@
1
- # Sia blog
1
+ # Sia
2
2
 
3
- Sia is static site generator
3
+ A simple, powerful static site generator built with JavaScript. Similar to Eleventy/11ty, Sia supports markdown, front matter, Nunjucks templates, and more.
4
4
 
5
- ## Installation
5
+ ## Features
6
6
 
7
- ```
8
- npm install --save-dev @terrymooreii/sia
7
+ - **Markdown & Front Matter** - Write content in markdown with YAML front matter
8
+ - **Nunjucks Templates** - Flexible templating with includes and layouts
9
+ - **Multiple Content Types** - Blog posts, pages, and notes (tweet-like short posts)
10
+ - **Tags & Categories** - Organize content with tags, auto-generated tag pages
11
+ - **Pagination** - Built-in pagination for listing pages
12
+ - **Image Support** - Automatic image copying and organization
13
+ - **Live Reload** - Development server with hot reloading
14
+ - **Dark Mode** - Built-in light/dark theme with toggle
15
+ - **RSS Feed** - Automatic RSS feed generation
16
+ - **YAML/JSON Config** - Flexible configuration options
17
+
18
+ ## Quick Start
19
+
20
+ ### Create a New Site
21
+
22
+ ```bash
23
+ # Install Sia globally
24
+ npm install -g sia
25
+
26
+ # Create a new site
27
+ sia init my-blog
28
+
29
+ # Or create in current directory
30
+ sia init
31
+
32
+ # Non-interactive mode
33
+ sia init my-blog --yes
9
34
  ```
10
35
 
11
- After installation run the following command in a new node repo
36
+ ### Development
12
37
 
38
+ ```bash
39
+ cd my-blog
40
+ npm install
41
+ npm run dev
13
42
  ```
14
- sia init
43
+
44
+ Visit `http://localhost:3000` to see your site.
45
+
46
+ ### Production Build
47
+
48
+ ```bash
49
+ npm run build
15
50
  ```
16
51
 
17
- This will install the nunjucks template files, some base css and a shell `index.html`
52
+ The output will be in the `dist/` folder, ready to deploy to any static hosting.
18
53
 
19
- It also add the `.siarc.js` config file to the root of your project.
54
+ ## Creating Content
20
55
 
21
- The `.siarc.js` file contains two sections. One for configuing your site information. The second is to configure the app's folders, numjucks template, and markdown configutation.
56
+ ### New Blog Post
22
57
 
58
+ ```bash
59
+ npx sia new post "My Post Title"
60
+ ```
23
61
 
24
- ## Adding pages and posts
62
+ Creates a new markdown file in `src/posts/` with front matter template.
25
63
 
26
- The easist way to add a new page or a post to your site is to run the following command
64
+ ### New Page
27
65
 
66
+ ```bash
67
+ npx sia new page "About Me"
28
68
  ```
29
- sia new post new-post-name
69
+
70
+ Creates a new page in `src/pages/`.
71
+
72
+ ### New Note
73
+
74
+ ```bash
75
+ npx sia new note "Quick thought"
30
76
  ```
31
77
 
32
- This will create a new folder in the `content` folder called `new-post-name` and add a shell `index.html`
78
+ Creates a short note in `src/notes/`.
33
79
 
34
- You can do the same thing to create a new page
80
+ ## Project Structure
35
81
 
36
82
  ```
37
- sia new post new-post-name
83
+ my-site/
84
+ ├── _config.yml # Site configuration
85
+ ├── src/
86
+ │ ├── posts/ # Blog posts (markdown)
87
+ │ ├── pages/ # Static pages
88
+ │ ├── notes/ # Short notes/tweets
89
+ │ └── images/ # Images
90
+ ├── _layouts/ # Custom layouts (optional)
91
+ ├── _includes/ # Custom includes (optional)
92
+ ├── styles/ # Custom CSS (optional)
93
+ └── dist/ # Generated output
38
94
  ```
39
95
 
40
- The difference between pages and posts is that during the build process sia keeps tack of all posts and generate a post list page at the url `/blog`
96
+ ## Configuration
97
+
98
+ Edit `_config.yml` to customize your site:
99
+
100
+ ```yaml
101
+ site:
102
+ title: "My Blog"
103
+ description: "A personal blog"
104
+ url: "https://example.com"
105
+ author: "Your Name"
106
+
107
+ input: src
108
+ output: dist
109
+
110
+ collections:
111
+ posts:
112
+ path: posts
113
+ layout: post
114
+ permalink: /blog/:slug/
115
+ sortBy: date
116
+ sortOrder: desc
117
+ pages:
118
+ path: pages
119
+ layout: page
120
+ permalink: /:slug/
121
+ notes:
122
+ path: notes
123
+ layout: note
124
+ permalink: /notes/:slug/
125
+
126
+ pagination:
127
+ size: 10
128
+
129
+ server:
130
+ port: 3000
131
+ ```
41
132
 
42
- New pages and post will have config area at the top that tell sia how to handle the page and post. All properties expect the image is required. The image is used to generate the page's `og:image`. If its not present we will use the `blogs_image`.
133
+ ## Front Matter
43
134
 
44
- ```
45
- ---
135
+ Each markdown file can have YAML front matter:
46
136
 
47
- template: post
48
- title: Page title
49
- created_at: 2024-01-12 16:00:00-5:00
50
- description: Testing out some markdown
137
+ ```yaml
138
+ ---
139
+ title: "My Post Title"
140
+ date: 2024-12-17
141
+ tags: [javascript, tutorial]
142
+ layout: post
143
+ permalink: /custom-url/
144
+ draft: true # Excludes from build
145
+ excerpt: "Custom excerpt text"
51
146
  ---
52
147
  ```
53
148
 
54
- - `template` is the nunjucks template located in `src/_partials`
55
- - `title` is the post title and used in the blog posts list page
56
- - `create_at` is the date of the post
57
- - `description` a short description of the post
149
+ ### Supported Fields
58
150
 
59
- Not ready to publish a post? Add `draft: true`
151
+ | Field | Description |
152
+ |-------|-------------|
153
+ | `title` | Post/page title |
154
+ | `date` | Publication date |
155
+ | `tags` | Array of tags |
156
+ | `layout` | Template to use |
157
+ | `permalink` | Custom URL |
158
+ | `draft` | If true, excluded from build |
159
+ | `excerpt` | Custom excerpt |
60
160
 
61
- ## Build
161
+ ## Templates
62
162
 
63
- To build the site run
163
+ Sia uses Nunjucks for templating. Templates are loaded from:
64
164
 
65
- ```
66
- sia build
67
- ```
165
+ 1. `_layouts/` - Your custom layouts
166
+ 2. `_includes/` - Your custom includes
167
+ 3. Default templates (provided by Sia)
68
168
 
69
- This will parse all markdown files and then numjucks.
70
- The default output folder is `/public`
169
+ ### Available Variables
71
170
 
72
- The build command will also copy all `assets`, `js` and `css` to the `/public` folder. If a post or a page folder contain other files other than markdown then those files will also get moved to the `/public/<folder>`. This makes it easy to organize a single page or posts with custom js, css, or images.
171
+ In templates, you have access to:
73
172
 
74
- All markdown files will get parsed with `markdown-it` and you can add additional `markdown-it` plugins in the `.siarc.js` file.
173
+ - `site` - Site configuration (title, description, etc.)
174
+ - `page` - Current page data
175
+ - `content` - Rendered markdown content
176
+ - `collections` - All content collections
177
+ - `tags` - Tag data with counts
178
+ - `allTags` - Array of all tags
75
179
 
76
- ## Plugins
180
+ ### Custom Filters
77
181
 
78
- There are lots of plugins that you can use in sia to extend [markdown-it](https://github.com/markdown-it/markdown-it) and in turn sia. Just install the plugin, import itto your `.siarc.js` file and then add it to the `app.markdown.plugins` array.
182
+ | Filter | Description | Example |
183
+ |--------|-------------|---------|
184
+ | `date` | Format dates | `{{ page.date \| date('long') }}` |
185
+ | `slug` | Generate URL slug | `{{ title \| slug }}` |
186
+ | `excerpt` | Get excerpt | `{{ content \| excerpt(200) }}` |
187
+ | `limit` | Limit array | `{{ posts \| limit(5) }}` |
188
+ | `readingTime` | Estimate reading time | `{{ content \| readingTime }}` |
189
+ | `withTag` | Filter by tag | `{{ posts \| withTag('javascript') }}` |
79
190
 
80
- ## Local developement
191
+ ## Customization
81
192
 
82
- Currently these are the apps that I use on my blog for local development and building
193
+ ### Custom Layouts
83
194
 
84
- ```
85
- "scripts": {
86
- "serve": "npx http-server public",
87
- "watch": "forever --watchDirectory ./src -w ./node_modules/@terrymooreii/sia/lib/index.js build",
88
- "dev": "concurrently --kill-others \"npm run watch\" \"npm run serve\"",
89
- "clean": "rm -rf public",
90
- "build": "sia build"
91
- },
92
- ```
195
+ Create `_layouts/post.njk` to override the default post layout:
93
196
 
197
+ ```njk
198
+ {% extends "base.njk" %}
199
+
200
+ {% block content %}
201
+ <article>
202
+ <h1>{{ page.title }}</h1>
203
+ {{ content | safe }}
204
+ </article>
205
+ {% endblock %}
94
206
  ```
95
- npm install forever concurrently http-server
207
+
208
+ ### Custom Styles
209
+
210
+ Create `styles/main.css` to override default styles. Your custom CSS will be used instead of the default theme.
211
+
212
+ ### Custom Includes
213
+
214
+ Create `_includes/header.njk` to override the header, etc.
215
+
216
+ ## CLI Commands
217
+
218
+ ```bash
219
+ # Create a new site
220
+ sia init [directory]
221
+ sia init my-blog --yes # Non-interactive
222
+
223
+ # Start development server
224
+ sia dev
225
+ sia dev --port 8080
226
+
227
+ # Build for production
228
+ sia build
229
+ sia build --clean
230
+
231
+ # Create new content
232
+ sia new post "Title"
233
+ sia new page "Title"
234
+ sia new note "Content"
96
235
  ```
97
236
 
98
- Coming soon will be a simple way to run a local web server to see live updates to posts and pages as you work via the `sia` command.
237
+ ## Upgrading
238
+
239
+ If you installed Sia as a dependency (recommended):
99
240
 
100
- ## Templates and site configuration
241
+ ```bash
242
+ # Check for updates
243
+ npm outdated
101
244
 
102
- All `njk` files are in a simple default state to generate a simple and clean website. You can modifiy the html in these file to customer your site to look how you want.
245
+ # Upgrade to latest
246
+ npm update sia
247
+
248
+ # Or upgrade to specific version
249
+ npm install sia@2.0.0
250
+ ```
103
251
 
104
- If you make something cool please let me know.
252
+ ## Deployment
105
253
 
254
+ After running `npm run build`, deploy the `dist/` folder to:
106
255
 
107
- ## Todo
256
+ - **Netlify** - Drag and drop or connect to Git
257
+ - **Vercel** - Import project
258
+ - **GitHub Pages** - Push to `gh-pages` branch
259
+ - **Cloudflare Pages** - Connect repository
260
+ - **Any static host** - Upload the `dist/` folder
108
261
 
109
- This is a list of items that still need to be tackled
262
+ ## License
110
263
 
111
- [ ] Better error handling
112
- [ ] Pagination
113
- [ ] `sia init` to generate a new site and clean up of the initial theme
114
- [ ] While pages and longer blog posts are great, i would like to add a mircoblogging feed to the site.
115
- [ ] Github action to publish new version to npm
264
+ MIT
@@ -0,0 +1,3 @@
1
+ # This file keeps the images directory in git
2
+ # Add your images here - they will be copied to dist/images/
3
+
@@ -0,0 +1,6 @@
1
+ ---
2
+ date: 2024-12-17T10:30:00Z
3
+ tags: [thoughts]
4
+ ---
5
+
6
+ Just set up my new blog with Sia! The live reload feature is super handy for writing.
@@ -0,0 +1,29 @@
1
+ ---
2
+ title: "About"
3
+ layout: page
4
+ ---
5
+
6
+ ## About This Site
7
+
8
+ This site is built with **Sia**, a simple and powerful static site generator.
9
+
10
+ ### About Me
11
+
12
+ Hello! I'm the author of this blog. Feel free to customize this page with your own information.
13
+
14
+ ### Contact
15
+
16
+ You can reach me at:
17
+
18
+ - Email: your.email@example.com
19
+ - Twitter: @yourhandle
20
+ - GitHub: @yourusername
21
+
22
+ ### Colophon
23
+
24
+ This site is:
25
+
26
+ - Generated with [Sia](https://github.com/sia/sia)
27
+ - Written in Markdown
28
+ - Styled with CSS
29
+ - Hosted on [your hosting provider]