mirror of
https://github.com/layer-systems/website.git
synced 2026-09-12 21:53:40 +02:00
* Initial plan * Wire package metadata into About app Co-authored-by: mroxso <24775431+mroxso@users.noreply.github.com> * Complete About version test wiring Co-authored-by: mroxso <24775431+mroxso@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: mroxso <24775431+mroxso@users.noreply.github.com>
125 lines
5.0 KiB
Markdown
125 lines
5.0 KiB
Markdown
# LAYER.systems
|
|
|
|
LAYER.systems is a Nostr client designed like a desktop operating system. Instead of
|
|
navigating between pages, you open apps in windows that can be moved, resized, stacked,
|
|
minimized, and kept open side by side. This makes it possible to read a thread, inspect a
|
|
profile, and keep your feed available at the same time.
|
|
|
|
The app is for people who use Nostr and want a focused, multitasking-friendly interface,
|
|
as well as contributors interested in building Nostr applications with React and
|
|
TypeScript.
|
|
|
|
## What you can do
|
|
|
|
- Browse a Following or Global feed, publish notes, and open notes with their replies.
|
|
- View profiles, follow or unfollow people, and search notes, replies, hashtags, and users.
|
|
- Read NIP-23 long-form articles, save notes and articles, and create web bookmarks.
|
|
- Discover picture posts and view live events with their NIP-53 chat.
|
|
- Browse Nostr calendar events by month.
|
|
- Manage relay connections, inspect connection latency, and configure relays and Blossom
|
|
media servers.
|
|
- Sign in with a Nostr account, switch between accounts, and use NIP-19 identifiers such
|
|
as `npub`, `note`, `nevent`, `nprofile`, and `naddr` as links.
|
|
- Save and share reusable Nostr queries with Spells.
|
|
|
|
LAYER.systems reads and writes Nostr events through relays. It does not provide a
|
|
centralized social database; your relays and signer remain the source of your Nostr data.
|
|
Some features require a signed-in account, and availability of content depends on the
|
|
relays you use.
|
|
|
|
## Run locally
|
|
|
|
### Requirements
|
|
|
|
- Node.js 22 or newer
|
|
- npm
|
|
|
|
Clone the repository, install dependencies, and start the Vite development server:
|
|
|
|
```bash
|
|
git clone https://github.com/layer-systems/website.git
|
|
cd website
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
The development server listens on <http://localhost:8080>. The app has no required
|
|
environment variables; relay and media-server settings are managed in the app.
|
|
|
|
Useful commands:
|
|
|
|
```bash
|
|
npm run test # Type-check, lint, run Vitest, and create a production build
|
|
npm run build # Create the production bundle in dist/
|
|
```
|
|
|
|
`npm run build` also creates `dist/404.html`, which supports client-side routes when the
|
|
build is deployed as a static site.
|
|
|
|
## Production deployment
|
|
|
|
The repository includes a GitHub Actions workflow in
|
|
[`.github/workflows/deploy.yml`](./.github/workflows/deploy.yml). It runs on pushes to
|
|
`main` (or manually from the Actions tab), builds the app with Node.js 22, and deploys
|
|
`dist/` to GitHub Pages.
|
|
|
|
For another static host, run `npm run build` and publish the generated `dist/` directory.
|
|
Configure the host to serve `dist/404.html` for unknown paths so direct NIP-19 links
|
|
continue to load the client application.
|
|
|
|
## Technology
|
|
|
|
- [React 19](https://react.dev/) and [TypeScript](https://www.typescriptlang.org/)
|
|
- [Vite](https://vite.dev/) for development and production builds
|
|
- [Tailwind CSS](https://tailwindcss.com/) and [shadcn/ui](https://ui.shadcn.com/) for UI
|
|
- [Nostrify](https://www.npmjs.com/package/@nostrify/nostrify) and
|
|
[nostr-tools](https://github.com/nbd-wtf/nostr-tools) for Nostr integration
|
|
- [React Router](https://reactrouter.com/) for the root and NIP-19 routes
|
|
- [TanStack Query](https://tanstack.com/query) for fetching and caching
|
|
- [Vitest](https://vitest.dev/) and
|
|
[React Testing Library](https://testing-library.com/docs/react-testing-library/intro/)
|
|
for tests
|
|
|
|
The application is organized into three main layers:
|
|
|
|
```text
|
|
src/os/ Window manager, persistence, layout, and keyboard shortcuts
|
|
src/components/os/ Desktop shell, menu bar, windows, and mobile app shell
|
|
src/apps/ Nostr and system apps rendered inside windows
|
|
src/components/ Shared UI, authentication, and Nostr components
|
|
src/hooks/ Data access and application hooks
|
|
```
|
|
|
|
Apps are registered in [`src/os/registry.ts`](./src/os/registry.ts). Each app is lazy
|
|
loaded and receives a small window-oriented contract, so adding an app normally does not
|
|
require changing the router. Read [the app guide](./docs/apps.md) before adding one.
|
|
|
|
## Documentation
|
|
|
|
- [Documentation index](./docs/README.md)
|
|
- [Window manager](./docs/window-manager.md)
|
|
- [App development](./docs/apps.md)
|
|
- [Nostr data access and safety](./docs/nostr.md)
|
|
- [Style guide](./docs/styleguide.md)
|
|
- [Project architecture and design decisions](./PLAN.md)
|
|
- [Versioning and release workflow](./docs/versioning.md)
|
|
|
|
For protocol reference, see the [Nostr protocol documentation](https://nostr.com/).
|
|
|
|
## Contributing
|
|
|
|
1. Create a branch for your change.
|
|
2. Install dependencies with `npm install`.
|
|
3. Make the smallest focused change that fits the existing architecture.
|
|
4. Run `npm run test`.
|
|
5. Open a pull request describing the behavior you changed and how you verified it.
|
|
|
|
When working with Nostr content, treat events, URLs, and profile metadata as untrusted
|
|
input. Follow the validation and URL-sanitization patterns in
|
|
[`docs/nostr.md`](./docs/nostr.md), and do not use `any` in TypeScript.
|
|
|
|
## License
|
|
|
|
LAYER.systems is dedicated to the public domain. You are free to copy, modify,
|
|
distribute, and use it for any purpose, commercial or non-commercial.
|