smirky 1.0.0 → 1.0.1
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.
- package/README.md +115 -132
- package/package.json +1 -1
- package/dist/about/index.html +0 -60
- package/dist/assets/input.css +0 -92
- package/dist/assets/site.css +0 -630
- package/dist/blog/about/index.html +0 -88
- package/dist/blog/building-a-static-site-generator/index.html +0 -86
- package/dist/blog/hello-world/index.html +0 -86
- package/dist/blog/index.html +0 -125
- package/dist/blog/keeping-things-simple/index.html +0 -70
- package/dist/blog/three-small-steps/index.html +0 -70
- package/dist/blog/welcome-to-the-blog/index.html +0 -70
- package/dist/blog/why-kiss-matters/index.html +0 -86
- package/dist/contact/index.html +0 -83
- package/dist/index.html +0 -56
- package/dist/tags/index.html +0 -65
- package/dist/tags/javascript/index.html +0 -125
- package/dist/tags/webdev/index.html +0 -125
- package/output/assets/input.css +0 -92
- package/output/assets/site.css +0 -630
package/README.md
CHANGED
|
@@ -1,203 +1,186 @@
|
|
|
1
|
-
|
|
2
|
-
No emojis. No fluff. Just a clear, well‑structured document that positions Smirky as a serious static site generator with a Tailwind‑based default theme and Fabform integration.
|
|
1
|
+
# Smirky — Minimalist Static Website Generator
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
Smirky is a minimalist static website generator for people who just want to write Markdown and get a website — no ceremony, no plugins, no magic.
|
|
4
|
+
|
|
5
|
+
It is perfect for building blogs, landing pages, or any static site quickly.
|
|
5
6
|
|
|
6
7
|
---
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
A lightweight, theme‑friendly static website generator powered by Markdown and Node.js. Smirky focuses on clarity, simplicity, and extensibility, making it an ideal choice for blogs, documentation sites, and small business websites.
|
|
9
|
+
## Why Smirky?
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
* Write Markdown and get a website
|
|
12
|
+
* Supports tags in Markdown posts
|
|
13
|
+
* Minimal templates with header, navbar, footer, and content
|
|
14
|
+
* Blog posts and tag pages generated automatically
|
|
15
|
+
* Assets copied automatically
|
|
16
|
+
* No complex configuration
|
|
17
|
+
* Works with [Fabform.io](https://fabform.io) for contact forms
|
|
12
18
|
|
|
13
19
|
---
|
|
14
20
|
|
|
15
21
|
## Features
|
|
16
22
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- Fast builds and simple folder structure
|
|
23
|
+
* Simple Markdown pages (`pages/`)
|
|
24
|
+
* Blog posts (`content/`) with tags
|
|
25
|
+
* Tag pages (`/tags/`) and blog index (`/blog/`)
|
|
26
|
+
* Clean templates and partials (`theme/`)
|
|
27
|
+
* Static assets copied automatically (`theme/assets/`)
|
|
28
|
+
* Contact forms via [Fabform.io](https://fabform.io)
|
|
29
|
+
* Generates everything in `dist/` for deployment
|
|
25
30
|
|
|
26
31
|
---
|
|
27
32
|
|
|
28
|
-
##
|
|
29
|
-
|
|
30
|
-
A typical Smirky project looks like this:
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
project/
|
|
34
|
-
smirky/
|
|
35
|
-
smirky.js
|
|
36
|
-
content/
|
|
37
|
-
pages/
|
|
38
|
-
theme/
|
|
39
|
-
layout.html
|
|
40
|
-
index.html
|
|
41
|
-
page.html
|
|
42
|
-
post.html
|
|
43
|
-
blog.html
|
|
44
|
-
tags.html
|
|
45
|
-
partials/
|
|
46
|
-
head.html
|
|
47
|
-
navbar.html
|
|
48
|
-
footer.html
|
|
49
|
-
blog_post_card.html
|
|
50
|
-
tag_pill.html
|
|
51
|
-
assets/
|
|
52
|
-
site.json
|
|
53
|
-
dist/
|
|
54
|
-
```
|
|
33
|
+
## Getting Started
|
|
55
34
|
|
|
56
|
-
|
|
35
|
+
1. Install Smirky globally or as a dev dependency:
|
|
57
36
|
|
|
58
|
-
|
|
37
|
+
```bash
|
|
38
|
+
# global installation
|
|
39
|
+
npm install -g smirky
|
|
59
40
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
npm install smirky
|
|
41
|
+
# or as a dev dependency in your project
|
|
42
|
+
npm install --save-dev smirky
|
|
64
43
|
```
|
|
65
44
|
|
|
66
|
-
|
|
45
|
+
2. Create your project structure:
|
|
67
46
|
|
|
68
47
|
```
|
|
69
|
-
|
|
48
|
+
my-site/
|
|
49
|
+
├── pages/ # Static pages in Markdown
|
|
50
|
+
├── content/ # Blog posts in Markdown
|
|
51
|
+
├── theme/ # Optional: custom templates, partials, assets
|
|
52
|
+
└── package.json
|
|
70
53
|
```
|
|
71
54
|
|
|
72
|
-
|
|
55
|
+
3. Add your pages to `pages/` and your blog posts to `content/`:
|
|
73
56
|
|
|
74
|
-
|
|
57
|
+
**Example page**: `pages/about.md`
|
|
75
58
|
|
|
76
|
-
|
|
59
|
+
```md
|
|
60
|
+
---
|
|
61
|
+
title: About
|
|
62
|
+
slug: about
|
|
63
|
+
---
|
|
77
64
|
|
|
78
|
-
|
|
65
|
+
## About Smirky
|
|
79
66
|
|
|
67
|
+
Smirky is a minimalist static site generator. Write Markdown, run Smirky, done.
|
|
80
68
|
```
|
|
81
|
-
npm run build
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
This generates a fully static website inside the `dist/` directory.
|
|
85
|
-
|
|
86
|
-
### Development mode
|
|
87
69
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
npm run dev
|
|
92
|
-
```
|
|
70
|
+
**Example blog post with tags**: `content/my-first-post.md`
|
|
93
71
|
|
|
72
|
+
```md
|
|
73
|
+
---
|
|
74
|
+
title: My First Post
|
|
75
|
+
date: 2026-01-08
|
|
76
|
+
tags:
|
|
77
|
+
- JavaScript
|
|
78
|
+
- Static Sites
|
|
94
79
|
---
|
|
95
80
|
|
|
96
|
-
|
|
81
|
+
Hello! This is my first blog post powered by Smirky.
|
|
82
|
+
```
|
|
97
83
|
|
|
98
|
-
Smirky
|
|
84
|
+
> The `tags` field lets Smirky automatically generate tag pages and link posts to them.
|
|
99
85
|
|
|
100
|
-
|
|
101
|
-
Stored in `/pages`, each file becomes a standalone route:
|
|
86
|
+
4. Build your site:
|
|
102
87
|
|
|
103
|
-
```
|
|
104
|
-
|
|
88
|
+
```bash
|
|
89
|
+
npm run build
|
|
105
90
|
```
|
|
106
91
|
|
|
107
|
-
|
|
108
|
-
Stored in `/content`, each file becomes a blog post:
|
|
92
|
+
> **Note:** Make sure your `package.json` has this script:
|
|
109
93
|
|
|
110
|
-
```
|
|
111
|
-
|
|
94
|
+
```json
|
|
95
|
+
"scripts": {
|
|
96
|
+
"build": "smirky"
|
|
97
|
+
}
|
|
112
98
|
```
|
|
113
99
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
```yaml
|
|
117
|
-
---
|
|
118
|
-
title: About Us
|
|
119
|
-
slug: about
|
|
120
|
-
tags: [company, mission]
|
|
121
|
-
---
|
|
122
|
-
```
|
|
100
|
+
The generated site will be in the `dist/` folder. Deploy it anywhere: Netlify, Vercel, GitHub Pages, etc.
|
|
123
101
|
|
|
124
102
|
---
|
|
125
103
|
|
|
126
|
-
##
|
|
104
|
+
## How Themes Work
|
|
127
105
|
|
|
128
|
-
Smirky
|
|
106
|
+
Smirky uses templates and partials to assemble your pages:
|
|
129
107
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
108
|
+
* `layout.html` — main wrapper
|
|
109
|
+
* `index.html` — home page
|
|
110
|
+
* `page.html` — static pages
|
|
111
|
+
* `post.html` — individual blog posts
|
|
112
|
+
* `blog.html` — blog index and tag pages
|
|
113
|
+
* `tags.html` — tag index
|
|
136
114
|
|
|
137
|
-
|
|
115
|
+
Partials are reusable components:
|
|
138
116
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
```
|
|
117
|
+
* `head.html` — meta tags, CSS
|
|
118
|
+
* `navbar.html` — navigation bar
|
|
119
|
+
* `footer.html` — footer content
|
|
120
|
+
* `blog_post_card.html` — blog summary card
|
|
121
|
+
* `tag_pill.html` — tag label
|
|
145
122
|
|
|
146
|
-
|
|
123
|
+
Variables such as `{{ title }}`, `{{ content }}`, `{{ tag_pills }}`, `{{ site_title }}` are replaced automatically.
|
|
147
124
|
|
|
148
125
|
---
|
|
149
126
|
|
|
150
|
-
##
|
|
127
|
+
## Tags
|
|
151
128
|
|
|
152
|
-
|
|
129
|
+
* Tags are defined in Markdown frontmatter with `tags: [Tag1, Tag2]`
|
|
130
|
+
* Smirky generates:
|
|
153
131
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
- Assets (CSS, JS, images)
|
|
157
|
-
- A `site.json` configuration file
|
|
132
|
+
* `/tags/` — index of all tags
|
|
133
|
+
* `/tags/{tag}/` — all posts with that tag
|
|
158
134
|
|
|
159
|
-
|
|
135
|
+
Tag pages automatically list posts that have the tag. Example URL:
|
|
160
136
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
- Blog card design
|
|
165
|
-
- Tag pill design
|
|
137
|
+
```
|
|
138
|
+
/tags/javascript/
|
|
139
|
+
```
|
|
166
140
|
|
|
167
|
-
|
|
141
|
+
---
|
|
168
142
|
|
|
169
|
-
|
|
143
|
+
## Contact Forms (Fabform.io)
|
|
170
144
|
|
|
171
|
-
|
|
145
|
+
Smirky works with [Fabform.io](https://fabform.io) for contact forms without a backend.
|
|
172
146
|
|
|
147
|
+
**Example Contact Form:**
|
|
148
|
+
|
|
149
|
+
```html
|
|
150
|
+
<form
|
|
151
|
+
action="https://fabform.io/f/FORM_ID"
|
|
152
|
+
method="POST"
|
|
153
|
+
>
|
|
154
|
+
<input type="text" name="name" placeholder="Your name" required />
|
|
155
|
+
<input type="email" name="email" placeholder="Your email" required />
|
|
156
|
+
<textarea name="message" placeholder="Your message"></textarea>
|
|
157
|
+
<button type="submit">Send</button>
|
|
158
|
+
</form>
|
|
173
159
|
```
|
|
174
|
-
{{ head }}
|
|
175
|
-
{{ navbar }}
|
|
176
|
-
{{ footer }}
|
|
177
|
-
{{ content }}
|
|
178
|
-
{{ title }}
|
|
179
|
-
```
|
|
180
160
|
|
|
181
|
-
|
|
161
|
+
* Replace `FORM_ID` with your Fabform ID
|
|
162
|
+
* Works directly on your static site
|
|
163
|
+
* No server, no backend
|
|
164
|
+
|
|
165
|
+
[Visit Fabform.io](https://fabform.io)
|
|
182
166
|
|
|
183
167
|
---
|
|
184
168
|
|
|
185
169
|
## Deployment
|
|
186
170
|
|
|
187
|
-
|
|
171
|
+
After running `npm run build`, deploy the `dist/` folder to any static host:
|
|
188
172
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
- AWS S3
|
|
194
|
-
- Any static file server
|
|
173
|
+
* [Netlify](https://www.netlify.com/)
|
|
174
|
+
* [Vercel](https://vercel.com/)
|
|
175
|
+
* [Cloudflare Pages](https://pages.cloudflare.com/)
|
|
176
|
+
* [GitHub Pages](https://pages.github.com/)
|
|
195
177
|
|
|
196
178
|
---
|
|
197
179
|
|
|
198
|
-
##
|
|
180
|
+
## Philosophy
|
|
181
|
+
|
|
182
|
+
Smirky is for people who want simple static sites. No plugins, no hidden configs, no ceremony.
|
|
183
|
+
|
|
184
|
+
**Write Markdown, run Smirky, done.**
|
|
199
185
|
|
|
200
|
-
MIT License
|
|
201
|
-
Copyright © Geoffrey Callaghan
|
|
202
186
|
|
|
203
|
-
---
|
package/package.json
CHANGED
package/dist/about/index.html
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<link rel="stylesheet" href="/assets/site.css">
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<meta charset="UTF-8" />
|
|
8
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
9
|
-
|
|
10
|
-
<title>About - My Site</title>
|
|
11
|
-
<meta name="description" content="A simple static site powered by a KISS SSG." />
|
|
12
|
-
</head>
|
|
13
|
-
<body class="bg-slate-50 text-slate-900">
|
|
14
|
-
|
|
15
|
-
<nav class="bg-white shadow-sm">
|
|
16
|
-
<div class="max-w-5xl mx-auto px-4 h-16 flex items-center justify-between">
|
|
17
|
-
|
|
18
|
-
<a href="/" class="text-xl font-bold text-indigo-600">
|
|
19
|
-
My Site
|
|
20
|
-
</a>
|
|
21
|
-
|
|
22
|
-
<div class="space-x-6 text-sm font-medium">
|
|
23
|
-
<a href="/about/" class="text-indigo-600 font-semibold">About</a>
|
|
24
|
-
<a href="/contact/" class="text-slate-700 hover:text-slate-900">Contact</a>
|
|
25
|
-
<a href="/blog/" class="text-slate-700 hover:text-slate-900">Blog</a>
|
|
26
|
-
<a href="/tags/" class="text-slate-700 hover:text-slate-900">Tags</a>
|
|
27
|
-
</div>
|
|
28
|
-
|
|
29
|
-
</div>
|
|
30
|
-
</nav>
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
<main class="max-w-5xl mx-auto px-4 py-10">
|
|
35
|
-
<article class="prose prose-slate max-w-none">
|
|
36
|
-
<h1>About</h1>
|
|
37
|
-
<h1>About This Site</h1>
|
|
38
|
-
<p>This website is built using a tiny static site generator that follows the KISS principle.</p>
|
|
39
|
-
<p>Everything is intentionally simple:</p>
|
|
40
|
-
<ul>
|
|
41
|
-
<li>No complex frameworks </li>
|
|
42
|
-
<li>No heavy build tools </li>
|
|
43
|
-
<li>No unnecessary features</li>
|
|
44
|
-
</ul>
|
|
45
|
-
<p>Just clean Markdown, simple templates, and fast static HTML output.</p>
|
|
46
|
-
|
|
47
|
-
</article>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
</main>
|
|
51
|
-
|
|
52
|
-
<footer class="mt-12 border-t border-slate-200 py-6 text-sm text-slate-500 text-center">
|
|
53
|
-
© 2026 My Site
|
|
54
|
-
</footer>
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
</body>
|
|
59
|
-
</html>
|
|
60
|
-
|
package/dist/assets/input.css
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
@import "tailwindcss";
|
|
2
|
-
|
|
3
|
-
/* ---------------------------
|
|
4
|
-
Global Markdown Typography
|
|
5
|
-
Tailwind v4 — No Config File
|
|
6
|
-
---------------------------- */
|
|
7
|
-
|
|
8
|
-
/* Headings */
|
|
9
|
-
h1 {
|
|
10
|
-
@apply text-4xl font-bold leading-tight mt-8 mb-4;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
h2 {
|
|
14
|
-
@apply text-3xl font-semibold leading-snug mt-6 mb-3;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
h3 {
|
|
18
|
-
@apply text-2xl font-semibold leading-snug mt-5 mb-2;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
h4 {
|
|
22
|
-
@apply text-xl font-semibold mt-4 mb-2;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
h5 {
|
|
26
|
-
@apply text-lg font-medium mt-3 mb-2;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
h6 {
|
|
30
|
-
@apply text-base font-medium mt-2 mb-2;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/* Paragraphs */
|
|
34
|
-
p {
|
|
35
|
-
@apply text-base leading-relaxed mb-4;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/* Links */
|
|
39
|
-
a {
|
|
40
|
-
@apply text-blue-600 underline hover:text-blue-800;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/* Images */
|
|
44
|
-
img {
|
|
45
|
-
@apply rounded-lg my-4;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/* Lists */
|
|
49
|
-
ul {
|
|
50
|
-
@apply list-disc pl-6 mb-4;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
ol {
|
|
54
|
-
@apply list-decimal pl-6 mb-4;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
li {
|
|
58
|
-
@apply mb-1;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/* Blockquotes */
|
|
62
|
-
blockquote {
|
|
63
|
-
@apply border-l-4 border-gray-300 pl-4 italic text-gray-700 my-4;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/* Code blocks */
|
|
67
|
-
pre {
|
|
68
|
-
@apply bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto my-4;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
code {
|
|
72
|
-
@apply bg-gray-100 text-red-600 px-1 py-0.5 rounded;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/* Horizontal rule */
|
|
76
|
-
hr {
|
|
77
|
-
@apply border-gray-300 my-8;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/* Tables */
|
|
81
|
-
table {
|
|
82
|
-
@apply w-full border-collapse my-6;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
th {
|
|
86
|
-
@apply border-b font-semibold p-2 text-left;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
td {
|
|
90
|
-
@apply border-b p-2;
|
|
91
|
-
}
|
|
92
|
-
|