NLnet Grant Milestone 1.b – SolidOS Modernize Code

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.

About SolidOS

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.

Conclusion: Comparison to Modern Architectures

Modern AnalogyMashlib Equivalent
React appSolidOS (app shell)
Redux storerdflib IndexedFormula
Componentssolid-ui widgets
Feature modulessolid-panes
Framework/runtimemashlib orchestrator

Milestone 1.b Work

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.

Architectural Changes

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.

Code Structure Updates

Improved Configurations

Across the 13 repositories, configurations for Babel, ESLint, TypeScript, and Webpack were unified and modernized, all adopting ESM-style .mjs configs.

Babel

TypeScript

ESLint

Modernized ESLint setup with shared configs:

Webpack

Jest

Updated configuration with improved coverage and module mappings.

Working with .ttl Files

Repositories now use babel-plugin-inline-import instead of Makefile preprocessing. Used in: solid-panes, profile-pane, contacts-pane, meeting-pane.

Aligned Build Process

Dependencies & CI/CD

Code Fixes

Conclusion

Mashlib and its repositories now target modern browsers, ship ESM bundles, and support tree-shaking.

Ideas for the Future

And finally…

Mashlib 2.0.0 is out!
Release notes for v2.0.0
A major version bump across all 12 underlying repositories.