1. Project Overview & Quickstart (solidjs/solid)
File: README.md
Website • API Docs • Features Tutorial • Playground • Discord
Solid is a declarative JavaScript library for creating user interfaces. Instead of using a Virtual DOM, it compiles its templates to real DOM nodes and updates them with fine-grained reactions. Declare your state and use it throughout your app, and when a piece of state changes, only the code that depends on it will rerun.
At a Glance
import { createSignal } from "solid-js";
import { render } from "solid-js/web";
function Counter() {
const [count, setCount] = createSignal(0);
const doubleCount = () => count() * 2;
console.log("The body of the function runs once...");
return (
<>
setCount(c => c + 1)}>
{doubleCount()}
</>
);
}
render(Counter, document.getElementById("app")!);Try this code in our playground!
Explain this!
import { createSignal } from "solid-js";
import { render } from "solid-js/web";
// A component is just a function that returns a DOM node
function Counter() {
// Create a piece of reactive state, giving us an accessor, count(), and a setter, setCount()
const [count, setCount] = createSignal(0);
//To create derived state, just wrap an expression in a function
const doubleCount = () => count() * 2;
console.log("The body of the function runs once...");
// JSX allows you to write HTML within your JavaScript function and include dynamic expressions using the { } syntax
// The only part of this that will ever rerender is the doubleCount() text.
return (
<>
setCount(c => c + 1)}>
Increment: {doubleCount()}
</>
);
}
// The render function mounts a component onto your page
render(Counter, document.getElementById("app")!);Solid compiles your JSX down to efficient real DOM updates. It uses the same reactive primitives (createSignal) at runtime but making sure there's as little rerendering as possible. Here's what that looks like in this example:
import { template as _$template } from "solid-js/web";
import { delegateEvents as _$delegateEvents } from "solid-js/web";
import { insert as _$insert } from "solid-js/web";
//The compiler pulls out any static HTML
const _tmpl$ = /*#__PURE__*/_$template(`Increment: `);
import { createSignal, createEffect } from "solid-js";
import { render } from "solid-js/web";
function Counter() {
const [count, setCount] = createSignal(0);
const doubleCount = () => count() * 2;
console.log("The body of the function runs once...");
return (() => {
//_el$ is a real DOM node!
const _el$ = _tmpl$();
_el$.$$click = () => setCount(c => c + 1);
//This inserts the count as a child of the button in a way that allows count to update without rerendering the whole button
_$insert(_el$, doubleCount);
return _el$;
})();
}
render(Counter, document.getElementById("app"));
_$delegateEvents(["click"]);Key Features
- Fine-grained updates to the real DOM
- Declarative data: model your state as a system with reactive primitives
- Render-once mental model: your components are regular JavaScript functions that run once to set up your view
- Automatic dependency tracking: accessing your reactive state subscribes to it
- Small and fast
- Simple: learn a few powerful concepts that can be reused, combined, and built on top of
- Provides modern framework features like JSX, fragments, Context, Portals, Suspense, streaming SSR, progressive hydration, Error Boundaries and concurrent rendering.
- Naturally debuggable: A `` is a real div, so you can use your browser's devtools to inspect the rendering
- Web component friendly and can author custom elements
- Isomorphic: render your components on the client and the server
- Universal: write custom renderers to use Solid anywhere
- A growing community and ecosystem with active core team support
Quick Start
You can get started with a simple app by running the following in your terminal:
> npx degit solidjs/templates/js my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpmOr for TypeScript:
> npx degit solidjs/templates/ts my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpmThis will create a minimal, client-rendered application powered by Vite.
Or you can install the dependencies in your own setup. To use Solid with JSX (recommended), run:
> npm i -D babel-preset-solid
> npm i solid-jsThe easiest way to get set up is to add babel-preset-solid to your .babelrc, babel config for webpack, or rollup configuration:
"presets": ["solid"]For TypeScript to work, remember to set your .tsconfig to handle Solid's JSX:
"compilerOptions": {
"jsx": "preserve",
"jsxImportSource": "solid-js",
}Why Solid?
Performant
Meticulously engineered for performance and with half a decade of research behind it, Solid's performance is almost indistinguishable from optimized vanilla JavaScript (See Solid on the JS Framework Benchmark). Solid is small and completely tree-shakable, and fast when rendering on the server, too. Whether you're writing a fully client-rendered SPA or a server-rendered app, your users see it faster than ever. (Read more about Solid's performance from the library's creator.)
Powerful
Solid is fully-featured with everything you can expect from a modern framework. Performant state management is built-in with Context and Stores: you don't have to reach for a third party library to manage global state (if you don't want to). With Resources, you can use data loaded from the server like any other piece of state and build a responsive UI for it thanks to Suspense and concurrent rendering. And when you're ready to move to the server, Solid has full SSR and serverless support, with streaming and progressive hydration to get to interactive as quickly as possible. (Check out our full interactive features walkthrough.)
Pragmatic
Do more with less: use simple, composable primitives without hidden rules and gotchas. In Solid, components are just functions - rendering is determined purely by how your state is used - so you're free to organize your code how you like and you don't have to learn a new rendering system. Solid encourages patterns like declarative code and read-write segregation that help keep your project maintainable, but isn't opinionated enough to get in your way.
Productive
Solid is built on established tools like JSX and TypeScript and integrates with the Vite ecosystem. Solid's bare-metal, minimal abstractions give you direct access to the DOM, making it easy to use your favorite native JavaScript libraries like D3. And the Solid ecosystem is growing fast, with custom primitives, component libraries, and build-time utilities that let you write Solid code in new ways.
More
Check out our official documentation or browse some examples
Browser Support
SolidJS Core is committed to supporting the last 2 years of modern browsers including Firefox, Safari, Chrome and Edge (for desktop and mobile devices). We do not support IE or similar sunset browsers. For server environments, we support Node LTS and the latest Deno and Cloudflare Worker runtimes.
Community
Come chat with us on Discord! Solid's creator and the rest of the core team are active there, and we're always looking for contributions.
Contributors
Open Collective
Support us with a donation and help us continue our activities. [Contribute]
Sponsors
Become a sponsor and get your logo on our README on GitHub with a link to your site. [Become a sponsor]
File: documentation/resources/examples.md
Examples
Online
- Counter Simple Counter
- Simple Todos Todos with LocalStorage persistence
- Simple Routing Use 'switch' control flow for simple routing
- Scoreboard Make use of hooks to do some simple transitions
- Tic Tac Toe Simple Example of the classic game
- Form Validation HTML 5 validators with custom async validation
- CSS Animations Using Solid Transition Group
- Styled Components A simple example of creating Styled Components.
- Styled JSX A simple example of using Styled JSX with Solid.
- Counter Context Implement a global store with Context API
- Async Resource Ajax requests to SWAPI with Promise cancellation
- Async Resource GraphQL Simple resource for handling graphql request.
- Suspense Various Async loading with Solid's Suspend control flow
- Suspense Tabs Deferred loading spinners for smooth UX.
- SuspenseList Orchestrating multiple Suspense Components.
- Redux Undoable Todos Example from Redux site done with Solid.
- Simple Todos Template Literals Simple Todos using Lit DOM Expressions
- Simple Todos HyperScript Simple Todos using Hyper DOM Expressions
Demos
- TodoMVC Classic TodoMVC example
- Real World Demo Real World Demo for Solid
- Hacker News Hacker News Clone for Solid
- Storybook Solid with Storybook
Benchmarks
- JS Framework Benchmark The one and only
- Sierpinski's Triangle Demo Solid implementation of the React Fiber demo.
- WebComponent Todos Showing off Solid Element
- UIBench Benchmark a benchmark tests a variety of UI scenarios.
- DBMon Benchmark A benchmark testing ability of libraries to render unoptimized data.
File: packages/solid-element/README.md
Solid Element
This library extends Solid by adding Custom Web Components and extensions to manage modular behaviors and composition. It uses Component Register to create Web Components and its composed mixin pattern to construct modular reusable behaviors. This allows your code to be available as simple HTML elements for library interop and to leverage Shadow DOM style isolation. Solid already supports binding to Web Components so this fills the gap allowing full modular applications to be built out of nested Web Components. Component Register makes use of the V1 Standards and on top of being compatible with the common webcomponent.js polyfills, has a solution for Polyfilling Shadow DOM CSS using the ShadyCSS Parser from Polymer in a generic framework agnostic way (unlike the ShadyCSS package).
Example
See here for an example of a webcomponent created by solid-element.
Installation
npm i solid-element solid-js babel-preset-solidCustom Elements
The simplest way to create a Web Component is to use the customElement method.
The arguments of customElement are:
- custom element tag (e.g.
'my-component') - (optional) Default prop values (e.g.
{someProp: 'one', otherProp: 'two'}). Props without default values will be ignored by the customElement. - the Solid template function. The arguments of this function are state wrapped props as the first argument, and the underlying element as the 2nd (e.g.
(props, { element }) => { solid code here })
import { customElement } from 'solid-element';
customElement('my-component', {someProp: 'one', otherProp: 'two'}, (props, { element }) => {
// ... Solid code
})Props get assigned as element properties and hyphenated attributes. This exposes the component that can be used in HTML/JSX as:
<my-component some-prop="some value" other-prop="some value"></my-component>This is all you need to get started with Solid Element.
A shadow DOM is used by default for style isolation. If you want to disable the shadow DOM, you can do it with noShadowDOM() like this:
import { customElement, noShadowDOM } from 'solid-element';
customElement('my-component', {someProp: 'one', otherProp: 'two'}, (props, { element }) => {
noShadowDOM();
// ... Solid code
})Examples
Web Component Todos Simple Todos Comparison
Hot Module Replacement (new)
Solid Element exposes Component Register's Hot Module Replacement solution for Webpack and Parcel. It does not preserve state, swapping Components that are changed and their descendants. This approach is simple but predictable. It works by indicating the component to be Hot Replaced with the hot method in your file.
import { customElement, hot } from 'solid-element';
hot(module, 'my-component');This is a new feature that is actively seeking feedback. Read more: Component Register
There is also a webpack loader that handles adding this automatically. Check out Component Register Loader
withSolid
Under the hood the customElement method is using Component Register's mixins to create our Custom Element. So this library also provides the way to do so directly if you wish to mixin your own functionality. It all starts by using the register HOC which upgrades your class or method to a WebComponent. It is always the start of the chain.
import { register } from 'component-register';
/*
register(tag, defaultProps)
*/
register('my-component', {someProp: 'one', otherProp: 'two'})((props, options) =>
// ....
)Component Register exposes a convenient compose method (a reduce right) that makes it easier compose multiple mixins. From there we can use withSolid mixin to basically produce the Component method above. However, now you are able to add more HOC mixins in the middle to add additional behavior in your components.
import { register, compose } from 'component-register';
import { withSolid } from 'solid-element';
/*
withSolid
*/
compose(
register('my-component'),
withSolid
)((props, options) =>
// ....
)File: packages/solid/h/README.md
Solid HyperScript
This sub module provides a HyperScript method for Solid. This is useful to use Solid in non-compiled environments or in some environments where you can only use a standard JSX transform. This method can be used as the JSX factory function.
HyperScript function takes a few forms. The 2nd props argument is optional. Children may be passed as either an array to the 2nd/3rd argument or as every argument past the 2nd.
// create an element with a title attribute
h("button", { title: "My button" }, "Click Me")
// create a component with a title prop
h(Button, { title: "My button" }, "Click Me")
// create an element with many children
h("div", { title: "My button" }, h("span", "1"), h("span", "2"), h("span", "3"))This is the least efficient way to use Solid as it requires a slightly larger runtime that isn't treeshakeable, and cannot leverage anything in the way of analysis, so it requires manual wrapping of expressions and has a few other caveats (see below).
Example
import { render } from "solid-js/web";
import h from "solid-js/h";
import { createSignal } from "solid-js";
function Button(props) {
return h("button.btn-primary", props)
}
function Counter() {
const [count, setCount] = createSignal(0);
const increment = (e) => setCount(c => c + 1);
return h(Button, { type: "button", onClick: increment }, count);
}
render(Counter, document.getElementById("app"));Differences from JSX
There are a few differences from Solid's JSX that are important to note. And also apply when attempting use any transformation that would compile to HyperScript.
- Reactive expression must be manually wrapped in functions to be reactive.
// jsx
{firstName() + lastName()}
// hyperscript
h("div", { id: () => props.id }, () => firstName() + lastName())- Merging spreads requires using the merge props helper to keep reactivity
// jsx
// hyperscript
import { mergeProps } from "solid-js"
h("div", mergeProps({ class: selectedClass }, props))- Events on components require explicit event in the arguments
Solid's HyperScript automatically wraps functions passed to props of components with no arguments in getters so you need to provide one to prevent this. The same applies to render props like in the <For> component.
// good
h(Button, { onClick: (e) => console.log("Hi")});
// bad
h(Button, { onClick: () => console.log("Hi")})- All refs are callback form
We can't do the compiled assignment trick so only the callback form is supported.
let myEl;
h(div, { ref: (el) => myEl = el });- There is a shorthand for static id and classes
h("div#some-id.my-class")- Fragments are just arrays
[h("span", "1"), h("span", "2")]File: packages/solid/html/README.md
Solid Tagged Template Literals
This sub module provides a Tagged Template Literal html method for Solid. This is useful to use Solid in non-compiled environments. This method can be used as replacement for JSX.
html uses ${} to escape into JavaScript expressions. Components are closed with <//>
// create an element with a title attribute
html`Click Me`
// create a component with a title prop
html`<${Button} title="My button">Click me<//>`
// create an element with dynamic attribute and spread
html` selectedClass()} ...${props} />`Using html is slightly less efficient than JSX(but more than HyperScript), requires a larger runtime that isn't treeshakeable, and cannot leverage expression analysis, so it requires manual wrapping of expressions and has a few other caveats (see below).
Example
import { render } from "solid-js/web";
import html from "solid-js/html";
import { createSignal } from "solid-js";
function Button(props) {
return html``;
}
function Counter() {
const [count, setCount] = createSignal(0);
const increment = (e) => setCount((c) => c + 1);
return html`<${Button} type="button" onClick=${increment}>${count}<//>`;
}
render(Counter, document.getElementById("app"));Differences from JSX
There are a few differences from Solid's JSX that are important to note.
- Reactive expression must be manually wrapped in functions to be reactive.
// jsx
{firstName() + lastName()}
// hyperscript
html` props.id}>${() => firstName() + lastName()}`- Events on components require explicit event in the arguments
Solid's Tagged Template Literals automatically wraps functions passed to props of components with no arguments in getters so you need to provide one to prevent this. The same applies to render props like in the <For> component.
// good
html`<${Button} onClick=${(e) => console.log("Hi")} />`;
// bad
html`<${Button} onClick=${() => console.log("Hi")} />`;- All refs are callback form
We can't do the compiled assignment trick so only the callback form is supported.
let myEl;
html` myEl = el} />`;- There can be multiple top level elements
No need for fragments just:
html`
1
2
`File: packages/solid/store/README.md
Solid Store
This submodules contains the means for handling deeps nested reactivity. It provides 2 main primitives createStore and createMutable which leverage proxies to create dynamic nested reactive structures.
This also contains helper methods produce and reconcile which augment the behavior of the store setter method to allow for localized mutation and data diffing.
For full documentation, check out the website.
Example
import { createStore } from "solid-js/store";
const [store, setStore] = createStore({
user: {
firstName: "John",
lastName: "Smith"
}
});
// update store.user.firstName
setStore("user", "firstName", "Will");File: packages/solid/universal/README.md
Solid Universal
This contains the means to create the runtime for a custom renderer for Solid. This can enable using Solid to render to different platforms like native mobile and desktop, canvas or WebGL, or even the terminal. It relies on custom compilation from babel-preset-solid and exporting the result of createRenderer at a referenceable location.
Example
Babel
To use a custom renderer available in the (fictional) solid-custom-dom package you'd configure your babelrc as:
{
"presets": [
[
"babel-preset-solid",
{
"moduleName": "solid-custom-dom",
"generate": "universal"
}
]
]
}Vite
To use a custom renderer available in the (fictional) solid-custom-dom package you'd configure your vite config as:
import { defineConfig } from 'vite';
import solidPlugin from 'vite-plugin-solid';
export default defineConfig({
plugins: [solidPlugin({
solid: {
moduleName: "solid-custom-dom",
generate: 'universal'
}
})]
});To create a custom renderer you must implement certain methods and export (as named exports) the results. You may also want to forward solid-js control flow to allow them to be auto imported as well.
// example custom dom renderer
import { createRenderer } from "solid-js/universal";
const PROPERTIES = new Set(["className", "textContent"]);
export const {
render,
effect,
memo,
createComponent,
createElement,
createTextNode,
insertNode,
insert,
spread,
setProp,
mergeProps,
use
} = createRenderer({
createElement(string) {
return document.createElement(string);
},
createTextNode(value) {
return document.createTextNode(value);
},
replaceText(textNode, value) {
textNode.data = value;
},
setProperty(node, name, value) {
if (name === "style") Object.assign(node.style, value);
else if (name.startsWith("on")) node[name.toLowerCase()] = value;
else if (PROPERTIES.has(name)) node[name] = value;
else node.setAttribute(name, value);
},
insertNode(parent, node, anchor) {
parent.insertBefore(node, anchor);
},
isTextNode(node) {
return node.type === 3;
},
removeNode(parent, node) {
parent.removeChild(node);
},
getParentNode(node) {
return node.parentNode;
},
getFirstChild(node) {
return node.firstChild;
},
getNextSibling(node) {
return node.nextSibling;
}
});
// Forward Solid control flow
export {
For,
Show,
Suspense,
SuspenseList,
Switch,
Match,
Index,
ErrorBoundary
} from "solid-js";Then to consume:
import { render } from "solid-custom-dom";
function App() {
// the skies the limits
}
render(() => <App />, mountNode)Note: For TypeScript support of non-standard JSX you will need to provide your own types at a jsx-runtime entry on your package so that it can be set as the
jsxImportSource. If mixing and matching different JSX implementations you will need use the per file pragmas.
File: packages/solid/web/README.md
Solid Web
This submodule contains the web specific APIs for Solid that are mostly internal methods imported during compilation. It has all the code to render for the web on the server and the browser.
In addition this modules provides the primary entry point methods render, hydrate, renderToString, renderToStringAsync, pipeToNodeWritable, and pipeToWritable. As well as a few web specific control flow components `` and <Dynamic>.
Refer to the website for documentation.
File: packages/solid/README.md
Website • API Docs • Features Tutorial • Playground • Discord
Solid is a declarative JavaScript library for creating user interfaces. Instead of using a Virtual DOM, it compiles its templates to real DOM nodes and updates them with fine-grained reactions. Declare your state and use it throughout your app, and when a piece of state changes, only the code that depends on it will rerun. Check out our intro video or read on!
Key Features
- Fine-grained updates to the real DOM
- Declarative data: model your state as a system with reactive primitives
- Render-once mental model: your components are regular JavaScript functions that run once to set up your view
- Automatic dependency tracking: accessing your reactive state subscribes to it
- Small and fast
- Simple: learn a few powerful concepts that can be reused, combined, and built on top of
- Provides modern framework features like JSX, fragments, Context, Portals, Suspense, streaming SSR, progressive hydration, Error Boundaries and concurrent rendering.
- Naturally debuggable: A `` is a real div, so you can use your browser's devtools to inspect the rendering
- Web component friendly and can author custom elements
- Isomorphic: render your components on the client and the server
- Universal: write custom renderers to use Solid anywhere
- A growing community and ecosystem with active core team support
Quick Start
You can get started with a simple app by running the following in your terminal:
> npx degit solidjs/templates/js my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpmOr for TypeScript:
> npx degit solidjs/templates/ts my-app
> cd my-app
> npm i # or yarn or pnpm
> npm run dev # or yarn or pnpmThis will create a minimal, client-rendered application powered by Vite.
Or you can install the dependencies in your own setup. To use Solid with JSX (recommended), run:
> npm i -D babel-preset-solid
> npm i solid-jsThe easiest way to get set up is to add babel-preset-solid to your .babelrc, babel config for webpack, or rollup configuration:
"presets": ["solid"]For TypeScript to work, remember to set your .tsconfig to handle Solid's JSX:
"compilerOptions": {
"jsx": "preserve",
"jsxImportSource": "solid-js",
}Why Solid?
Performant
Meticulously engineered for performance and with half a decade of research behind it, Solid's performance is almost indistinguishable from optimized vanilla JavaScript (See Solid on the JS Framework Benchmark). Solid is small and completely tree-shakable, and fast when rendering on the server, too. Whether you're writing a fully client-rendered SPA or a server-rendered app, your users see it faster than ever. (Read more about Solid's performance from the library's creator.)
Powerful
Solid is fully-featured with everything you can expect from a modern framework. Performant state management is built-in with Context and Stores: you don't have to reach for a third party library to manage global state (if you don't want to). With Resources, you can use data loaded from the server like any other piece of state and build a responsive UI for it thanks to Suspense and concurrent rendering. And when you're ready to move to the server, Solid has full SSR and serverless support, with streaming and progressive hydration to get to interactive as quickly as possible. (Check out our full interactive features walkthrough.)
Pragmatic
Do more with less: use simple, composable primitives without hidden rules and gotchas. In Solid, components are just functions - rendering is determined purely by how your state is used - so you're free to organize your code how you like and you don't have to learn a new rendering system. Solid encourages patterns like declarative code and read-write segregation that help keep your project maintainable, but isn't opinionated enough to get in your way.
Productive
Solid is built on established tools like JSX and TypeScript and integrates with the Vite ecosystem. Solid's bare-metal, minimal abstractions give you direct access to the DOM, making it easy to use your favorite native JavaScript libraries like D3. And the Solid ecosystem is growing fast, with custom primitives, component libraries, and build-time utilities that let you write Solid code in new ways.
Show Me!
import { render } from "solid-js/web";
import { createSignal } from "solid-js";
// A component is just a function that (optionally) accepts properties and returns a DOM node
const Counter = props => {
// Create a piece of reactive state, giving us a accessor, count(), and a setter, setCount()
const [count, setCount] = createSignal(props.startingCount || 1);
// The increment function calls the setter
const increment = () => setCount(count() + 1);
console.log(
"The body of the function runs once, like you'd expect from calling any other function, so you only ever see this console log once."
);
// JSX allows us to write HTML within our JavaScript function and include dynamic expressions using the { } syntax
// The only part of this that will ever rerender is the count() text.
return (
Increment {count()}
);
};
// The render function mounts a component onto your page
render(() => <Counter startingCount={2} />, document.getElementById("app"));See it in action in our interactive Playground!
Solid compiles our JSX down to efficient real DOM expressions updates, still using the same reactive primitives (createSignal) at runtime but making sure there's as little rerendering as possible. Here's what that looks like in this example:
import { render, createComponent, delegateEvents, insert, template } from "solid-js/web";
import { createSignal } from "solid-js";
const _tmpl$ = /*#__PURE__*/ template(`Increment `, 2);
const Counter = props => {
const [count, setCount] = createSignal(props.startingCount || 1);
const increment = () => setCount(count() + 1);
console.log("The body of the function runs once . . .");
return (() => {
//_el$ is a real DOM node!
const _el$ = _tmpl$.cloneNode(true);
_el$.firstChild;
_el$.$$click = increment;
//This inserts the count as a child of the button in a way that allows count to update without rerendering the whole button
insert(_el$, count, null);
return _el$;
})();
};
render(
() =>
createComponent(Counter, {
startingCount: 2
}),
document.getElementById("app")
);
delegateEvents(["click"]);More
Check out our official documentation or browse some examples
Browser Support
SolidJS Core is committed to supporting the last 2 years of modern browsers including Firefox, Safari, Chrome and Edge (for desktop and mobile devices). We do not support IE or similar sunset browsers. For server environments, we support Node LTS and the latest Deno and Cloudflare Worker runtimes.
Community
Come chat with us on Discord! Solid's creator and the rest of the core team are active there, and we're always looking for contributions.
Contributors
Open Collective
Support us with a donation and help us continue our activities. [Contribute]
Sponsors
Become a sponsor and get your logo on our README on GitHub with a link to your site. [Become a sponsor]
2. Official Technical Reference & Guides (solidjs/solid-docs)
Welcome to Solid's documentation!
This is the repo for docs.solidjs.com. This repo
contains all the source code that we use to build our docs.
What is Solid?
Solid is a JavaScript framework used for building high-performance
user-interfaces. Using a reactive approach and component-based architecture, we
want to empower developers in creating efficient and scalable web applications.
Thank you for being here!
You can help make our docs better for the community! Your feedback is welcomed.
In addition, any editing, translating, designing, and developing skills are
welcomed. We are grateful to welcome you into our community!
If you want to see how you can contribute, check out our
How You Can Help section.
Chat with us
You can learn more about Solid, get support, and meet other devs and
contributors in our Discord community.
Raise an issue
Have you noticed something is missing, confusing, or is wrong in our
documentation?
Check to see if it has
already been mentioned
and, if not,
create an issue
to bring it to our attention!
Share an idea
Do you think something could be better? Have an idea you feel could make the
docs better?
Discussion threads are where you can offer feedback on things that might not be
problems that need addressing, but are ideas to be explored.
Join us in the
Discussions section
where we can brainstorm these ideas, ask questions, and share goals!
Suggest a fix or contribute
Have you found a typo, broken link, or another item with an obvious quick fix?
If you can see what the problem is, and you know how to fix it, you can make a
PR (pull request) with the change and contribute to the docs repo yourself.
If you're looking to make a larger contribution, please see our
CONTRIBUTING.md
first!
Running the Site Locally
At the moment, we recommend running the site locally through either
CodeSandbox,
Gitpod, or
StackBlitz. These are
the quickest and easiest way to browse and edit the project files and run the
site locally.
The app uses pnpm as the package manager and it runs on Node.js v22+.
Install dependencies:
pnpm iAnd run the local dev server:
pnpm devThis will start your the app at localhost:3000 or the next available port.
Framework and Theme
The docs are built on SolidBase and uses the Osmium Theme.
This repo should only contain content as mdx files, features should be implemented upstream and UI changes in the theme.