pascalorg/editorPublic

Create and share 3D architectural projects.

AI summary: A 3D building editor built with React Three Fiber and WebGPU.

Stars
21.2K
+11 today
Forks
2.7K
Watchers
121
Open issues
15
Open PRs
16
Contributors
~26
Commits
1.2K
Branches
160

TypeScriptMITCreated Oct 16, 2025Last push 2d agoLatest release v0.9.1+1.1K stars this week+1.6K this month

Star history

since Oct 19, 2025
010K20KOct 2025Jan 2026Apr 2026Aug 2026
21.2K stars as of Aug 6, 2026, tracked back to Oct 19, 2025. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulMonWedFri2025-08-02: 0 commits2025-08-03: 0 commits2025-08-04: 0 commits2025-08-05: 0 commits2025-08-06: 0 commits2025-08-07: 0 commits2025-08-08: 0 commits2025-08-09: 0 commits2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 6 commits2026-01-15: 4 commits2026-01-16: 5 commits2026-01-17: 4 commits2026-01-18: 4 commits2026-01-19: 6 commits2026-01-20: 3 commits2026-01-21: 14 commits2026-01-22: 7 commits2026-01-23: 6 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 14 commits2026-01-27: 11 commits2026-01-28: 8 commits2026-01-29: 15 commits2026-01-30: 14 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 10 commits2026-02-03: 6 commits2026-02-04: 2 commits2026-02-05: 9 commits2026-02-06: 3 commits2026-02-07: 2 commits2026-02-08: 0 commits2026-02-09: 11 commits2026-02-10: 10 commits2026-02-11: 16 commits2026-02-12: 7 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 8 commits2026-02-17: 10 commits2026-02-18: 29 commits2026-02-19: 13 commits2026-02-20: 11 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 10 commits2026-02-24: 13 commits2026-02-25: 15 commits2026-02-26: 9 commits2026-02-27: 9 commits2026-02-28: 3 commits2026-03-01: 1 commit2026-03-02: 7 commits2026-03-03: 3 commits2026-03-04: 11 commits2026-03-05: 7 commits2026-03-06: 10 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 10 commits2026-03-11: 9 commits2026-03-12: 0 commits2026-03-13: 1 commit2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 1 commit2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 2 commits2026-03-21: 1 commit2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 5 commits2026-03-25: 6 commits2026-03-26: 10 commits2026-03-27: 0 commits2026-03-28: 2 commits2026-03-29: 1 commit2026-03-30: 9 commits2026-03-31: 3 commits2026-04-01: 0 commits2026-04-02: 2 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 1 commit2026-04-06: 2 commits2026-04-07: 3 commits2026-04-08: 1 commit2026-04-09: 3 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 3 commits2026-04-14: 3 commits2026-04-15: 7 commits2026-04-16: 15 commits2026-04-17: 11 commits2026-04-18: 16 commits2026-04-19: 7 commits2026-04-20: 9 commits2026-04-21: 10 commits2026-04-22: 4 commits2026-04-23: 2 commits2026-04-24: 8 commits2026-04-25: 2 commits2026-04-26: 1 commit2026-04-27: 9 commits2026-04-28: 9 commits2026-04-29: 7 commits2026-04-30: 5 commits2026-05-01: 6 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 5 commits2026-05-05: 6 commits2026-05-06: 5 commits2026-05-07: 5 commits2026-05-08: 2 commits2026-05-09: 4 commits2026-05-10: 11 commits2026-05-11: 3 commits2026-05-12: 6 commits2026-05-13: 5 commits2026-05-14: 44 commits2026-05-15: 46 commits2026-05-16: 1 commit2026-05-17: 0 commits2026-05-18: 15 commits2026-05-19: 16 commits2026-05-20: 6 commits2026-05-21: 6 commits2026-05-22: 2 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 2 commits2026-05-27: 5 commits2026-05-28: 4 commits2026-05-29: 5 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 1 commit2026-06-02: 8 commits2026-06-03: 10 commits2026-06-04: 1 commit2026-06-05: 4 commits2026-06-06: 4 commits2026-06-07: 10 commits2026-06-08: 11 commits2026-06-09: 12 commits2026-06-10: 12 commits2026-06-11: 2 commits2026-06-12: 1 commit2026-06-13: 0 commits2026-06-14: 4 commits2026-06-15: 11 commits2026-06-16: 14 commits2026-06-17: 25 commits2026-06-18: 9 commits2026-06-19: 6 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 2 commits2026-06-23: 12 commits2026-06-24: 12 commits2026-06-25: 23 commits2026-06-26: 12 commits2026-06-27: 11 commits2026-06-28: 1 commit2026-06-29: 3 commits2026-06-30: 0 commits2026-07-01: 1 commit2026-07-02: 2 commits2026-07-03: 0 commits2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 3 commits2026-07-07: 1 commit2026-07-08: 10 commits2026-07-09: 9 commits2026-07-10: 1 commit2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 2 commits2026-07-14: 2 commits2026-07-15: 4 commits2026-07-16: 2 commits2026-07-17: 3 commits2026-07-18: 2 commits2026-07-19: 13 commits2026-07-20: 2 commits2026-07-21: 5 commits2026-07-22: 4 commits2026-07-23: 10 commits2026-07-24: 6 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 2 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits
1,081 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Widely adopted

    21,153 stars

  • Rising fast

    +1,073 stars this week

  • Very active

    1,081 commits in 52 weeks

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

  • Repeat trending

    16 trending appearances

What editor does

Pascal Editor is a robust web-based tool for creating and sharing 3D architectural projects directly in the browser. It leverages modern web technologies like React Three Fiber and WebGPU to deliver high-performance 3D rendering and manipulation. The application provides a comprehensive node-based editing system, allowing for complex architectural designs and visualizations. By running entirely in the browser, it democratizes access to powerful 3D design tools without requiring heavy desktop software.

Architects, 3D designers, and web developers looking to build or use high-performance 3D design tools in the browser. It requires familiarity with modern web graphics concepts.

  • WebGPU rendering: Utilizes the latest web graphics API for high-performance 3D visualization.
  • React Three Fiber integration: Leverages React's declarative model for building complex 3D scenes.
  • Node-based architecture: Employs a modular system for defining and extending editor capabilities.
  • Browser-based operation: Runs entirely in modern web browsers without requiring installation.
  • Component ecosystem: Offers separate packages for the viewer runtime and core node definitions.

Where teams use it

Architectural visualization

Create and share detailed 3D models of building designs directly via web links.

Collaborative design

Enable multiple stakeholders to easily view and interact with architectural projects online.

Web-based modeling

Build custom 3D design applications by integrating the core editor components.

Interactive presentations

Embed live, manipulable 3D building models into websites or digital portfolios.

Getting started: npm install @pascal-app/core @pascal-app/viewer @pascal-app/editor @pascal-app/nodes

README

main branch

Pascal Editor

A 3D building editor built with React Three Fiber and WebGPU.

MIT License npm @pascal-app/core npm @pascal-app/viewer Discord X (Twitter)

pascal_editor.mp4

Using Published Packages

The viewer runtime and built-in node definitions are separate packages. Install the full built-in viewer set, then load the built-in plugin once before mounting <Viewer>:

npm install @pascal-app/core @pascal-app/viewer @pascal-app/editor @pascal-app/nodes
import { loadPlugin } from '@pascal-app/core'
import { builtinPlugin } from '@pascal-app/nodes'

await loadPlugin(builtinPlugin)

See the @pascal-app/viewer quick start for a React example.

Repository Architecture

This is a Turborepo monorepo with four main runtime packages:

editor/
├── apps/
│   └── editor/          # Next.js application
├── packages/
│   ├── core/            # Schemas, scene state, and registry contracts
│   ├── viewer/          # 3D rendering runtime and shared systems
│   ├── editor/          # Editing tools and UI components
│   ├── nodes/           # Built-in node definitions, renderers, and systems
│   └── ui/              # Shared UI components

Separation of Concerns

Package Responsibility
@pascal-app/core Node schemas, scene state (Zustand), registry contracts, spatial queries, and event bus
@pascal-app/viewer 3D rendering via React Three Fiber, shared render systems, default camera/controls, and post-processing
@pascal-app/editor Editing tools, panels, selection, and direct-manipulation UI
@pascal-app/nodes Built-in registry plugin with node definitions, renderers, geometry, and systems
apps/editor Standalone Next.js host for the editor packages

The viewer renders the scene with sensible defaults. The editor extends it with interactive tools, selection management, and editing capabilities.

Stores

Each package has its own Zustand store for managing state:

Store Package Responsibility
useScene @pascal-app/core Scene data: nodes, root IDs, dirty nodes, CRUD operations. Persisted to IndexedDB with undo/redo via Zundo.
useViewer @pascal-app/viewer Viewer state: current selection (building/level/zone IDs), level display mode (stacked/exploded/solo), camera mode.
useEditor apps/editor Editor state: active tool, structure layer visibility, panel states, editor-specific preferences.

Access patterns:

// Subscribe to state changes (React component)
const nodes = useScene((state) => state.nodes)
const levelId = useViewer((state) => state.selection.levelId)
const activeTool = useEditor((state) => state.tool)

// Access state outside React (callbacks, systems)
const node = useScene.getState().nodes[id]
useViewer.getState().setSelection({ levelId: 'level_123' })

Core Concepts

Nodes

Nodes are the data primitives that describe the 3D scene. All nodes extend BaseNode:

BaseNode {
  id: string              // Auto-generated with type prefix (e.g., "wall_abc123")
  type: string            // Discriminator for type-safe handling
  parentId: string | null // Parent node reference
  visible: boolean
  camera?: Camera         // Optional saved camera position
  metadata?: JSON         // Arbitrary metadata (e.g., { isTransient: true })
}

Node Hierarchy:

Site
└── Building
    └── Level
        ├── Wall → Item (doors, windows)
        ├── Slab
        ├── Ceiling → Item (lights)
        ├── Roof
        ├── Zone
        ├── Scan (3D reference)
        └── Guide (2D reference)

Nodes are stored in a flat dictionary (Record<id, Node>), not a nested tree. Parent-child relationships are defined via parentId and children arrays.


Scene State (Zustand Store)

The scene is managed by a Zustand store in @pascal-app/core:

useScene.getState() = {
  nodes: Record<id, AnyNode>,  // All nodes
  rootNodeIds: string[],       // Top-level nodes (sites)
  dirtyNodes: Set<string>,     // Nodes pending system updates

  createNode(node, parentId),
  updateNode(id, updates),
  deleteNode(id),
}

Middleware:

  • Persist - Saves to IndexedDB (excludes transient nodes)
  • Temporal (Zundo) - Undo/redo with 50-step history

Scene Registry

The registry maps node IDs to their Three.js objects for fast lookup:

sceneRegistry = {
  nodes: Map<id, Object3D>,    // ID → 3D object
  byType: {
    wall: Set<id>,
    item: Set<id>,
    zone: Set<id>,
    // ...
  }
}

Renderers register their refs using the useRegistry hook:

const ref = useRef<Mesh>(null!)
useRegistry(node.id, 'wall', ref)

This allows systems to access 3D objects directly without traversing the scene graph.


Node Renderers

Renderers are React components that create Three.js objects for each node type:

SceneRenderer
└── NodeRenderer (dispatches by type)
    ├── BuildingRenderer
    ├── LevelRenderer
    ├── WallRenderer
    ├── SlabRenderer
    ├── ZoneRenderer
    ├── ItemRenderer
    └── ...

Pattern:

  1. Renderer creates a placeholder mesh/group
  2. Registers it with useRegistry
  3. Systems update geometry based on node data

Example (simplified):

const WallRenderer = ({ node }) => {
  const ref = useRef<Mesh>(null!)
  useRegistry(node.id, 'wall', ref)

  return (
    <mesh ref={ref}>
      <boxGeometry args={[0, 0, 0]} />  {/* Replaced by WallSystem */}
      <meshStandardMaterial />
      {node.children.map(id => <NodeRenderer key={id} nodeId={id} />)}
    </mesh>
  )
}

Systems

Systems are React components that run in the render loop (useFrame) to update geometry and transforms. They process dirty nodes marked by the store.

Core Systems (in @pascal-app/core):

System Responsibility
WallSystem Generates wall geometry with mitering and CSG cutouts for doors/windows
SlabSystem Generates floor geometry from polygons
CeilingSystem Generates ceiling geometry
RoofSystem Generates roof geometry
ItemSystem Positions items on walls, ceilings, or floors (slab elevation)

Viewer Systems (in @pascal-app/viewer):

System Responsibility
LevelSystem Handles level visibility and vertical positioning (stacked/exploded/solo modes)
ScanSystem Controls 3D scan visibility
GuideSystem Controls guide image visibility

Processing Pattern:

useFrame(() => {
  for (const id of dirtyNodes) {
    const obj = sceneRegistry.nodes.get(id)
    const node = useScene.getState().nodes[id]

    // Update geometry, transforms, etc.
    updateGeometry(obj, node)

    dirtyNodes.delete(id)
  }
})

Dirty Nodes

When a node changes, it's marked as dirty in useScene.getState().dirtyNodes. Systems check this set each frame and only recompute geometry for dirty nodes.

// Automatic: createNode, updateNode, deleteNode mark nodes dirty
useScene.getState().updateNode(wallId, { thickness: 0.2 })
// → wallId added to dirtyNodes
// → WallSystem regenerates geometry next frame
// → wallId removed from dirtyNodes

Manual marking:

useScene.getState().dirtyNodes.add(wallId)

Event Bus

Inter-component communication uses a typed event emitter (mitt):

// Node events
emitter.on('wall:click', (event) => { ... })
emitter.on('item:enter', (event) => { ... })
emitter.on('zone:context-menu', (event) => { ... })

// Grid events (background)
emitter.on('grid:click', (event) => { ... })

// Event payload
NodeEvent {
  node: AnyNode
  position: [x, y, z]
  localPosition: [x, y, z]
  normal?: [x, y, z]
  stopPropagation: () => void
}

Spatial Grid Manager

Handles collision detection and placement validation:

spatialGridManager.canPlaceOnFloor(levelId, position, dimensions, rotation)
spatialGridManager.canPlaceOnWall(wallId, t, height, dimensions)
spatialGridManager.getSlabElevationAt(levelId, x, z)

Used by item placement tools to validate positions and calculate slab elevations.


Editor Architecture

The editor extends the viewer with:

Tools

Tools are activated via the toolbar and handle user input for specific operations:

  • SelectTool - Selection and manipulation
  • WallTool - Draw walls
  • ZoneTool - Create zones
  • ItemTool - Place furniture/fixtures
  • SlabTool - Create floor slabs

Selection Manager

The editor uses a custom selection manager with hierarchical navigation:

Site → Building → Level → Zone → Items

Each depth level has its own selection strategy for hover/click behavior.

Editor-Specific Systems

  • ZoneSystem - Controls zone visibility based on level mode
  • Custom camera controls with node focusing

Data Flow

User Action (click, drag)
       ↓
Tool Handler
       ↓
useScene.createNode() / updateNode()
       ↓
Node added/updated in store
Node marked dirty
       ↓
React re-renders NodeRenderer
useRegistry() registers 3D object
       ↓
System detects dirty node (useFrame)
Updates geometry via sceneRegistry
Clears dirty flag

Building a Plugin

The editor is extensible: a plugin ships node kinds (schema, 3D/2D rendering, placement tools, inspector parametrics) and left-rail panels through the same Plugin manifest the built-ins use — there is no separate internal API.

  • Developer guideCreate a plugin: the Plugin shape, panel contributions, discovery, lifecycle, and what's in/out of v1.
  • Worked examplepascalorg/plugin-trees: a standalone plugin with procedural trees, flowers, grass, and a presets panel. Clone it as a starting point.

Technology Stack

  • React 19 + Next.js 16
  • Three.js (WebGPU renderer)
  • React Three Fiber + Drei
  • Zustand (state management)
  • Zod (schema validation)
  • Zundo (undo/redo)
  • three-bvh-csg (Boolean geometry operations)
  • Turborepo (monorepo management)
  • Bun (package manager)

Getting Started

Development

Run the development server from the root directory to enable hot reload for all packages:

# Install dependencies
bun install

# Run development server (builds packages + starts editor with watch mode)
bun dev

# This will:
# 1. Build @pascal-app/core and @pascal-app/viewer
# 2. Start watching both packages for changes
# 3. Start the Next.js editor dev server
# Open http://localhost:3002

Important: Always run bun dev from the root directory to ensure the package watchers are running. This enables hot reload when you edit files in packages/core/src/ or packages/viewer/src/.

Building for Production

# Build all packages
turbo build

# Build specific package
turbo build --filter=@pascal-app/core

Publishing Packages

# Build packages
turbo build --filter=@pascal-app/core --filter=@pascal-app/viewer

# Publish to npm
npm publish --workspace=@pascal-app/core --access public
npm publish --workspace=@pascal-app/viewer --access public

Key Files

Path Description
packages/core/src/schema/ Node type definitions (Zod schemas)
packages/core/src/store/use-scene.ts Scene state store
packages/core/src/hooks/scene-registry/ 3D object registry
packages/core/src/systems/ Geometry generation systems
packages/viewer/src/components/renderers/ Node renderers
packages/viewer/src/components/viewer/ Main Viewer component
apps/editor/components/tools/ Editor tools
apps/editor/store/ Editor-specific state

Contributors

Aymeric Rabot Wassim Samad Sudhir


pascalorg/editor | Trendshift

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Discussions

all 21

Releases and announcements

13 total
  1. ## 🏗️ Pascal Editor v0.9.1 — Preset System, Rooms & Templates, Building Manipulation This release ships a first-class **preset system**, **room presets & template scans**, a deep **building-manipulation overhaul** (rotation, unified handles, tap-to-engage move), **editor sound design**, **viewer shadow improvements**, and a full **dependency/security refresh**. It also publishes the npm packages announced in v0.9.0 — everything lands on the registry as 0.9.1. ### ✨ Features - **Preset system** — capture builds as presets with framing + zoom-limited thumbnails, browse them in a hierarchical function-tree with an icon-grid category bar, and place them with parameters, move tool, shadows, isolation, and a green/red validity box ([#341](https://github.com/pascalorg/editor/pull/341), [#344](https://github.com/pascalorg/editor/pull/344), [#345](https://github.com/pascalorg/editor/pull/345), [#349](https://github.com/pascalorg/editor/pull/349), [#354](https://github.com/pascalorg/editor/pull/354), [#357](https://github.com/pascalorg/editor/pull/357), [#366](https://github.com/pascalorg/editor/pull/366)) - **Rooms & templates** — save furnished rooms as reusable presets; template scans

  2. ## 🏗️ Pascal Editor v0.9.0 — In-World Handles, Render Modes & IFC Importer This release ships the **node-registry plugin architecture**, **in-world selection handles**, a full **IFC → Pascal importer**, **Solid/Rendered render modes**, **six roof accessories**, a complete **elevator system**, and an expanded material library. ### ✨ Features - **In-world selection handles** — resize arrows and floorplan move handles for wall, door, window, stair, fence, elevator, column, shelf, roof segments, slab, and ceiling. New `NodeDefinition.handles` descriptor and `EditorApi` IoC interface ([#334](https://github.com/pascalorg/editor/pull/334)) - **Viewer render modes** — Solid / Rendered toggle, surface-role clay materials, scene themes (light / dark), textured surfaces, edge + ink pass ([#332](https://github.com/pascalorg/editor/pull/332)) - **Six roof accessories** — chimney, dormer, skylight, solar-panel, ridge-vent, box-vent as first-class `NodeDefinition` kinds with CSG roof cuts ([#330](https://github.com/pascalorg/editor/pull/330)) - **IFC → Pascal converter** — new `packages/ifc-converter` package and `apps/ifc-converter` app; imports IFCWALL dimensions and profile-typed columns (

  3. ## 🌍 Pascal Editor v0.8.0 — Community Sync & MCP on npm This release brings our community-driven improvements into the open-source packages, and marks the **first public npm release of `@pascal-app/mcp`** — the Model Context Protocol server for Pascal. ### 📦 New Package: `@pascal-app/mcp` `@pascal-app/mcp` is now available on npm! ``` npm install @pascal-app/mcp ``` The MCP server exposes the Pascal scene graph to AI hosts (Claude Desktop, Cursor, and any MCP-compatible client) via the [Model Context Protocol](https://modelcontextprotocol.io). It ships with: - **19 MCP tools** — scene querying, mutation, undo/redo, export, validation, and vision - **4 MCP resources** — current scene, summary, item catalog, and level constraints - **3 MCP prompts** — `from_brief`, `iterate_on_feedback`, `renovation_from_photos` - **stdio and Streamable HTTP transports** - **`pascal-mcp` CLI binary** with `--stdio`, `--http`, and `--scene` flags - **Local `SqliteSceneStore`** backed by built-in SQLite (Bun/Node), shared across MCP and the editor via `PASCAL_DATA_DIR` / `PASCAL_DB_PATH` ### ✨ Changes - **Item catalog schema** — items now carry `source` (`library` | `community` | `mine`) and

  4. v0.7.0v0.7.0May 9, 2026

    ## 🎉 Pascal Editor v0.7.0 A major feature release with significant expansions to the door and window systems, a new column node, material paint mode, improved 2D editor, and MCP server support. ### ✨ Features - **Expanded door system** — garage door types, interior door variants, animated open/close, swing angles, frameless openings, dual-side handles, and first-person collider support ([#292](https://github.com/pascalorg/editor/pull/292), [#293](https://github.com/pascalorg/editor/pull/293)) - **Expanded window system** — multiple window types (casement, awning, bay, etc.), animated open/close, first-person window interaction, shape-specific settings, and bay caps ([#292](https://github.com/pascalorg/editor/pull/292), [#295](https://github.com/pascalorg/editor/pull/295)) - **Column node** — new procedural column type in core schema with full preset system: shaft profiles (straight, tapered, bulged), base/capital styles, fluting, spiral detail, and more ([#292](https://github.com/pascalorg/editor/pull/292)) - **Material paint mode** — dedicated paint workflow for applying materials directly to scene elements with category-based compatibility ([#271](https://github.com/pascalorg

  5. v0.6.0v0.6.0Apr 22, 2026

    ## 🎉 Pascal Editor v0.6.0 A major feature release with new building tools, material editing, and quality-of-life improvements. ### ✨ Features - **Multi-surface material system** — per-surface materials for walls, stairs, roofs with click-targeted 3D editing ([#266](https://github.com/pascalorg/editor/pull/266)) - **Automatic wall-room generation** — closed wall loops auto-split and generate slabs ([#255](https://github.com/pascalorg/editor/pull/255), [#257](https://github.com/pascalorg/editor/pull/257)) - **Stair-slab integration** — stair-driven cutouts in slabs and ceilings - **Full curved fence support** + endpoint move tools ([#267](https://github.com/pascalorg/editor/pull/267)) - **Grid snap toolbar controls** - **Auto ceilings** from wall loops - **13 new material presets** — granite, marble, parquet, wallpaper, wood varieties ### 🐛 Fixes - Robust undo/redo with nested history pause/resume — no more drag flooding - WebGPU renderer init fixes, post-processing stability ([#233](https://github.com/pascalorg/editor/pull/233), [#234](https://github.com/pascalorg/editor/pull/234)) - Improved snapping across all geometry types - Prevent crash when duplicating elements ([#239]

Commits per week

last 52 weeks
1160Week of 2025-08-02: 0 commitsWeek of 2025-08-09: 0 commitsWeek of 2025-08-16: 0 commitsWeek of 2025-08-23: 0 commitsWeek of 2025-08-30: 0 commitsWeek of 2025-09-06: 0 commitsWeek of 2025-09-13: 0 commitsWeek of 2025-09-20: 0 commitsWeek of 2025-09-27: 0 commitsWeek of 2025-10-04: 0 commitsWeek of 2025-10-11: 0 commitsWeek of 2025-10-18: 0 commitsWeek of 2025-10-25: 0 commitsWeek of 2025-11-01: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 19 commitsWeek of 2026-01-18: 40 commitsWeek of 2026-01-25: 62 commitsWeek of 2026-02-01: 32 commitsWeek of 2026-02-08: 44 commitsWeek of 2026-02-15: 71 commitsWeek of 2026-02-22: 59 commitsWeek of 2026-03-01: 39 commitsWeek of 2026-03-08: 20 commitsWeek of 2026-03-15: 4 commitsWeek of 2026-03-22: 23 commitsWeek of 2026-03-29: 15 commitsWeek of 2026-04-05: 10 commitsWeek of 2026-04-12: 55 commitsWeek of 2026-04-19: 42 commitsWeek of 2026-04-26: 37 commitsWeek of 2026-05-03: 27 commitsWeek of 2026-05-10: 116 commitsWeek of 2026-05-17: 45 commitsWeek of 2026-05-24: 16 commitsWeek of 2026-05-31: 28 commitsWeek of 2026-06-07: 48 commitsWeek of 2026-06-14: 69 commitsWeek of 2026-06-21: 72 commitsWeek of 2026-06-28: 7 commitsWeek of 2026-07-05: 24 commitsWeek of 2026-07-12: 15 commitsWeek of 2026-07-19: 40 commitsWeek of 2026-07-26: 2 commitsAug 2, 2025Jul 26, 2026
1.1K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 11 commitsSun 1:00 — 2 commitsSun 2:00 — 2 commitsSun 3:00 — 0 commitsSun 4:00 — 0 commitsSun 5:00 — 1 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 4 commitsSun 9:00 — 1 commitsSun 10:00 — 3 commitsSun 11:00 — 3 commitsSun 12:00 — 3 commitsSun 13:00 — 1 commitsSun 14:00 — 0 commitsSun 15:00 — 0 commitsSun 16:00 — 1 commitsSun 17:00 — 6 commitsSun 18:00 — 4 commitsSun 19:00 — 0 commitsSun 20:00 — 5 commitsSun 21:00 — 5 commitsSun 22:00 — 0 commitsSun 23:00 — 2 commitsMon 0:00 — 0 commitsMon 1:00 — 5 commitsMon 2:00 — 1 commitsMon 3:00 — 0 commitsMon 4:00 — 2 commitsMon 5:00 — 0 commitsMon 6:00 — 1 commitsMon 7:00 — 6 commitsMon 8:00 — 19 commitsMon 9:00 — 14 commitsMon 10:00 — 25 commitsMon 11:00 — 16 commitsMon 12:00 — 15 commitsMon 13:00 — 9 commitsMon 14:00 — 8 commitsMon 15:00 — 3 commitsMon 16:00 — 5 commitsMon 17:00 — 8 commitsMon 18:00 — 4 commitsMon 19:00 — 4 commitsMon 20:00 — 4 commitsMon 21:00 — 2 commitsMon 22:00 — 3 commitsMon 23:00 — 3 commitsTue 0:00 — 3 commitsTue 1:00 — 0 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 1 commitsTue 5:00 — 2 commitsTue 6:00 — 2 commitsTue 7:00 — 8 commitsTue 8:00 — 5 commitsTue 9:00 — 15 commitsTue 10:00 — 11 commitsTue 11:00 — 13 commitsTue 12:00 — 14 commitsTue 13:00 — 18 commitsTue 14:00 — 18 commitsTue 15:00 — 22 commitsTue 16:00 — 9 commitsTue 17:00 — 8 commitsTue 18:00 — 6 commitsTue 19:00 — 19 commitsTue 20:00 — 7 commitsTue 21:00 — 0 commitsTue 22:00 — 0 commitsTue 23:00 — 4 commitsWed 0:00 — 4 commitsWed 1:00 — 5 commitsWed 2:00 — 1 commitsWed 3:00 — 1 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 5 commitsWed 7:00 — 11 commitsWed 8:00 — 10 commitsWed 9:00 — 18 commitsWed 10:00 — 18 commitsWed 11:00 — 15 commitsWed 12:00 — 12 commitsWed 13:00 — 20 commitsWed 14:00 — 19 commitsWed 15:00 — 22 commitsWed 16:00 — 14 commitsWed 17:00 — 16 commitsWed 18:00 — 8 commitsWed 19:00 — 0 commitsWed 20:00 — 8 commitsWed 21:00 — 15 commitsWed 22:00 — 7 commitsWed 23:00 — 5 commitsThu 0:00 — 2 commitsThu 1:00 — 12 commitsThu 2:00 — 1 commitsThu 3:00 — 0 commitsThu 4:00 — 2 commitsThu 5:00 — 0 commitsThu 6:00 — 1 commitsThu 7:00 — 7 commitsThu 8:00 — 10 commitsThu 9:00 — 11 commitsThu 10:00 — 23 commitsThu 11:00 — 22 commitsThu 12:00 — 31 commitsThu 13:00 — 25 commitsThu 14:00 — 18 commitsThu 15:00 — 20 commitsThu 16:00 — 17 commitsThu 17:00 — 7 commitsThu 18:00 — 0 commitsThu 19:00 — 6 commitsThu 20:00 — 1 commitsThu 21:00 — 2 commitsThu 22:00 — 2 commitsThu 23:00 — 6 commitsFri 0:00 — 3 commitsFri 1:00 — 3 commitsFri 2:00 — 0 commitsFri 3:00 — 0 commitsFri 4:00 — 1 commitsFri 5:00 — 2 commitsFri 6:00 — 0 commitsFri 7:00 — 2 commitsFri 8:00 — 8 commitsFri 9:00 — 20 commitsFri 10:00 — 17 commitsFri 11:00 — 17 commitsFri 12:00 — 14 commitsFri 13:00 — 14 commitsFri 14:00 — 12 commitsFri 15:00 — 9 commitsFri 16:00 — 7 commitsFri 17:00 — 16 commitsFri 18:00 — 10 commitsFri 19:00 — 4 commitsFri 20:00 — 1 commitsFri 21:00 — 2 commitsFri 22:00 — 5 commitsFri 23:00 — 7 commitsSat 0:00 — 2 commitsSat 1:00 — 3 commitsSat 2:00 — 1 commitsSat 3:00 — 1 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 0 commitsSat 8:00 — 1 commitsSat 9:00 — 2 commitsSat 10:00 — 2 commitsSat 11:00 — 2 commitsSat 12:00 — 0 commitsSat 13:00 — 0 commitsSat 14:00 — 3 commitsSat 15:00 — 1 commitsSat 16:00 — 5 commitsSat 17:00 — 11 commitsSat 18:00 — 4 commitsSat 19:00 — 3 commitsSat 20:00 — 5 commitsSat 21:00 — 4 commitsSat 22:00 — 1 commitsSat 23:00 — 1 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
Aug 6, 2026weekly#10+2,696
Aug 5, 2026weekly#10+2,696
Aug 4, 2026weekly#7+2,953
Aug 3, 2026weekly#5+3,163
Aug 2, 2026weekly#6+3,028
Aug 1, 2026daily#6+625
Aug 1, 2026weekly#6+2,863
Jul 31, 2026daily#6+625
Jul 30, 2026daily#11+1,022
Jul 29, 2026daily#1+341
Apr 15, 2026daily#17+139
Apr 14, 2026daily#19+111
Mar 25, 2026daily#6+228
Mar 24, 2026daily#12+195
Mar 23, 2026daily#10+231
  • freeCodeCamp/freeCodeCamp

    freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.

    453.6K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    385.5K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • affaan-m/ECC

    The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

    238.5K stars · JavaScript