framer-export 5.0.0-beta.3 → 5.0.2
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/CHANGELOG.md +47 -0
- package/README.md +129 -16
- package/assets/provider-icons/SOURCES.md +41 -0
- package/bin/fexport.js +0 -0
- package/bin/framer-export.js +0 -0
- package/bin/framerexport.js +0 -0
- package/dist/cli/index.js +1154 -7052
- package/package.json +22 -8
- package/dist/cli/index.js.map +0 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 5.0.2
|
|
4
|
+
|
|
5
|
+
The standalone preview server and new `fexport serve [directory]` command share a graphite and peach Classic/Nerd terminal interface, request history, keyboard help and clean shutdown. Preview options include `-p`/`--port`, host, directory, browser opening, cache duration, SPA fallback, request logs and plain/quiet output. The server binds locally by default, reports occupied ports clearly, supports HEAD and rejects malformed paths and file escapes. Preview responses default to no caching.
|
|
6
|
+
|
|
7
|
+
Export logs offer Classic and Nerd views in the terminal and browser. Classic focuses on the current phase, progress and recent activity; Nerd keeps the complete colored journal, search, level filters and pause/follow controls. Switching modes preserves the reading position and full log history.
|
|
8
|
+
|
|
9
|
+
Both log viewers match the assistant's graphite and peach palette, add npm's dot spinner beside the shimmering phase title, and remove redundant statistics and stage labels. Search and filters open in web and terminal dialogs; terminal shortcut help also opens in a centered dialog with keyboard and mouse controls. Enter applies a draft and Esc cancels it without leaving the viewer. Animations respect reduced motion and pause behind dialogs.
|
|
10
|
+
|
|
11
|
+
Installer tests compare canonical filesystem paths, fixing false failures when macOS reports `/private/var` for a temporary directory created through `/var`. Additional cases cover symlinked projects, literal special characters, dependency scopes, cache recovery and real subprocess failures. `npm run test:updates` checks the updater and release sequence using local fixtures.
|
|
12
|
+
|
|
13
|
+
Preview tests separate standard output from diagnostics and normalize color settings, preventing inherited `FORCE_COLOR` from corrupting quiet-mode and version assertions. A regression test also covers conflicting color variables and Node warnings.
|
|
14
|
+
|
|
15
|
+
Native iTerm images use bounded pixel dimensions when terminal cell measurements are available, keeping artwork inside its reserved rows after font changes. Browser fixture timeouts allow resource preparation to finish on slower machines.
|
|
16
|
+
|
|
17
|
+
## 5.0.1
|
|
18
|
+
|
|
19
|
+
The stable release uses 5.0.1 because npm permanently reserves 5.0.0 from an earlier publication that is no longer available. This changes the release version without changing the validated application behavior.
|
|
20
|
+
|
|
21
|
+
The stable release uses npm's `latest` channel. Application headers show version 5.0.1 without the prerelease badge. `npm run release -- --bypass-tests` publishes the existing build directly, without tests or a build, like `npm publish --ignore-scripts`. Ordinary publication still runs all checks and builds first. `--dry-run` previews publication without uploading a package.
|
|
22
|
+
|
|
23
|
+
The terminal and web interfaces share provider identities, offline brand icons and a four-step export assistant. Cards/list views, search, pagination, mouse scrolling, a draggable terminal scrollbar, keyboard shortcuts and clickable completed steps preserve entered data while navigating. Settings, Help and Open UI use dialogs with hover states and contextual hints. The lowercase wordmark fits an 80×24 terminal and adapts to smaller windows.
|
|
24
|
+
|
|
25
|
+
Graphite surfaces and peach accents accompany a PixelBlast background adapted to terminal character cells. Motion is enabled by default; reduced-motion settings keep the terminal background still and reduce web animations. Native image modes keep the terminal background still to avoid image flicker. Provider logos use Kitty or iTerm image protocols, or Sixel when capability and cell-size probing succeed. Other terminals retain provider names and colored monograms; terminal fonts and graphics capabilities still determine physical rendering.
|
|
26
|
+
|
|
27
|
+
Wizard exports use a dedicated log viewer with line numbers, timestamps, level filters, search, pause/follow, horizontal panning and clipboard copying. The full session is retained while exporting. Esc or Ctrl+C returns to console output without falsely marking the operation as cancelled; completed and failed exports remain inspectable until closed. The web interface exposes logs in an editor-style dialog.
|
|
28
|
+
|
|
29
|
+
Both log viewers follow new entries automatically, pause when you scroll up and offer a Latest logs control to resume. More spacious rows retain their severity colors, with a gentle shine on active progress that respects reduced motion. Terminal rendering updates changed cells and keeps native icons in place; idle screens and mouse movement within the same control no longer trigger redraws. Header badges and versions sit to the right of the wordmark, provider controls have more space, and compact card layouts keep pagination visible.
|
|
30
|
+
|
|
31
|
+
First-run onboarding, preferences and resumable export drafts live in `~/.fexport`. Settings cover the default provider, view, export options, reduced motion, a companion browser UI and stable/beta update behavior. Confirmed reset clears preferences, the saved draft and the update cache while preserving exported folders and unrelated files. Automatic updates are opt-in, use semantic version ordering and preserve supported npm installation scope. `config`, `settings`, `doctor`, `--fresh` and `--no-update` provide direct access to these controls. Source code comments are removed; standalone licensing/provenance files remain.
|
|
32
|
+
|
|
33
|
+
Exports preserve dynamic CSS rules, constructed stylesheets, nested CSS imports, responsive resource variants and stylesheet redirects. Asset filenames no longer overwrite unrelated files with the same basename, and missing resources are listed in `export-report.json` instead of being rewritten to nonexistent files.
|
|
34
|
+
|
|
35
|
+
The capture respects explicit platform choices and final navigation URLs. Subpages receive the same hydration, scrolling and resource preparation as the entry page. Webflow keeps the opening HTML element and runtime attributes that earlier stripping rules removed. Dynamically requested captured stylesheets stay local.
|
|
36
|
+
|
|
37
|
+
The bundled browser is upgraded from Chrome 127 to Chrome 148 through Puppeteer 24.43.1. A current public Notion page rejected the old browser and loaded successfully with the updated one. Bubble and Notion snapshots also retain measured viewport-dependent inline styles, conditionally removed controls and JavaScript-selected image renditions.
|
|
38
|
+
|
|
39
|
+
Captured iframe HTML now retains local CSS, scripts and nested resources using each document's own URL base. Runtime image/script assignments and explicit worker resource declarations are localized when the exact resource was saved.
|
|
40
|
+
|
|
41
|
+
Framer CMS files remain binary even when their server labels them as JavaScript. Raw bytes are preserved, and exact captured public CMS GET requests load their local files, including captured range queries.
|
|
42
|
+
|
|
43
|
+
The UI rejects unsupported URL schemes, returns to the gallery after a rejected export request, and copies a preview command that points to the actual export directory. Failed captures preserve existing files and write diagnostics.
|
|
44
|
+
|
|
45
|
+
The new browser suite compares source and exported pages at desktop and mobile sizes, shuts down the source before replay, and tests navigation, form validation, CSSOM, stylesheet loaders and the full UI flow. Live checks still leave Wix mobile image variants, some Podia widgets and Framer animation states incompletely validated.
|
|
46
|
+
|
|
47
|
+
Bubble, Notion and Podia retain the beta label. Server-side accounts, payments, search and platform workflows are not recreated by a static export. Publication runs type checking, unit tests, browser tests and the production build by default; the explicit release bypass uploads the existing build directly. The default publication tag is `latest`.
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<h1 align="center">F-EXPORT</h1>
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
|
-
<img src="https://img.shields.io/badge/version-5.0.
|
|
4
|
+
<img src="https://img.shields.io/badge/version-5.0.2-blue" alt="Version" />
|
|
5
5
|
<img src="https://img.shields.io/badge/license-MIT-green" alt="License" />
|
|
6
6
|
<img src="https://img.shields.io/badge/node-%3E%3D20-339933" alt="Node" />
|
|
7
7
|
</p>
|
|
@@ -22,6 +22,8 @@ It knows 25 platforms and detects the right one from the URL, and when the URL i
|
|
|
22
22
|
npm install -g framer-export
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
+
Version 5.0.2 uses the stable `latest` channel. You can also install the validated local package with `npm install -g ./framer-export-5.0.2.tgz`. Preview releases remain available through `framer-export@beta`.
|
|
26
|
+
|
|
25
27
|
Or from source:
|
|
26
28
|
|
|
27
29
|
```bash
|
|
@@ -30,7 +32,7 @@ cd FramerExport
|
|
|
30
32
|
npm install
|
|
31
33
|
```
|
|
32
34
|
|
|
33
|
-
Node 20 or newer.
|
|
35
|
+
Node 20 or newer. Installation downloads Chrome for Testing through Puppeteer, which takes a moment. Version 5 updates the bundled browser to Chrome 148; the old Chrome 127 was rejected by current Notion pages.
|
|
34
36
|
|
|
35
37
|
## Three ways to run it
|
|
36
38
|
|
|
@@ -40,7 +42,7 @@ Node 20 or newer. The first run downloads a Chromium build for Puppeteer, which
|
|
|
40
42
|
framer-export ui
|
|
41
43
|
```
|
|
42
44
|
|
|
43
|
-
This starts a local server on port 4400 and opens your browser.
|
|
45
|
+
This starts a local server on port 4400 and opens your browser. The four steps are Select provider, Site details, Options and Review. Browse the provider icons in cards or a list, search and change pages, then paste the URL and choose export options. Completed steps remain clickable and retain your input. Settings and Help open in dialogs, with hover hints on controls. The export screen shows progress and a file summary; View logs opens a Classic or Nerd view with npm’s dot spinner, peach accents and a progress bar. Nerd includes the full journal, automatic following and copying; Filters opens a dialog for search and log levels. Apply filters confirms changes, while Esc cancels them.
|
|
44
46
|
|
|
45
47
|
The server only listens on 127.0.0.1 and rejects cross-origin requests, so nothing on the network or in another browser tab can trigger exports on your machine. Use `--port <n>` to change the port and `--no-open` if you do not want the browser to open by itself.
|
|
46
48
|
|
|
@@ -50,12 +52,62 @@ The server only listens on 127.0.0.1 and rejects cross-origin requests, so nothi
|
|
|
50
52
|
framer-export
|
|
51
53
|
```
|
|
52
54
|
|
|
53
|
-
Running it with no arguments opens the
|
|
55
|
+
Running it with no arguments opens the same four-step workflow in the terminal. Provider names, descriptions, logos and colors are shared with the web interface. Cards use pagination; the list adds a draggable scrollbar. Completed steps show a checkmark; Back and the step links let you change earlier details without retyping later ones. Settings, Help and Open UI use dialogs that preserve the underlying step, with hover states and contextual hints.
|
|
56
|
+
|
|
57
|
+
The first launch includes a short introduction. Preferences and an unfinished export draft are stored in `~/.fexport`; relaunching restores your place. Use `--fresh` for a new draft. All 25 provider icons are bundled for offline use; their original files and provenance are in [assets/provider-icons](assets/provider-icons/SOURCES.md).
|
|
58
|
+
|
|
59
|
+
The lowercase `framerexport` wordmark fits a standard 80×24 terminal and switches to compact text in smaller windows. Both interfaces use graphite surfaces, a peach accent and a restrained PixelBlast background. The terminal adapts the background to character cells; native image modes keep that background still to avoid repeatedly repainting images.
|
|
60
|
+
|
|
61
|
+
Provider logos use native images when the terminal supports Kitty graphics, iTerm inline images or detected Sixel graphics with known cell dimensions. Unsupported terminals, multiplexers and disabled image mode use colored monograms with provider names. Set `FEXPORT_TERMINAL_IMAGES=0` to force this fallback. Font metrics, graphics protocols and available colors belong to the terminal, so its physical pixels cannot be guaranteed identical to a browser. Layout and image placement stay within the viewport, including compact windows, and adjust on resize.
|
|
62
|
+
|
|
63
|
+
| Input | Action |
|
|
64
|
+
| ---------------------------- | ------------------------ |
|
|
65
|
+
| Tab / Shift+Tab | Move between controls |
|
|
66
|
+
| Arrow keys / Enter | Browse and select |
|
|
67
|
+
| Esc / Alt+Left | Go back |
|
|
68
|
+
| Mouse wheel / scrollbar drag | Scroll content |
|
|
69
|
+
| Page Up / Page Down | Change provider pages |
|
|
70
|
+
| Ctrl+A / Ctrl+U | Select or clear a field |
|
|
71
|
+
| `,` / `?` | Preferences / shortcuts |
|
|
72
|
+
| Ctrl+C | Save the draft and leave |
|
|
54
73
|
|
|
55
|
-
|
|
74
|
+
Wizard exports open in **Classic** mode: a centered phase title with npm's dot spinner and a subtle shine, a peach progress bar and the two latest events. Graphite surfaces and peach accents match the export assistant. Press `n` or Tab, or click **Nerd**, to see the complete journal with colored severity levels, timestamps, line numbers, warnings, errors and a scrollbar. Clicking the issue summary opens the relevant logs. Switching modes preserves your search and reading position.
|
|
75
|
+
|
|
76
|
+
Use `/` to open the search dialog, `f` for the filter dialog and `?` for help. Select a filter with the arrow keys or `1`–`3`; Enter applies and Esc cancels. Tab moves between dialog controls. Applying a search or filter opens Nerd automatically. Use `p` to pause following, `c` to copy the full log, and the arrow keys to scroll vertically or pan across long lines in Nerd mode. Home goes to the first entry and End resumes following new entries. The progress percentage counts processed assets, including failed downloads; discovery stays indeterminate until the asset total is known, and the export is only marked complete once it finishes. Search and filters leave the saved log unchanged; wizard exports retain the full session even beyond 5,000 entries.
|
|
77
|
+
|
|
78
|
+
In the detailed logs of both interfaces, scrolling up pauses automatic following so you can read earlier entries. Latest logs returns to the newest entry and resumes following. Severity colors distinguish information, successes, warnings and errors; active progress has a subtle shine that respects reduced motion. The terminal animates only the title and progress rows, stops animation after completion or failure, and supports reduced color depths and small windows.
|
|
79
|
+
|
|
80
|
+
Enter closes the viewer after the export completes or fails. Esc or Ctrl+C during an export returns to console output while the operation continues; a second Ctrl+C in the console stops the process. A failed export remains marked as failed and returns its original error after the viewer closes. Direct commands and legacy prompts retain the compact console output and optional progress sidebar.
|
|
56
81
|
|
|
57
82
|
If arrow keys do not work in your terminal, `framer-export --setup --legacy-mode` falls back to plain text prompts.
|
|
58
83
|
|
|
84
|
+
### Preferences
|
|
85
|
+
|
|
86
|
+
Run `fexport settings` to edit preferences, or `fexport config` to print their file location and current values. Both interfaces use the same `~/.fexport/settings.json`:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"schemaVersion": 1,
|
|
91
|
+
"defaultProvider": "auto",
|
|
92
|
+
"launchUi": false,
|
|
93
|
+
"checkUpdates": true,
|
|
94
|
+
"autoInstallUpdates": false,
|
|
95
|
+
"betaUpdates": false,
|
|
96
|
+
"viewMode": "cards",
|
|
97
|
+
"reduceMotion": false,
|
|
98
|
+
"onboardingCompleted": false,
|
|
99
|
+
"prettyPrint": true,
|
|
100
|
+
"includeSubpages": false,
|
|
101
|
+
"concurrency": 12
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
`launchUi` starts a separate local web process alongside the terminal and closes it when the terminal exits. Updates are checked at most once a day. Automatic installation is opt-in and preserves a supported npm installation's local/global scope. Source checkouts, npx and other package managers receive instructions instead. Beta updates are opt-in; a stable release takes precedence over an older prerelease.
|
|
106
|
+
|
|
107
|
+
Motion is enabled by default. Enable `reduceMotion` for a still terminal background and reduced web animations; the web interface also respects the operating system's reduced-motion preference. `FRAMER_EXPORT_NO_BG=1` disables the terminal background. Reset program asks for confirmation before removing preferences, the saved draft and the update cache. It restores the welcome screen and keeps exported folders, unrelated files and configuration backups.
|
|
108
|
+
|
|
109
|
+
Settings writes are atomic. An invalid settings file uses defaults and is preserved until an explicit save. `FEXPORT_HOME` overrides the directory for isolated environments. `fexport doctor` reports the terminal capabilities, bundled browser installation and update channel without downloading anything. `--no-update` skips the check for one launch.
|
|
110
|
+
|
|
59
111
|
### The direct command
|
|
60
112
|
|
|
61
113
|
```bash
|
|
@@ -72,13 +124,19 @@ Auto-detection covers the hosted domains (`.framer.app`, `.webflow.io`, `.wixsit
|
|
|
72
124
|
```
|
|
73
125
|
framer-export <url> [output-dir] export a site
|
|
74
126
|
framer-export ui [--port <n>] launch the web interface
|
|
127
|
+
fexport serve [directory] [-p <n>] preview a local export
|
|
75
128
|
framer-export --setup launch the terminal wizard
|
|
129
|
+
framer-export settings edit persistent preferences
|
|
130
|
+
framer-export config show preferences as JSON
|
|
131
|
+
framer-export doctor inspect terminal and browser availability
|
|
76
132
|
|
|
77
133
|
--platform <id> force a platform (framer, webflow, wix, shopify, notion, ...)
|
|
78
134
|
--subpages crawl internal links and export every page
|
|
79
135
|
--dpr <number> capture device pixel ratio, default 1
|
|
80
136
|
--legacy-mode with --setup, use plain text prompts
|
|
81
137
|
--no-open with ui, do not open the browser
|
|
138
|
+
--fresh start setup without restoring the saved draft
|
|
139
|
+
--no-update skip the update check for this launch
|
|
82
140
|
--about version and package information
|
|
83
141
|
--version, -v version number
|
|
84
142
|
--help, -h full help with the platform list
|
|
@@ -98,7 +156,9 @@ E-commerce: Gumroad, Shopify.
|
|
|
98
156
|
|
|
99
157
|
AI builders: Gamma.
|
|
100
158
|
|
|
101
|
-
|
|
159
|
+
Platform detection covers all 25 handlers. Rendering and offline behavior depend on the source site; detection alone does not establish visual fidelity. Bubble, Notion and Podia are marked beta because they use static snapshots to preserve rendered content. Their original application scripts are removed, so hosted account flows, dashboards and other application interactions need a separate implementation. Notion may also fail to load because of upstream availability or access restrictions.
|
|
160
|
+
|
|
161
|
+
The beta 4 regression suite compares complete local exports with their source at desktop and mobile sizes, with the source server stopped. It checks fonts, responsive images, dynamic styles, navigation and local form behavior. No export recreates a platform's account database, payment backend or form processing service.
|
|
102
162
|
|
|
103
163
|
Each platform is a single self-contained handler in `src/platforms/`. It declares how to detect the platform, which domains and selectors to strip, how long to wait for hydration, how to route assets into folders, and optional hooks that run before capture, after capture and after the build. Adding a platform never touches the others.
|
|
104
164
|
|
|
@@ -110,6 +170,7 @@ framer-mysite-fresh-build-a1b2/
|
|
|
110
170
|
serve.js a small static server with SPA fallback
|
|
111
171
|
package.json so "npm run serve" works
|
|
112
172
|
export.log the complete log of the run
|
|
173
|
+
export-report.json missing assets, capture mode and functional limitations
|
|
113
174
|
styles/ CSS files
|
|
114
175
|
scripts/vendor/ third-party bundles
|
|
115
176
|
scripts/modules/ page modules and lazy chunks
|
|
@@ -125,22 +186,42 @@ To preview it:
|
|
|
125
186
|
|
|
126
187
|
```bash
|
|
127
188
|
cd framer-mysite-fresh-build-a1b2
|
|
128
|
-
node serve.js
|
|
189
|
+
node serve.js -p 3000
|
|
190
|
+
# or, from any folder:
|
|
191
|
+
fexport serve ./my-export -p 8080 --open
|
|
129
192
|
```
|
|
130
193
|
|
|
131
|
-
The
|
|
194
|
+
The preview uses the same graphite and peach terminal interface as the exporter. Classic shows the address and recent activity; `n` or Tab opens Nerd for request status codes, paths and timings. Use `o` to open the browser, `?` for help, the arrows to read older requests, End to follow new requests, and `q` or Ctrl+C to stop.
|
|
132
195
|
|
|
133
|
-
|
|
196
|
+
Options work with both `node serve.js` and `fexport serve`. With npm, forward them as `npm run serve -- -p 8080`:
|
|
197
|
+
|
|
198
|
+
| Option | Behavior |
|
|
199
|
+
|---|---|
|
|
200
|
+
| `-p, --port <n>` | Port; defaults to `PORT` or 3000. Use 0 for an available port. |
|
|
201
|
+
| `-H, --host <address>` | Bind address; defaults to `127.0.0.1`. Use `0.0.0.0` to listen on the local network. |
|
|
202
|
+
| `-d, --dir <path>` | Choose the served directory. A positional directory also works. |
|
|
203
|
+
| `-o, --open` | Open the preview in your browser. |
|
|
204
|
+
| `--no-spa` | Return 404 for unknown routes while retaining captured subpages. |
|
|
205
|
+
| `--cache <seconds>` | Browser cache lifetime; defaults to 0 for fresh previews. |
|
|
206
|
+
| `--logs` | Open Nerd in a terminal, or print request logs to ordinary output. |
|
|
207
|
+
| `--no-ui` | Use ordinary console output. |
|
|
208
|
+
| `-q, --quiet` | Print only the URL. |
|
|
209
|
+
| `--no-color` | Disable colors; `NO_COLOR` is also respected. |
|
|
210
|
+
| `-h, --help` | Show all preview options. |
|
|
211
|
+
|
|
212
|
+
The standalone script serves its exported folder regardless of the working directory. `fexport serve` defaults to the current directory and also works for existing exports. The site has to be served over HTTP because module scripts do not load from `file://`. The bundled server handles MIME types, CORS headers and the sub-page fallback, so a route like `/about` resolves to `subpages/about.html` automatically.
|
|
213
|
+
|
|
214
|
+
Every run writes `export.log` with untruncated messages from its retained log history. The terminal wizard's log viewer and the web interface offer clipboard copying, which is handy when reporting a problem or passing context to another tool.
|
|
134
215
|
|
|
135
216
|
## The AI conversion assistant
|
|
136
217
|
|
|
137
|
-
After a terminal export you can generate a conversion brief for an AI coding agent. Pick a target stack (React with Vite, Next.js, Vue, SvelteKit or Astro), pick the tool you use (Claude Code, Codex, OpenCode or another agent), pick a goal (clean rebuild, pixel-perfect migration, component system, or performance and SEO), and it writes a detailed prompt file into `ai/` inside the export. The prompt references the real files and counts from your export, so the agent starts from facts instead of guesses.
|
|
218
|
+
After a direct-command or legacy terminal export you can generate a conversion brief for an AI coding agent. Pick a target stack (React with Vite, Next.js, Vue, SvelteKit or Astro), pick the tool you use (Claude Code, Codex, OpenCode or another agent), pick a goal (clean rebuild, pixel-perfect migration, component system, or performance and SEO), and it writes a detailed prompt file into `ai/` inside the export. The prompt references the real files and counts from your export, so the agent starts from facts instead of guesses. The modern wizard finishes in its log viewer.
|
|
138
219
|
|
|
139
220
|
## How it works
|
|
140
221
|
|
|
141
222
|
The pipeline has six phases. First it fetches the server-rendered HTML over plain HTTP, which is what search engines see and what gives the cleanest markup. Then it launches Puppeteer, blocks the analytics domains the platform handler lists, navigates, waits for the hydration selector, scrolls through the page to trigger lazy loading, and records every network response into an asset map. Sub-page crawling reuses the same browser session when enabled.
|
|
142
223
|
|
|
143
|
-
Once the browser closes, the downloader writes
|
|
224
|
+
The capture also serializes styles added through CSSOM rules and constructed stylesheets. Once the browser closes, the downloader writes unique assets with a configurable concurrency and follows CSS imports and resource URLs, including fonts and images only used at other breakpoints. Redirected stylesheets retain their correct URL base; assets with identical filenames or different query parameters remain distinct. Lazy JavaScript imports are resolved where possible. The build step localizes captured resources, preserves relative navigation, strips badges and trackers, and writes `index.html`, `serve.js`, `export.log` and `export-report.json`.
|
|
144
225
|
|
|
145
226
|
## When something goes wrong
|
|
146
227
|
|
|
@@ -153,19 +234,51 @@ If detection picks the wrong platform on a custom domain, pass `--platform` expl
|
|
|
153
234
|
## Development
|
|
154
235
|
|
|
155
236
|
```bash
|
|
156
|
-
npm run dev
|
|
157
|
-
npm test
|
|
158
|
-
npm run
|
|
159
|
-
npm run
|
|
160
|
-
npm run
|
|
237
|
+
npm run dev
|
|
238
|
+
npm test
|
|
239
|
+
npm run test:browser
|
|
240
|
+
npm run test:platform -- webflow https://smallshop.webflow.io/
|
|
241
|
+
npm run typecheck
|
|
242
|
+
npm run build
|
|
243
|
+
npm run format
|
|
161
244
|
```
|
|
162
245
|
|
|
163
246
|
The test suite covers platform detection for all 25 handlers against recorded research profiles, asset mapping, URL rewriting, the logger, the generated serve.js (spawned for real and probed over HTTP), the progress state and every route of the UI server, including its origin and host checks.
|
|
164
247
|
|
|
248
|
+
Terminal tests run the actual CLI in a pseudoterminal and interpret its output with xterm. They exercise onboarding, mouse/keyboard input, draft restoration, live resizing, companion server cleanup, log search/filtering and completed or detached export lifecycles. Unit tests also check Unicode cell widths, grapheme editing, terminal image protocol generation and rendering bounds down to a 1×1 cell buffer. This is a clipping check, not a claim that a full interface is readable in one cell; protocol tests do not establish identical native image rendering in every terminal emulator.
|
|
249
|
+
|
|
250
|
+
The interface work draws on [Microsoft's terminal sequences](https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences), [xterm's supported sequences](https://xtermjs.org/docs/api/vtfeatures/), [Ink](https://github.com/vadimdemedes/ink), [Bubble Tea](https://github.com/charmbracelet/bubbletea) and Apple's guidance on [onboarding](https://developer.apple.com/design/human-interface-guidelines/onboarding) and [scroll views](https://developer.apple.com/design/human-interface-guidelines/scroll-views). The existing ANSI input layer remains in use with a clipped cell renderer; xterm and node-pty are development tools rather than runtime UI dependencies.
|
|
251
|
+
|
|
165
252
|
To add a platform, create one file in `src/platforms/<category>/`, implement the `PlatformHandler` interface, register it in `src/platforms/registry.ts`, and add a research profile in `tests/research/` so the detection tests cover it. Look at `src/platforms/builder/carrd.ts` for a small example and `src/platforms/framer.ts` for a complete one.
|
|
166
253
|
|
|
167
254
|
Commits follow the conventional format: `feat(scope):`, `fix(scope):`, `test:`, `docs:`, `chore:`.
|
|
168
255
|
|
|
256
|
+
### Publishing
|
|
257
|
+
|
|
258
|
+
Run release commands from the source checkout with development dependencies installed. Full publication runs TypeScript checks, unit tests, browser tests and the build before uploading to the stable `latest` channel:
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
npm run release
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Publish the already built package directly, without tests or a build:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
npm run release -- --bypass-tests
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
`--bypass-tests` belongs to the project's release script; `--bypass-checks` is an alias. This mode uploads the existing `dist` bundle as-is. It is equivalent to `npm publish --ignore-scripts`, using [npm's option to skip lifecycle scripts](https://docs.npmjs.com/cli/v11/using-npm/config/#ignore-scripts). To preview that direct upload:
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
npm run release -- --bypass-tests --dry-run
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Arguments after `--`, such as `--dry-run` or `--otp=123456`, are forwarded to npm publish. The default release command checks and builds once; its final upload skips lifecycle scripts. Ordinary `npm publish` still runs the full check suite through `prepublishOnly`, then builds through `prepare`, following [npm's lifecycle order](https://docs.npmjs.com/cli/v11/using-npm/scripts/#npm-publish).
|
|
277
|
+
|
|
278
|
+
Use `npm run check` to validate without publishing, or `npm pack` to build `framer-export-5.0.2.tgz`. Publish that already built archive with `npm publish ./framer-export-5.0.2.tgz --tag latest`.
|
|
279
|
+
|
|
280
|
+
Use `npm run test:updates` for a focused check of update detection, installer arguments and the release sequence. These tests use temporary fixtures and a simulated npm CLI; they do not install or publish packages. They cover directory symlinks (including macOS temporary paths), special characters, dependency scopes, cache recovery and failed or interrupted installers. No temporary-directory override is needed.
|
|
281
|
+
|
|
169
282
|
## License
|
|
170
283
|
|
|
171
284
|
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Provider icon sources
|
|
2
|
+
|
|
3
|
+
The 25 provider icons are bundled for offline identification in the terminal and web interface. Brand names and marks belong to their respective owners. Inclusion does not imply endorsement. Simple Icons artwork uses its published collection license; that does not grant rights to the brands. Official favicons have no separate redistribution license stated by their source pages. The auto-detect icon is original project artwork under MIT.
|
|
4
|
+
|
|
5
|
+
Sources were retrieved on 2026-09-13. Simple Icons is pinned to revision `4ba19240849175ab4b855a732ab98c0f87cfb714`. Original bytes and SHA-256 hashes are checked in alongside this file. For dark backgrounds, black Simple Icons marks are rendered in #EEEEEE; all shapes are preserved. Other Simple Icons marks use their catalogue brand color. Official favicon colors are preserved. Raster outputs are 256 × 256 PNG for the web and native terminal protocols, with compressed RGBA for SIXEL. Vector originals retain their geometry at high display densities; raster originals retain the detail available in their source. Terminal images scale to the available cells and measured pixel dimensions.
|
|
6
|
+
|
|
7
|
+
| Provider | Sources | License information | Brand guidelines |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| Framer | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/framer.svg) · [Brand source](https://framer.com) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | — |
|
|
10
|
+
| Webflow | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/webflow.svg) · [Brand source](https://brand-at.webflow.io/resources#logos) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | [Guidelines](https://brand-at.webflow.io) |
|
|
11
|
+
| Wix | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/wix.svg) · [Brand source](https://www.wix.com/about/design-assets) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | [Guidelines](https://www.wix.com/about/design-assets) |
|
|
12
|
+
| Bubble | [Original icon](https://meta-q.cdn.bubble.io/cdn-cgi/image/w=256,h=,f=png,dpr=1,fit=contain/f1530294839424x143528842134401200/Icon-no-clearspace.png) · [Brand source](https://bubble.io) | Brand asset; no separate redistribution license stated | — |
|
|
13
|
+
| Carrd | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/carrd.svg) · [Brand source](https://carrd.co/docs/general/brand-assets) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | — |
|
|
14
|
+
| Duda | [Original icon](https://irp.cdn-website.com/a8ff2f1c/files/uploaded/Duda_Logos.zip) · [Brand source](https://www.duda.co/press) · Archive entry: Duda Logos/Orange Duda Logos/duda_logo_orange.png | Brand asset; no separate redistribution license stated | [Guidelines](https://www.duda.co/press) |
|
|
15
|
+
| Squarespace | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/squarespace.svg) · [Brand source](https://www.squarespace.com/logo-guidelines) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | [Guidelines](https://www.squarespace.com/brand-guidelines) |
|
|
16
|
+
| Strikingly | [Original icon](https://www.dropbox.com/scl/fo/96t794329fgl9ee9qpbwe/AL9GAOKUOnH8qFg0Lz_XM3M?rlkey=usr1t7ypunnlw76x4cgqz7txh&dl=1) · [Brand source](https://support.strikingly.com/hc/en-us/articles/4414073874329-Strikingly-Branding-Guidelines) · Archive entry: s-badge-1200x1200.png | Brand asset; no separate redistribution license stated | [Guidelines](https://support.strikingly.com/hc/en-us/articles/4414073874329-Strikingly-Branding-Guidelines) |
|
|
17
|
+
| Tilda | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/tildapublishing.svg) · [Brand source](https://tilda.cc/mediakit) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | — |
|
|
18
|
+
| Weebly | [Original icon](https://cdn11.editmysite.com/images/logos/Blue-Logomark2.png) · [Brand source](https://www.weebly.com) | Brand asset; no separate redistribution license stated | — |
|
|
19
|
+
| ClickFunnels | [Original icon](https://statics.myclickfunnels.com/workspace/Yjxavr/image/9334147/file/c994abfb442009ab7811e359f1b50170.svg) · [Brand source](https://www.clickfunnels.com) · Mark viewport: 0, 0, 26, 26 | Brand asset; no separate redistribution license stated | — |
|
|
20
|
+
| Elementor | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/elementor.svg) · [Brand source](https://elementor.com/logos/) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | [Guidelines](https://elementor.com/logos/) |
|
|
21
|
+
| Instapage | [Original icon](https://cdn.mrkhub.com/instapage-landings-frontend/244/images/favicons/android-icon-192x192.png?v=2) · [Brand source](https://instapage.com) | Brand asset; no separate redistribution license stated | — |
|
|
22
|
+
| Systeme.io | [Original icon](https://d1yei2z3i6k35z.cloudfront.net/161/68f241caada76_Logo5.svg) · [Brand source](https://systeme.io/logo) | Brand asset; no separate redistribution license stated | [Guidelines](https://systeme.io/logo) |
|
|
23
|
+
| Unbounce | [Original icon](https://unbounce.com/photos/cropped-unbounce-favicon-2-192x192.png) · [Brand source](https://unbounce.com) | Brand asset; no separate redistribution license stated | — |
|
|
24
|
+
| Ghost | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/ghost.svg) · [Brand source](https://github.com/TryGhost/Admin/blob/e3e1fa3353767c3729b1658ad42cc35f883470c5/public/assets/icons/icon.svg) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | [Guidelines](https://ghost.org/docs/logos/) |
|
|
25
|
+
| Notion | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/notion.svg) · [Brand source](https://www.notion.so) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | — |
|
|
26
|
+
| WordPress | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/wordpress.svg) · [Brand source](https://wordpress.org/about/logos) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | [Guidelines](https://wordpressfoundation.org/trademark-policy) |
|
|
27
|
+
| Kajabi | [Original icon](https://cdn.prod.website-files.com/693317e747432cd054b3bdc6/693318d5adf6755726c17fae_Dark.png) · [Brand source](https://www.kajabi.com) | Brand asset; no separate redistribution license stated | — |
|
|
28
|
+
| Podia | [Original icon](https://cdn.sanity.io/images/f6u8j0m2/production/c32fdb13db51ed698450ebb173747d7f81eecf4a-67x36.svg) · [Brand source](https://www.podia.com) | Brand asset; no separate redistribution license stated | — |
|
|
29
|
+
| Teachable | [Original icon](https://cdn.prod.website-files.com/687904fb2b26c434698c47e9/68f25a572e5e73f1b13d70cf_Webclip.png) · [Brand source](https://www.teachable.com) | Brand asset; no separate redistribution license stated | — |
|
|
30
|
+
| Thinkific | [Original icon](https://www.thinkific.com/wp-content/themes/thinkific/assets/images/logo-dark.svg) · [Brand source](https://www.thinkific.com) · Mark viewport: 0, 0, 210, 200 | Brand asset; no separate redistribution license stated | — |
|
|
31
|
+
| Gumroad | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/gumroad.svg) · [Brand source](https://gumroad.com) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | — |
|
|
32
|
+
| Shopify | [Original icon](https://raw.githubusercontent.com/simple-icons/simple-icons/4ba19240849175ab4b855a732ab98c0f87cfb714/icons/shopify.svg) · [Brand source](https://www.shopify.com/brand-assets) | [CC0-1.0 (Simple Icons collection; brand rights retained)](https://github.com/simple-icons/simple-icons/blob/4ba19240849175ab4b855a732ab98c0f87cfb714/LICENSE.md) | [Guidelines](https://www.shopify.com/brand-assets) |
|
|
33
|
+
| Gamma | [Original icon](https://static.gamma.app/favicons/favicon_dark.svg) · [Brand source](https://gamma.app) | Brand asset; no separate redistribution license stated | — |
|
|
34
|
+
|
|
35
|
+
## Regeneration
|
|
36
|
+
|
|
37
|
+
`node --import tsx scripts/update-provider-icons.ts` rebuilds the TypeScript catalogue from local originals using the installed Puppeteer Chromium. The renderer blocks network requests. `--download` first fetches the recorded icon URLs and rejects changed hashes; update a URL/hash only after reviewing the new source. Chromium rasterization can vary with browser versions, so check the generated diff after upgrading Puppeteer. The normal application and package build never download icons.
|
|
38
|
+
|
|
39
|
+
## Terminal capabilities
|
|
40
|
+
|
|
41
|
+
Native terminal images use the real provider artwork: [Kitty graphics protocol](https://sw.kovidgoyal.net/kitty/graphics-protocol/) and [iTerm2 inline images](https://iterm2.com/documentation-images.html) require supporting terminal emulators. SIXEL support is enabled only after a device-attributes reply advertises feature 4 and the terminal reports its cell size. [Windows Terminal introduced SIXEL in 1.22](https://devblogs.microsoft.com/commandline/windows-terminal-preview-1-22-release/). Unsupported terminals and multiplexers use crisp ASCII monograms with the provider names. Set FEXPORT_TERMINAL_IMAGES=0 to disable native images. Graphics are cleared on modal changes, resize and exit.
|
package/bin/fexport.js
CHANGED
|
File without changes
|
package/bin/framer-export.js
CHANGED
|
File without changes
|
package/bin/framerexport.js
CHANGED
|
File without changes
|