Materializr
開源參數式 3D CAD 給創客 — 受限草圖、實體建模、螺紋、SVG 與文字雕刻、STL/STEP 匯出。Android、iPad、Linux、Mac、Windows。Vibe 編碼。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Simple page builder
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
LivePage is a visual page builder. You compose a page from design components in an in-browser editor, connect components to data sources, and export the result as JSON, shortcode, or a standalone HTML file.
Status: early development (0.1.0). Formats and APIs can change without notice.檢視完整 README ↗LivePage is a visual page builder. You compose a page from design components in an in-browser editor, connect components to data sources, and export the result as JSON, shortcode, or a standalone HTML file.
Status: early development (
0.1.0). Formats and APIs can change without notice.
NEXT_PUBLIC_PROMPT_ASSIST_ENABLED=1. Once enabled, toggle it on in the Settings popover (toolbar) to show the chat bubble (bottom-right) without needing a URL parameter. Includes a command palette action ("Open AI Assistant"), first-visit tooltip, and in-app help; see Optional: page assistant.You need Node.js 18.18 or newer and npm.
npm install
npm run dev
Open http://localhost:3000 for the landing page, or go straight to the builder at http://localhost:3000/try.
The feature is off by default. Set NEXT_PUBLIC_PROMPT_ASSIST_ENABLED=1 and rebuild (the value is inlined at build time) to turn it on. Once enabled, the chat bubble (bottom-right of /try) can be shown in two ways:
?prompt-assist=1 (e.g., /try?prompt-assist=1).With the deployment flag off, the /api/prompt-assist routes answer 404. It uses TypeSafe's Jev and/or OpenAI. Copy .env.example to .env.local and set TYPESAFE_API_KEY and/or OPENAI_API_KEY; with neither, the chat lets you pick a template by hand and everything else works as before. Keys stay on the server, and the request text is sent to whichever provider you configure. How it works is described in .agents/docs/CONTEXT.md.
Discoverability features:
⌘K and search "Open AI Assistant" to open the chat.The LinkedIn Profile source uses LinkedIn's official OpenID Connect authorization
code flow. In your LinkedIn developer app, enable the Sign In with LinkedIn using
OpenID Connect product and authorize the openid, profile, and email scopes.
Register the exact value of LINKEDIN_REDIRECT_URI as an authorized redirect URL.
For local development, use http://localhost:3000/api/linkedin-profile/callback;
production must use the HTTPS callback URL for your deployment.
The integration uses LinkedIn's OIDC discovery document
and the userinfo endpoint.
Set LINKEDIN_CLIENT_ID, LINKEDIN_CLIENT_SECRET, LINKEDIN_REDIRECT_URI, and
LINKEDIN_SESSION_ENCRYPTION_KEY in .env.local using the names in
.env.example. Generate the encryption key with
openssl rand -base64 32. The client secret stays on the server. The profile session is stored in an
encrypted, HttpOnly, SameSite=Lax cookie; it is protected from client-side JS
read access and expires after eight hours, but it is not cryptographically bound to
one browser/device. It requires HTTPS in production and is removed on disconnect.
LinkedIn data is loaded only
through the same-origin profile endpoint and is not stored in source settings,
app nodes, or exports.
Available profile values are limited to claims returned by the configured app's LinkedIn OIDC scopes: subject, name, given/family names, picture, locale, and the optional email and email-verification claim. LinkedIn does not expose headline, about/summary, positions, education, or skills through this normal self-serve OIDC profile. Those template fields remain empty; access to broader profile permissions requires LinkedIn approval. LivePage does not scrape LinkedIn. Standalone HTML files cannot use the LinkedIn session cookie.
| Command | What it does |
|---|---|
npm run dev | Start the development server |
npm run build | Create a production build |
npm start | Serve the production build |
npm run lint | Run ESLint through next lint |
npm test | Run the whole Jest suite |
npm run test:smoke | Smoke suites (Jest and Playwright): the fast critical-path gate CI runs first |
npm run test:smoke:unit / npm run test:smoke:ui | Just the Jest or just the Playwright smoke suite |
npm run test:unit | Unit tests |
npm run test:component | Component and integration tests |
npm run test:ui | Full Playwright browser suite (same as test:html-browser) |
npm run check:test-categories | Fail if a Jest test lives outside a category folder |
npm run test:watch | Run Jest in watch mode |
npm run test:coverage | Run Jest with coverage |
npm run build:html-runtime | Rebuild the browser runtime used by HTML exports |
npm run test:html-browser | Run the standalone HTML artifact regression test in Chromium |
npm run check:branch | Check that the current branch name follows gitflow |
npm run lint:staged | Lint the staged JS/TS files (what the pre-commit hook runs) |
npm run setup:hooks | Enable the git hooks (runs automatically on npm install / npm ci) |
npm run check:hooks | Check that the git hooks are enabled and executable |
npm run verify | Lint + full Jest suite (--runInBand) + branch-name check + git-hooks check (convenient pre-PR gate) |
Test categories and the CI job order are described in .agents/docs/TESTING.md.
The dev, build, start, and test commands rebuild the HTML export runtime automatically, and npm install builds it once (the postinstall script). It is generated into client/features/serializers/html/generated/, which is git-ignored.
The standalone HTML browser tests run in headless Chromium against both the live
/try?template=<id>&mode=preview page and the exact exported HTML for every bundled
template at desktop and mobile viewport sizes. They fulfill pinned React imports
from locally installed React packages and use the preview's local font assets, so
the comparison does not depend on CDN availability. To install the browser locally,
run npx playwright install chromium once after npm install; then run
npm run test:html-browser.
The app is built with Next.js (App Router), React 19, TypeScript, Tailwind CSS, Radix UI, and Zod. Tests use Jest and Testing Library.
npm install and npm ci enable the hooks in scripts/git-hooks/ through the prepare script, so a fresh clone needs no manual step:
pre-commit lints the staged JS/TS files with ESLint. Warnings fail too.commit-msg checks the branch name (skipped on a detached HEAD).pre-push checks the branch name and runs the smoke tests (npm run test:smoke), not the long suites. The UI smoke tests need Chromium once: npx playwright install chromium.The dev, build, start, and test scripts also re-enable the hooks (setup:workspace), so an install that skipped prepare repairs itself on first use. npm run check:hooks reports why hooks would not run, and npm run setup:hooks repairs them. --no-verify skips local hooks; CI runs every check regardless.
Pushes must use a gitflow branch name, or a dependabot/<dependency> branch for automated dependency updates. The check applies to people, agents, and other automation. Topic segments are lowercase kebab-case.
| Branch type | Pattern | Example |
|---|---|---|
| main | main | main |
| develop | develop | develop |
| dependabot | dependabot/<dependency> | dependabot/dependencies/node/22 |
| feature | feature/<topic> | feature/login-flow |
| release | release/<version> | release/1.4.0 |
| hotfix | hotfix/<topic> | hotfix/crash-on-start |
| support | support/<version-line> | support/1.x |
| bugfix | bugfix/<topic> | bugfix/null-deref |
A rejected name lists these patterns. CI runs node scripts/check-branch-name.mjs on every push and pull request. The local git hooks refuse non-compliant branches at push time. The server-side GitHub ruleset is the check that cannot be skipped; see .agents/docs/BRANCH-NAMES.md.
Application code is organized by runtime: browser features and UI live in client/, backend features and integrations in server/, and runtime-neutral models and contracts in shared/. Each runtime groups domain code in its own features/ subfolder. The Next.js route tree stays in app/; page files import client features, while API route files are thin adapters to server features. UI primitives live in client/components/ui/. .agents/docs/CONTEXT.md has the module map and import-boundary rule.
An HTML export is a single file that opens directly in a modern browser, with no LivePage server needed. It bundles the same registered preview-component implementations and compiled Tailwind CSS generated from the builder's global stylesheet. Keep these limits in mind:
Download self-contained HTML, or the command palette action) is a single file that inlines the compiled CSS, embeds image, favicon, and Open Graph assets as base64 data URLs, and bundles React locally. It does not load esm.sh or Google Fonts. Assets that cannot be fetched at export time stay as URLs.Templates live in client/features/templates/definitions/. Each one is versioned (schema and version), keeps catalog metadata separate from its content.pages payload, and stores the page as the same AppNode tree the editor uses.
To add a template:
client/features/templates/definitions/ using only supported design-component tags.name, description, category, tags, thumbnail) outside the page payload.pageTemplateDefinitionSchema and register it in client/features/templates/registry.ts.dataMapping entries that point to the target component ids and fields.The CV/resume templates include LinkedIn-shaped mapping notes in their dataMapping blocks.
See CONTRIBUTING.md for how to open a pull request and the branch naming (gitflow) conventions enforced in this repo.
Report vulnerabilities privately as described in SECURITY.md. Participation in this project is governed by the Code of Conduct.