November 2025 marks a bit over a month since our previous release. Milestone 1.b focuses on the modernization and optimization of the SolidOS codebase — once again a milestone centered heavily on backend improvements. Below is an overview of the work completed during this phase.
SolidOS is a monolithic, plugin-based, semantic web application framework.
It is monolithic in the sense that Mashlib is bundled into a single build (historically via webpack). All panes and dependencies are packaged into one large JavaScript file. Despite this, the internal architecture is modular:
It is plugin-based thanks to its dynamic pane system: each pane registers itself through solid-panes.register().
Finally, the UI is semantic data–driven rather than URL- or route-driven (as in React, Angular, or Vue). The RDF type of the resource dictates which UI to display, and the RDF graph acts as the central shared data model.
| Modern Analogy | Mashlib Equivalent |
|---|---|
| React app | SolidOS (app shell) |
| Redux store | rdflib IndexedFormula |
| Components | solid-ui widgets |
| Feature modules | solid-panes |
| Framework/runtime | mashlib orchestrator |
All work was tracked in a single GitHub issue: #224. Work included architectural changes, code structure updates, configuration improvements, aligned build processes, release bundling, and code fixes.
The biggest architectural update was the decision not to bundle rdflib, solid-logic, and solid-ui inside Mashlib. Developers now explicitly import dependencies:
<script src="https://cdn.jsdelivr.net/npm/rdflib/dist/rdflib.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/solid-logic/dist/solid-logic.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/solid-ui/dist/solid-ui.min.js"></script>
<script>
const rdf = window.$rdf;
const logic = window.SolidLogic;
const UI = window.UI;
logic.authn.checkUser().then((webId) => {
const solidLogo = 'https://solidproject.org/assets/img/solid-emblem.svg'
const myButton = UI.widgets.button(document, solidLogo, 'test', () => alert('clicked!'))
UI.widgets.clearElement(document.body)
document.body.appendChild(myButton)
})
</script>
This reduces coupling, improves bundling, enables future experimentation, and improves tree-shaking. Mashlib bundle size decreased from 5.67 MiB to 4.33 MiB.
dist instead of lib.dist/, README, and license are published. Legacy .npmignore files were removed.
test/, source to src/.Across the 13 repositories, configurations for Babel, ESLint, TypeScript, and Webpack were unified and modernized, all adopting ESM-style .mjs configs.
Modernized ESLint setup with shared configs:
neostandard instead of @eslint/js.@typescript-eslint plugin in favor of TS checks.strictNullChecks, noImplicitThis, alwaysStrict, noUnusedLocals. enforced through tsconfigs with complementary style rules for js.Updated configuration with improved coverage and module mappings.
Repositories now use babel-plugin-inline-import instead of Makefile preprocessing. Used in: solid-panes, profile-pane, contacts-pane, meeting-pane.
peerDependencies.Mashlib and its repositories now target modern browsers, ship ESM bundles, and support tree-shaking.