diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
new file mode 100644
index 0000000..e3100fe
--- /dev/null
+++ b/.github/workflows/pages.yml
@@ -0,0 +1,26 @@
+name: pages
+on:
+ push:
+ branches: [main]
+ paths: ['site/**', '.github/workflows/pages.yml']
+ workflow_dispatch:
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+concurrency:
+ group: pages
+ cancel-in-progress: true
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/configure-pages@v5
+ - uses: actions/upload-pages-artifact@v3
+ with: { path: site }
+ - id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/README.md b/README.md
index e5b5f19..cec5c68 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
# ScriptWidget 🎨
+Website:
+
[](https://github.com/everettjf/ScriptWidget/stargazers)
diff --git a/site/.nojekyll b/site/.nojekyll
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/site/.nojekyll
@@ -0,0 +1 @@
+
diff --git a/site/api/index.html b/site/api/index.html
new file mode 100644
index 0000000..2138332
--- /dev/null
+++ b/site/api/index.html
@@ -0,0 +1 @@
+
ScriptWidget Runtime API Continue to the ScriptWidget Runtime API .
diff --git a/site/components/index.html b/site/components/index.html
new file mode 100644
index 0000000..af00080
--- /dev/null
+++ b/site/components/index.html
@@ -0,0 +1 @@
+
ScriptWidget JSX components Continue to the ScriptWidget JSX component source .
diff --git a/site/index.html b/site/index.html
new file mode 100644
index 0000000..7bfe9ee
--- /dev/null
+++ b/site/index.html
@@ -0,0 +1,9 @@
+
+
ScriptWidget — Native widgets with JavaScript + JSX
+
+
Open source · iOS · iPadOS · macOS
Widgets, written your way. Write JavaScript and JSX, preview in ScriptWidget Studio, and render native WidgetKit experiences across Apple platforms—without authoring every widget in Swift.
+JavaScriptCore runtime Native SwiftUI rendering Live preview on Mac Community gallery
+Why ScriptWidget
From an idea to a native widget. Write in JavaScript + JSX Compose familiar declarative layouts and use versioned APIs for data, files, networking, storage, device state, and more.
Build in Studio Edit with diagnostics, inspect runtime output, and preview multiple widget families without repeating an Xcode build loop.
Share real packages Use versioned manifests, explicit permissions, host allowlists, and the community Gallery to distribute reusable widgets.
+A small example
JSX in. Native WidgetKit out. $render (
<vstack frame="max" padding="16" background="#171923" >
<text font="caption" color="#a9b0c0" >Today</text>
<text font="largeTitle" color="#ffffff" >Build something useful.</text>
</vstack>
);
+Documentation
Explore the platform.
+
diff --git a/site/privacy/index.html b/site/privacy/index.html
new file mode 100644
index 0000000..b775c9e
--- /dev/null
+++ b/site/privacy/index.html
@@ -0,0 +1 @@
+
Privacy — ScriptWidget Privacy
Privacy policy. ScriptWidget stores your scripts and app data on your devices and, when you enable it, in your iCloud account. ScriptWidget does not operate an account service and does not sell personal information.
Scripts and packages you choose to run may request access to device capabilities or network hosts. ScriptWidget presents and enforces package permissions, but third-party scripts and services have their own behavior and privacy practices. Review a package and its requested permissions before installing it.
If you configure an AI provider, requests are sent to the provider and endpoint you select under that provider’s terms. Your API credentials are stored locally using Apple platform security facilities.
Apple may process App Store downloads, purchases, diagnostics, and iCloud data under Apple’s policies. For privacy questions, contact xnuapp@gmail.com .
Last updated: August 22, 2026.
diff --git a/site/styles.css b/site/styles.css
new file mode 100644
index 0000000..39b0c01
--- /dev/null
+++ b/site/styles.css
@@ -0,0 +1 @@
+:root{color-scheme:light;--ink:#17202a;--muted:#68717d;--line:#dde2e7;--paper:#fbfaf7;--card:#fff;--accent:#6b4eff;--code:#202531}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--paper);color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;line-height:1.6}a{color:inherit}.wrap{width:min(1120px,calc(100% - 40px));margin:auto}.nav{height:72px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line)}.brand{font-weight:800;text-decoration:none;letter-spacing:-.04em}.navlinks{display:flex;gap:22px;align-items:center}.navlinks a{font-size:14px;text-decoration:none;color:var(--muted)}.navlinks a:hover{color:var(--ink)}.hero{display:grid;grid-template-columns:1.1fr .9fr;gap:60px;align-items:center;padding:96px 0 72px}.eyebrow,.section-label{font:700 12px/1.2 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase;letter-spacing:.12em;color:var(--accent)}h1{font-size:clamp(48px,7vw,84px);line-height:.98;letter-spacing:-.065em;margin:18px 0 24px;max-width:760px}.lede{font-size:20px;color:var(--muted);max-width:650px}.actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:32px}.button{display:inline-flex;align-items:center;justify-content:center;min-height:46px;padding:0 18px;border:1px solid var(--ink);border-radius:999px;text-decoration:none;font-size:14px;font-weight:700;transition:.2s}.button.primary{background:var(--ink);color:#fff}.button:hover{transform:translateY(-2px)}.visual{position:relative;padding:16px}.visual:before{content:"";position:absolute;inset:-10px 25% 20% -5%;border-radius:50%;background:#ded7ff;filter:blur(45px);opacity:.65}.visual img{position:relative;width:100%;border-radius:26px;box-shadow:0 24px 70px #483b8025}.strip{border-block:1px solid var(--line);padding:28px 0;color:var(--muted);font:600 13px ui-monospace,SFMono-Regular,Menlo,monospace}.strip .wrap{display:flex;justify-content:space-between;gap:22px;flex-wrap:wrap}.section{padding:88px 0;border-bottom:1px solid var(--line)}h2{font-size:clamp(34px,5vw,56px);line-height:1.05;letter-spacing:-.045em;margin:14px 0 40px}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.card{background:var(--card);border:1px solid var(--line);border-radius:18px;padding:28px}.card h3{margin:0 0 10px;font-size:18px}.card p{margin:0;color:var(--muted);font-size:15px}.code{background:var(--code);color:#eef1f6;border-radius:20px;padding:28px;overflow:auto;font:14px/1.8 ui-monospace,SFMono-Regular,Menlo,monospace}.code .pink{color:#ff8aae}.code .purple{color:#ad9cff}.docs{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.doc{display:block;background:#fff;border:1px solid var(--line);border-radius:16px;padding:22px;text-decoration:none;transition:.2s}.doc:hover{border-color:var(--accent);transform:translateY(-2px)}.doc strong{display:block;margin-bottom:6px}.doc span{color:var(--muted);font-size:14px}.footer{padding:42px 0}.footer .wrap{display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap;color:var(--muted);font-size:13px}.footer a{margin-left:18px}@media(max-width:820px){.hero{grid-template-columns:1fr;padding-top:64px}.visual{max-width:560px}.grid,.docs{grid-template-columns:1fr}.navlinks a.optional{display:none}}@media(max-width:520px){.wrap{width:min(100% - 28px,1120px)}.navlinks{gap:12px}.hero{gap:32px}.visual{padding:0}h1{font-size:48px}}
diff --git a/site/templates/index.html b/site/templates/index.html
new file mode 100644
index 0000000..e64ac53
--- /dev/null
+++ b/site/templates/index.html
@@ -0,0 +1 @@
+
ScriptWidget Gallery Continue to the ScriptWidget Gallery guide .