Skip to content

Latest commit

ย 

History

490 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Interfacer

Open hardware, from files to fabrication

Interfacer GUI is the Progressive Web App that people use to explore open hardware designs, find the products made from them, and discover the machines, makerspaces and services that can build them locally.

๐Ÿš€ Try the live demo ย ยทย  ๐Ÿ“– About the project ย ยทย  ๐Ÿ‹ Container image

Tests Docker image License: AGPL v3+ Next.js TypeScript

The Interfacer home page: 'Open hardware, from files to fabrication'

Why it exists

Open hardware documentation is scattered. A design lives in one repository, the person who can machine it lives in another city, and the physical object that came out of it leaves no trail back to the files it was built from.

Interfacer closes that loop. It is the client for FabCityOS, a federated platform for open hardware collaboration, and it connects three things that are usually kept apart:

  • The design โ€” documentation, CAD files, licences and specifications.
  • The product โ€” the physical thing somebody actually manufactured from that design.
  • The capability โ€” the machines, materials, spaces and skills available near you.

Underneath, resources and the flows between them are tracked with ValueFlows economic accounting through a zenflows backend, and each account carries a cryptographic identity generated in the browser with Zenroom โ€” so participants keep their keys, their data and their privacy.

๐Ÿ” back to top


What you can do with it

Browse open designs you can build on

Faceted search across every published design โ€” filter by the machines you own, the materials you can source, the licence you need, or how complex the build is.

The designs catalog with filters for machines, materials, licence and complexity

Read the full story of a design

Every project page collects its documentation, licence, contributors, location and relations to other projects in one place.

A project detail page for an Arduino robot arm

Inspect CAD files without downloading them

STEP and STL files render in an interactive 3D viewer right in the page โ€” rotate, pan and zoom before deciding whether the design is worth your filament.

An interactive 3D preview of a STEP file inside the browser

Find the physical products made from open designs

Each product links back to the design it was built from and the manufacturer who built it.

The products catalog, showing physical products made from open designs

Make it near you

Makerspaces, machines and manufacturing services on a map, filterable by service type, availability, equipment and distance.

A map of makerspaces and manufacturing services across Europe

Beyond the catalogs, the app also provides digital product passports (exportable as PDF), project contribution and collaboration flows, notifications, QR scanning, and a full interface in English, German, French and Italian.

๐Ÿ” back to top


Building the digital infrastructure for Fab Cities

Interfacer project

The goal of the INTERFACER project is to build the open-source digital infrastructure for Fab Cities.

Our vision is to promote a green, resilient, and digitally-based mode of production and consumption that enables the greatest possible sovereignty, empowerment and participation of citizens all over the world. We want to help Fab Cities to produce everything they consume by 2054 on the basis of collaboratively developed and globally shared data in the commons.

To know more, download the whitepaper.

๐Ÿ” back to top



๐ŸŽฎ Quick start

The fastest way to see it running is the published container image:

docker run -it -p 3000:3000 ghcr.io/interfacerproject/interfacer-gui:main

Open http://localhost:3000. By default it talks to the public staging backend, so you get a working instance with real data and no setup.

๐Ÿ” back to top


๐Ÿ’พ Install

Prerequisites โ€” Node 24 and pnpm 9.13.1. Both versions are pinned in .mise.toml, so if you use mise a mise install gets you the right ones. Otherwise, any Node 24 plus corepack enable will do.

# optional: fetch the submodules CI also checks out โ€”
# zenflows-crypto (Zenroom contracts), .reuse (licence templates)
# and components/interfacer-dpp. A plain build works without them:
# runtime crypto comes from the zenroom package and the
# @dyne/interfacer-client SDK, and DPPs are fetched over HTTP.
git submodule update --init

pnpm i

# copy and fill the env variables from the example provided
cp .env.example .env.local

# run with livereload and watch
pnpm dev

# or build & start it for faster execution
pnpm build
pnpm start

Open http://localhost:3000 with your browser to see the result.

.env.example points at the public staging gateway, so a fresh checkout runs against a working backend without any credentials of your own.

๐Ÿ” back to top


๐Ÿ”ง Configuration

Default values live in .env.example. Copy it to .env.local and adjust.

Core

Variable What it does
BASE_URL The federated instance gateway every service below hangs off
DEEPL_API_KEY DeepL key used by the i18n module for auto-translation
NEXT_PUBLIC_LOSH_ID The LUID designated as owner of the LOSH imported assets
NEXT_PUBLIC_ZENFLOWS_ADMIN Admin key of the federated zenflows instance
NEXT_PUBLIC_INVITATION_KEY Invitation key needed to register new users
NEXT_PUBLIC_MAPBOX_KEY Mapbox token for the maps โ€” without it, maps stay blank
NEXT_PUBLIC_DID_EXPLORER DID explorer used to resolve decentralised identifiers
NEXT_PUBLIC_START_DATE Start date of the first accounting cycle
NEXT_PUBLIC_CYCLE_LENGTH Length of an accounting cycle, in days
NEXT_PUBLIC_INBOX_COUNT_INTERVAL How often, in ms, to poll for unread notifications

Derived services

These are endpoints of the instance microservices and normally just follow BASE_URL:

NEXT_PUBLIC_ZENFLOWS_URL=$BASE_URL/zenflows/api
NEXT_PUBLIC_ZENFLOWS_FILE_URL=$BASE_URL/zenflows/api/file
NEXT_PUBLIC_DPP_URL=$BASE_URL/interfacer-dpp
NEXT_PUBLIC_LOCATION_AUTOCOMPLETE=$BASE_URL/location-autocomplete/
NEXT_PUBLIC_LOCATION_LOOKUP=$BASE_URL/location-lookup/
NEXT_PUBLIC_INBOX_SEND=$BASE_URL/inbox/send
NEXT_PUBLIC_INBOX_READ=$BASE_URL/inbox/read
NEXT_PUBLIC_INBOX_COUNT_UNREAD=$BASE_URL/inbox/count-unread
NEXT_PUBLIC_INBOX_SET_READ=$BASE_URL/inbox/set-read
NEXT_PUBLIC_WALLET=$BASE_URL/wallet/token
NEXT_PUBLIC_SOCIAL_PERSON=$BASE_URL/inbox/person
NEXT_PUBLIC_SOCIAL_ECONOMIC_RESOURCE=$BASE_URL/inbox/economicresource
NEXT_PUBLIC_OSH=$BASE_URL/osh

Feature flags

Flag Default What it does
NEXT_PUBLIC_FF_COMMERCE_PREVIEW false Enables a mock-up of an upcoming MedusaJS integration (buy block, cart, checkout, seller dashboard). Nothing behind it is real: no Medusa, no payment provider, no writes to zenflows. Demo deployments only.

๐Ÿ” back to top


๐Ÿ›  Development

Scripts

Command What it does
pnpm dev Dev server with livereload
pnpm build Production build
pnpm start Serve the production build
pnpm lint Lint via next lint
pnpm fix-lint Lint and autofix
pnpm check-types Type-check with tsc --noEmit
pnpm format Format everything with Prettier
pnpm check-format Check formatting without writing
pnpm test Run the Playwright end-to-end suite
pnpm e2e:headless Build, then run the suite
pnpm e2e Build, then run it in a visible browser
pnpm translate Extract and auto-translate i18n strings
pnpm types:generate Regenerate GraphQL types (see below)

Project layout

pages/         Next.js routes (pages router) โ€” catalogs, project & resource pages, auth
components/    UI, grouped by area: brickroom/ (design system), partials/, search/, layout/
lib/           Domain logic โ€” GraphQL documents, DPP handling, licences, file upload
hooks/         Data-fetching and stateful React hooks
contexts/      Global React contexts (auth, user)
public/locales Translation catalogs for en, de, fr, it
tests/         Playwright end-to-end specs

The UI is built on Polaris through the @bbtgnn/polaris-interfacer fork, with Tailwind for layout.

๐Ÿ GraphQL API and generated types

The app talks to a zenflows GraphQL endpoint, exposed at NEXT_PUBLIC_ZENFLOWS_URL. TypeScript types for every query and mutation are generated from the live schema:

pnpm types:generate

This reads the schema configured in codegen.ts, scans the GraphQL documents in lib/, components/, pages/ and contexts/, and writes lib/types/index.ts. Run it whenever you add or change a query โ€” the generated file is committed.

Commits

husky runs a pre-commit hook that type-checks, lints and formats staged files, and a commit-msg hook that lints your message with devmoji. Messages follow Conventional Commits, which is where the emoji in the git log come from:

feat(map): cluster nearby service providers
fix(project): keep licence badge visible on narrow screens

Licence headers

This repository follows the REUSE specification. Every file carries an AGPL-3.0-or-later header, and binary files get a .license sidecar next to them. Match the surrounding files when you add new ones.

๐Ÿ” back to top


๐Ÿ“‹ Testing

End-to-end tests are written with Playwright and live in tests/.

# run the whole suite against an existing production build
pnpm test

# build first, then run โ€” what you want from a clean checkout
pnpm e2e:headless

# same, but watch it happen in a browser
pnpm e2e

# run one spec
pnpm exec playwright test tests/authentication.spec.ts

# open the last HTML report
pnpm exec playwright show-report

Playwright starts the app itself: the webServer block in playwright.config.js runs pnpm start and waits for it, reusing a server you already have running outside CI. That's why pnpm test needs a build to exist, and why pnpm e2e:headless makes one first.

Test accounts and keys come from playwright.env.

CI runs the same suite on every push and pull request, and uploads the HTML report as a build artifact โ€” see .github/workflows/test-deploy.yml.

๐Ÿ” back to top


๐Ÿ”ก Translations

The interface ships in English, German, French and Italian. Catalogs live under public/locales/, one directory per language.

pnpm translate

This extracts translatable strings from the source and fills in missing ones via DeepL, which needs DEEPL_API_KEY set in your .env.local. Review what it produces before committing โ€” machine translation gets the gist, not the tone.

๐Ÿ” back to top


๐Ÿ‹ Docker

Images are published to the GitHub Container Registry on every push to main:

docker pull ghcr.io/interfacerproject/interfacer-gui:main
docker run -it -p 3000:3000 ghcr.io/interfacerproject/interfacer-gui:main

To point an instance at your own gateway, pass the environment at run time:

docker run -it -p 3000:3000 --env-file .env.local \
  ghcr.io/interfacerproject/interfacer-gui:main

Building locally works too, straight from the Dockerfile:

docker build -t interfacer-gui .

Next.js inlines NEXT_PUBLIC_* variables at build time, and this image runs pnpm build on container start โ€” so the environment you pass at docker run does take effect, at the cost of a build on every boot. Moving that to a runtime config is a known TODO in the Dockerfile.

๐Ÿ” back to top


๐Ÿ› Troubleshooting & debugging

Maps are blank. NEXT_PUBLIC_MAPBOX_KEY is empty in .env.example โ€” supply your own Mapbox token.

GraphQL errors after pulling. The schema may have moved. Re-run pnpm types:generate and rebuild.

Type errors on commit. The pre-commit hook runs pnpm check-types across the whole project, so an error somewhere else in the tree will block your commit.

Known bugs are on the Issues page.

๐Ÿ” back to top


๐Ÿ‘ค Contributing

  1. ๐Ÿ”€ FORK IT
  2. Create your feature branch git checkout -b feature/branch
  3. Commit your changes git commit -am 'feat: add some fooBar'
  4. Push to the branch git push origin feature/branch
  5. Create a new Pull Request
  6. ๐Ÿ™ Thank you

Before opening the PR, run pnpm check-types, pnpm lint and pnpm test โ€” they're the same gates CI applies.

๐Ÿ” back to top


๐Ÿ˜ Acknowledgements

Copyleft (ษ”) 2022 by Dyne.org foundation, Amsterdam

Designed, written and maintained by Ennio Donato, Micol Salomone, Giovanni Abbatepaolo and Puria Nafisi Azizi.

Built together with the INTERFACER consortium: Helmut Schmidt Universitรคt, Fab City Hamburg, HIWW and Dyne.org.

๐Ÿ” back to top


๐ŸŒ Links

๐Ÿ” back to top


๐Ÿ’ผ License

Interfacer GUI - Interfacer's Progressive Web App client
Copyleft (ษ”) 2022 Dyne.org foundation

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

๐Ÿ” back to top

About

Evolution of Zenflow-gui for Interfacer project

Resources

Stars

10 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages