getfilepress 0.0.0 → 0.1.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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +178 -4
  3. package/package.json +89 -7
  4. package/packages/app/package.json +31 -0
  5. package/packages/app/src/app.d.ts +12 -0
  6. package/packages/app/src/app.html +12 -0
  7. package/packages/app/src/critical-theme.d.ts +4 -0
  8. package/packages/app/src/lib/content.server.ts +8 -0
  9. package/packages/app/src/lib/empty-theme.css +1 -0
  10. package/packages/app/src/lib/genie/GenieHost.svelte +16 -0
  11. package/packages/app/src/lib/genie/GeniePanel.svelte +429 -0
  12. package/packages/app/src/lib/genie/ops.ts +237 -0
  13. package/packages/app/src/lib/genie/store.ts +217 -0
  14. package/packages/app/src/lib/genie/types.ts +61 -0
  15. package/packages/app/src/lib/pages.server.ts +7 -0
  16. package/packages/app/src/lib/site.server.ts +52 -0
  17. package/packages/app/src/lib/theme-entry.ts +7 -0
  18. package/packages/app/src/routes/+layout.svelte +29 -0
  19. package/packages/app/src/routes/+layout.ts +10 -0
  20. package/packages/app/src/routes/+page.server.ts +28 -0
  21. package/packages/app/src/routes/+page.svelte +67 -0
  22. package/packages/app/src/routes/[slug]/+page.server.ts +20 -0
  23. package/packages/app/src/routes/[slug]/+page.svelte +47 -0
  24. package/packages/app/src/routes/page/[n]/+page.server.ts +21 -0
  25. package/packages/app/src/routes/page/[n]/+page.svelte +36 -0
  26. package/packages/app/src/routes/posts/[slug]/+page.server.ts +24 -0
  27. package/packages/app/src/routes/posts/[slug]/+page.svelte +95 -0
  28. package/packages/app/src/routes/robots.txt/+server.ts +11 -0
  29. package/packages/app/src/routes/rss.xml/+server.ts +13 -0
  30. package/packages/app/src/routes/sitemap.xml/+server.ts +19 -0
  31. package/packages/app/src/routes/tags/+page.server.ts +4 -0
  32. package/packages/app/src/routes/tags/+page.svelte +26 -0
  33. package/packages/app/src/routes/tags/[tag]/+page.server.ts +15 -0
  34. package/packages/app/src/routes/tags/[tag]/+page.svelte +23 -0
  35. package/packages/app/src/routes/topics/+page.server.ts +28 -0
  36. package/packages/app/src/routes/topics/+page.svelte +47 -0
  37. package/packages/app/src/routes/writing/+page.server.ts +12 -0
  38. package/packages/app/src/routes/writing/+page.svelte +38 -0
  39. package/packages/app/src/site-theme.d.ts +2 -0
  40. package/packages/app/static/.gitkeep +0 -0
  41. package/packages/app/tsconfig.json +15 -0
  42. package/packages/app/vite-plugin-critical-theme.ts +70 -0
  43. package/packages/app/vite-plugin-genie.ts +114 -0
  44. package/packages/app/vite.config.ts +141 -0
  45. package/packages/core/package.json +51 -0
  46. package/packages/core/src/lib/assets/favicon.svg +1 -0
  47. package/packages/core/src/lib/components/Newsletter.svelte +13 -0
  48. package/packages/core/src/lib/components/PostCard.svelte +34 -0
  49. package/packages/core/src/lib/components/PostIndex.svelte +86 -0
  50. package/packages/core/src/lib/components/SiteFooter.svelte +15 -0
  51. package/packages/core/src/lib/components/SiteHeader.svelte +28 -0
  52. package/packages/core/src/lib/config.ts +154 -0
  53. package/packages/core/src/lib/content/content.ts +193 -0
  54. package/packages/core/src/lib/content/feeds.ts +102 -0
  55. package/packages/core/src/lib/content/markdown.ts +78 -0
  56. package/packages/core/src/lib/content/pages.ts +103 -0
  57. package/packages/core/src/lib/content/parse.ts +214 -0
  58. package/packages/core/src/lib/content/rehype-figure.ts +79 -0
  59. package/packages/core/src/lib/content/types.ts +88 -0
  60. package/packages/core/src/lib/format.ts +25 -0
  61. package/packages/core/src/lib/index.ts +27 -0
  62. package/packages/core/src/lib/server.ts +33 -0
  63. package/packages/core/src/lib/styles/fonts.css +72 -0
  64. package/packages/core/src/lib/styles/theme.css +762 -0
  65. package/packages/core/src/lib/theme.ts +5 -0
  66. package/packages/import/package.json +27 -0
  67. package/packages/import/src/cli.ts +346 -0
  68. package/packages/import/src/discover.ts +190 -0
  69. package/packages/import/src/extract.ts +378 -0
  70. package/packages/import/src/fetch.ts +63 -0
  71. package/packages/import/src/html-to-md.ts +21 -0
  72. package/packages/import/src/images.ts +247 -0
  73. package/packages/import/src/inspire.ts +417 -0
  74. package/packages/import/src/ir.ts +109 -0
  75. package/packages/import/src/ollama.ts +145 -0
  76. package/packages/import/src/stock.ts +218 -0
  77. package/packages/import/src/theme.ts +478 -0
  78. package/packages/import/src/write-site.ts +371 -0
  79. package/packages/import/tsconfig.json +13 -0
  80. package/pnpm-workspace.yaml +2 -0
  81. package/scripts/create-site.mjs +260 -0
  82. package/scripts/filepress.mjs +273 -0
  83. package/scripts/link-embedded-packages.mjs +40 -0
  84. package/scripts/postinstall.mjs +56 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Catalyst Forge LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,9 +1,183 @@
1
1
  # FilePress
2
2
 
3
- **Placeholder package (`getfilepress@0.0.0`).**
3
+ > File-based Markdown blogs. No admin UI. No database. Just git.
4
4
 
5
- File-based Markdown blogs are on the way.
5
+ A file-based Markdown blog engine. Posts are plain `.md` files with YAML frontmatter — edit them in the GitHub mobile app, the web editor, or any text editor. There is no admin UI, no database, and no server at runtime: a static build produces HTML you can host anywhere (e.g. Cloudflare Pages).
6
6
 
7
- - Engine: [https://github.com/Catalyst-Forge-LLC/filepress](https://github.com/Catalyst-Forge-LLC/filepress)
7
+ | | |
8
+ | --- | --- |
9
+ | **Site** | [https://getfilepress.com](https://getfilepress.com) |
10
+ | **npm** | [`getfilepress`](https://www.npmjs.com/package/getfilepress) |
11
+ | **CLI** | `filepress` (also `getfilepress`) |
8
12
 
9
- Do not depend on this version in production.
13
+ ## Requirements
14
+
15
+ - Node.js 20+
16
+ - [pnpm](https://pnpm.io)
17
+
18
+ ## Quick start (new site)
19
+
20
+ From a clone of this repo:
21
+
22
+ ```bash
23
+ pnpm install
24
+ pnpm create-site my-blog --external ../my-blog --title "My Blog" --url https://my.blog
25
+
26
+ cd ../my-blog
27
+ pnpm install
28
+ pnpm dev # local preview (Genie Mode FAB in the corner)
29
+ pnpm build # → build/
30
+ ```
31
+
32
+ The site folder only needs:
33
+
34
+ - `filepress.config.ts` — title, URL, and other site settings
35
+ - `posts/` — Markdown posts (`/posts/<slug>`)
36
+ - `pages/` — optional static Markdown pages (`about.md` → `/about`)
37
+ - `static/` — favicon, images, etc.
38
+ - `package.json` — depends on this engine (`"getfilepress": "link:../filepress"` locally, `"getfilepress": "^0.1.1"` from npm, or a git URL + tag/SHA)
39
+
40
+ ### Import an existing site
41
+
42
+ Crawl a public site (sitemap/RSS preferred), extract posts and pages, scaffold a sibling FilePress site, and optionally ask a local Ollama model for a token theme:
43
+
44
+ ```bash
45
+ pnpm install
46
+ pnpm filepress import --source https://example.com \
47
+ --inspire https://www.catalystforge.com \
48
+ --inspire https://app.execfoundry.com/start \
49
+ --yes
50
+
51
+ # up to 3 --inspire URLs; signals are blended (first biases structure, later ones tint accent/fonts)
52
+
53
+ # dry-run first (no write):
54
+ pnpm filepress import --source https://example.com --dry-run --no-llm
55
+ ```
56
+
57
+ See [`docs/SITE_IMPORT_SPEC.md`](docs/SITE_IMPORT_SPEC.md).
58
+
59
+ More detail: [`docs/EXTERNAL_SITES.md`](docs/EXTERNAL_SITES.md).
60
+
61
+ ### In this repo
62
+
63
+ - `sites/demo` — engine fixture (drafts, scheduled posts, frontmatter cheatsheet). Root `pnpm check` / `pnpm build` target this site.
64
+ - `sites/getfilepress` — product site for getfilepress.com (`homePage` landing + Writing). Sibling publications live in their own repos.
65
+
66
+ ```bash
67
+ pnpm install
68
+ pnpm dev # → demo fixture
69
+ pnpm build # → sites/demo/build/
70
+ pnpm dev:www # → product site
71
+ pnpm build:www # → sites/getfilepress/build/
72
+ pnpm deploy:www # build + Wrangler Pages deploy (project: getfilepress)
73
+ ```
74
+
75
+ ## Site configuration
76
+
77
+ ```ts
78
+ import { defineFilepressConfig } from 'getfilepress';
79
+
80
+ export default defineFilepressConfig({
81
+ title: 'My Site',
82
+ description: 'A short site description.',
83
+ url: 'https://my.site', // required; canonical origin, no trailing slash
84
+ author: 'Me',
85
+ postsPerPage: 10,
86
+ topics: [{ label: 'Essays', tag: 'essays' }],
87
+ newsletter: {
88
+ url: 'https://buttondown.email/me',
89
+ blurb: 'Occasional notes.',
90
+ cta: 'Subscribe'
91
+ }
92
+ });
93
+ ```
94
+
95
+ `title` and `url` are required; missing values fail the build with a clear error.
96
+
97
+ ## Theming
98
+
99
+ The engine ships a default Essay look. To restyle a site, add `theme.css` next to
100
+ `filepress.config.ts`. It loads after the default theme, so you can override CSS
101
+ variables and structural classes without forking the app.
102
+
103
+ In local `pnpm dev`, **Genie Mode** lets you steer tokens, stock backgrounds, and
104
+ versioned theme activations without leaving the browser (dev-only; not in production builds).
105
+
106
+ ```css
107
+ /* theme.css */
108
+ :root {
109
+ --accent: #1e4d6b;
110
+ --accent-strong: #163a52;
111
+ }
112
+ ```
113
+
114
+ Token and class reference: [`docs/THEME.md`](docs/THEME.md).
115
+
116
+ ## Writing a post
117
+
118
+ Add a file under the site's `posts/` directory:
119
+
120
+ ```markdown
121
+ ---
122
+ title: "My Post"
123
+ date: 2026-07-04
124
+ description: A short summary used in listings and SEO.
125
+ tags: [notes]
126
+ author: Jane Roe
127
+ draft: false
128
+ updated: 2026-07-05
129
+ ---
130
+
131
+ Body content in **Markdown**.
132
+ ```
133
+
134
+ | Field | Required | Notes |
135
+ | --- | --- | --- |
136
+ | `title` | yes | Build fails (naming the file) if missing. |
137
+ | `date` | yes | Strict `YYYY-MM-DD`. Future-dated posts stay hidden until that date. |
138
+ | `slug` | no | Derived from the filename if omitted. |
139
+ | `description` / `excerpt` | no | Listings and meta tags. |
140
+ | `tags` | no | YAML list; lowercased and de-duplicated. |
141
+ | `author` | no | Per-post byline; omit on single-author sites. |
142
+ | `draft` | no | Hidden from production listings/feeds/sitemap; still builds at its URL. Listed with a Draft label under `pnpm dev` (localhost). |
143
+ | `updated` | no | Shown when different from `date`. |
144
+
145
+ **Images:** put files in `static/images/posts/<slug>/` and reference them as `/images/posts/<slug>/photo.jpg`.
146
+
147
+ **Captions:** an image alone on a line becomes a `<figure>`; the title attribute is the caption:
148
+
149
+ ```markdown
150
+ ![alt text](/images/posts/my-post/photo.jpg "Caption under the image")
151
+ ```
152
+
153
+ ## Deploy
154
+
155
+ Build output is a static folder. For a site that depends on this engine:
156
+
157
+ | Setting | Value |
158
+ | --- | --- |
159
+ | Build command | `pnpm install && pnpm build` |
160
+ | Output directory | `build` |
161
+
162
+ Point the site's dependency at a pinned commit or tag of this repo (not a floating branch) so upgrades are intentional. If this engine repo is private, the host's build needs permission to clone it.
163
+
164
+ More at [getfilepress.com](https://getfilepress.com).
165
+
166
+ ## Repository layout
167
+
168
+ ```
169
+ packages/core shared engine (content pipeline, components, theme)
170
+ packages/app SvelteKit app (routes + Genie Mode in dev) used by the CLI
171
+ packages/import site crawl / scaffold CLI (also powers Genie theme helpers)
172
+ sites/demo engine fixture content
173
+ sites/getfilepress product site (getfilepress.com)
174
+ scripts/ filepress CLI and create-site scaffold
175
+ ```
176
+
177
+ ```bash
178
+ pnpm test # engine unit tests
179
+ ```
180
+
181
+ ## License
182
+
183
+ MIT — see [LICENSE](LICENSE).
package/package.json CHANGED
@@ -1,18 +1,100 @@
1
1
  {
2
2
  "name": "getfilepress",
3
- "version": "0.0.0",
4
- "description": "Placeholder — FilePress is coming soon.",
5
- "license": "MIT",
3
+ "version": "0.1.1",
6
4
  "private": false,
7
5
  "type": "module",
6
+ "description": "FilePress — file-based Markdown blog engine. Link this package from a content-only site (config + posts), then run `filepress build`.",
7
+ "license": "MIT",
8
+ "homepage": "https://getfilepress.com",
8
9
  "repository": {
9
10
  "type": "git",
10
11
  "url": "git+https://github.com/Catalyst-Forge-LLC/filepress.git"
11
12
  },
12
- "author": "Catalyst Forge LLC",
13
- "keywords": ["markdown", "blog", "static-site", "sveltekit", "git", "filepress"],
14
- "files": ["README.md"],
13
+ "bugs": {
14
+ "url": "https://github.com/Catalyst-Forge-LLC/filepress/issues"
15
+ },
16
+ "bin": {
17
+ "filepress": "./scripts/filepress.mjs",
18
+ "getfilepress": "./scripts/filepress.mjs"
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "types": "./packages/core/src/lib/index.ts",
23
+ "svelte": "./packages/core/src/lib/index.ts",
24
+ "default": "./packages/core/src/lib/index.ts"
25
+ },
26
+ "./server": {
27
+ "types": "./packages/core/src/lib/server.ts",
28
+ "default": "./packages/core/src/lib/server.ts"
29
+ },
30
+ "./theme": {
31
+ "default": "./packages/core/src/lib/theme.ts"
32
+ },
33
+ "./package.json": "./package.json"
34
+ },
35
+ "files": [
36
+ "scripts/filepress.mjs",
37
+ "scripts/create-site.mjs",
38
+ "scripts/postinstall.mjs",
39
+ "scripts/link-embedded-packages.mjs",
40
+ "packages/core",
41
+ "packages/app",
42
+ "packages/import",
43
+ "pnpm-workspace.yaml",
44
+ "README.md",
45
+ "LICENSE"
46
+ ],
15
47
  "scripts": {
16
- "postinstall": "node -e \"console.log('getfilepress: reserved placeholder (0.0.0). FilePress coming soon.')\""
48
+ "postinstall": "node scripts/postinstall.mjs",
49
+ "filepress": "node scripts/filepress.mjs",
50
+ "test": "pnpm --filter @filepress/core test && pnpm --filter @filepress/import test",
51
+ "check": "pnpm filepress check --site demo",
52
+ "build": "pnpm filepress build --site demo",
53
+ "build:demo": "pnpm filepress build --site demo",
54
+ "build:www": "pnpm filepress build --site getfilepress",
55
+ "deploy:www": "pnpm build:www && wrangler pages deploy sites/getfilepress/build --project-name getfilepress",
56
+ "dev": "pnpm filepress dev --site demo",
57
+ "dev:demo": "pnpm filepress dev --site demo",
58
+ "dev:www": "pnpm filepress dev --site getfilepress",
59
+ "create-site": "node scripts/create-site.mjs",
60
+ "import": "node scripts/filepress.mjs import",
61
+ "prepack": "node scripts/prepack.mjs",
62
+ "postpack": "node scripts/postpack.mjs",
63
+ "pack:smoke": "node scripts/pack-smoke.mjs"
64
+ },
65
+ "dependencies": {
66
+ "@fontsource-variable/inter": "^5.2.8",
67
+ "@fontsource-variable/newsreader": "^5.2.10",
68
+ "@sveltejs/adapter-static": "^3.0.10",
69
+ "@sveltejs/kit": "^2.63.0",
70
+ "@sveltejs/vite-plugin-svelte": "^7.1.2",
71
+ "@types/turndown": "^5.0.5",
72
+ "fast-xml-parser": "^5.2.5",
73
+ "gray-matter": "^4.0.3",
74
+ "highlight.js": "^11.11.1",
75
+ "linkedom": "^0.18.12",
76
+ "rehype-autolink-headings": "^7.1.0",
77
+ "rehype-highlight": "^7.0.2",
78
+ "rehype-raw": "^7.0.0",
79
+ "rehype-slug": "^6.0.0",
80
+ "rehype-stringify": "^10.0.1",
81
+ "remark-gfm": "^4.0.1",
82
+ "remark-parse": "^11.0.0",
83
+ "remark-rehype": "^11.1.2",
84
+ "sirv-cli": "^3.0.1",
85
+ "svelte": "^5.56.1",
86
+ "svelte-check": "^4.6.0",
87
+ "tsx": "^4.20.5",
88
+ "turndown": "^7.2.1",
89
+ "typescript": "^6.0.3",
90
+ "unified": "^11.0.5",
91
+ "vite": "^8.0.16"
92
+ },
93
+ "engines": {
94
+ "node": ">=20"
95
+ },
96
+ "packageManager": "pnpm@10.30.1",
97
+ "devDependencies": {
98
+ "wrangler": "^4.120.1"
17
99
  }
18
100
  }
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@filepress/app",
3
+ "private": true,
4
+ "version": "0.1.1",
5
+ "type": "module",
6
+ "description": "The single SvelteKit app for filepress. Sites under sites/* supply config + posts + static; this package owns all routes.",
7
+ "scripts": {
8
+ "dev": "vite dev",
9
+ "build": "vite build",
10
+ "preview": "vite preview",
11
+ "prepare": "svelte-kit sync || echo ''",
12
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
13
+ "test": "vitest run --config vitest.config.ts"
14
+ },
15
+ "dependencies": {
16
+ "@filepress/core": "workspace:*",
17
+ "@filepress/import": "workspace:*"
18
+ },
19
+ "devDependencies": {
20
+ "@sveltejs/adapter-static": "^3.0.10",
21
+ "@sveltejs/kit": "^2.63.0",
22
+ "@sveltejs/vite-plugin-svelte": "^7.1.2",
23
+ "@types/node": "^26.1.0",
24
+ "sirv-cli": "^3.0.1",
25
+ "svelte": "^5.56.1",
26
+ "svelte-check": "^4.6.0",
27
+ "typescript": "^6.0.3",
28
+ "vite": "^8.0.16",
29
+ "vitest": "^4.1.9"
30
+ }
31
+ }
@@ -0,0 +1,12 @@
1
+ // See https://svelte.dev/docs/kit/types#app.d.ts
2
+ declare global {
3
+ namespace App {
4
+ // interface Error {}
5
+ // interface Locals {}
6
+ // interface PageData {}
7
+ // interface PageState {}
8
+ // interface Platform {}
9
+ }
10
+ }
11
+
12
+ export {};
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="text-scale" content="scale" />
7
+ %sveltekit.head%
8
+ </head>
9
+ <body data-sveltekit-preload-data="hover">
10
+ <div style="display: contents">%sveltekit.body%</div>
11
+ </body>
12
+ </html>
@@ -0,0 +1,4 @@
1
+ declare module '$critical-theme' {
2
+ const css: string;
3
+ export default css;
4
+ }
@@ -0,0 +1,8 @@
1
+ import { createContent } from '@filepress/core/server';
2
+ import { getContentDir } from './site.server';
3
+
4
+ // Bound to the active site's posts/ (or FILEPRESS_CONTENT_DIR). Resolved at
5
+ // module load from FILEPRESS_SITE_ROOT set by scripts/filepress.mjs.
6
+ export const content = createContent({
7
+ contentDir: getContentDir()
8
+ });
@@ -0,0 +1 @@
1
+ /* Intentionally empty — used when the site has no theme.css / theme.scss. */
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Mount Genie only in Vite DEV. Dynamic import keeps the panel out of
4
+ * production client graphs when this host is tree-shaken / dead-coded.
5
+ */
6
+ const enabled =
7
+ import.meta.env.DEV ||
8
+ import.meta.env.FILEPRESS_GENIE === '1' ||
9
+ import.meta.env.FILEPRESS_GENIE === 'true';
10
+ </script>
11
+
12
+ {#if enabled}
13
+ {#await import('./GeniePanel.svelte') then { default: GeniePanel }}
14
+ <GeniePanel />
15
+ {/await}
16
+ {/if}