How to customize minimal features of speckle system?

Hello everyone!

I’m excited to be a part of the Speckle System community. I need your assistance with a challenge I’ve encountered.

Recently, I attempted to customize some minimal features of the Speckle System and uploaded the updated code to GitHub. However, after cloning the code again, I faced issues when trying to run it.

Here’s the error message I encountered:

[@speckle/server]: [server] [nodemon] app crashed - waiting for file changes before starting...
[@speckle/server]: [gqlgen] {"@l":"Error","component":"redis","err":{"type":"Error","message":"connect ECONNREFUSED 127.0.0.1:6379","stack":"Error: connect ECONNREFUSED 127.0.0.1:6379\n    at TCPConnectWrap.afterConnect [as onco
mplete] (node:net:1555:16)","errno":-4078,"code":"ECONNREFUSED","syscall":"connect","address":"127.0.0.1","port":6379},"@t":"2025-03-20T12:23:45.550Z","@x":"Error: connect ECONNREFUSED 127.0.0.1:6379\n    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16)","@mt":"Redis encountered an error."}
[@speckle/server]: [gqlgen] C:\Users\tjany\Documents\work\VectoAPI5\packages\server\modules\shared\redis\redis.ts:16
[@speckle/server]: [gqlgen]         throw new EnvironmentResourceError('Redis encountered an error.', err) //FIXME backoff and retry?
[@speckle/server]: [gqlgen]               ^
[@speckle/server]: [gqlgen] EnvironmentResourceError: Redis encountered an error.: connect ECONNREFUSED 127.0.0.1:6379
[@speckle/server]: [gqlgen]     at EventEmitter.<anonymous> (C:\Users\tjany\Documents\work\VectoAPI5\packages\server\modules\shared\redis\redis.ts:16:15)
[@speckle/server]: [gqlgen]     at EventEmitter.emit (node:events:517:28)
[@speckle/server]: [gqlgen]     at EventEmitter.emit (node:domain:489:12)
[@speckle/server]: [gqlgen]     at EventEmitter.silentEmit (C:\Users\tjany\Documents\work\VectoAPI5\node_modules\ioredis\built\Redis.js:482:30)
[@speckle/server]: [gqlgen]     at Socket.<anonymous> (C:\Users\tjany\Documents\work\VectoAPI5\node_modules\ioredis\built\redis\event_handler.js:196:14)
[@speckle/server]: [gqlgen]     at Object.onceWrapper (node:events:632:26)
[@speckle/server]: [gqlgen]     at Socket.emit (node:events:529:35)
[@speckle/server]: [gqlgen]     at Socket.emit (node:domain:489:12)
[@speckle/server]: [gqlgen]     at emitErrorNT (node:internal/streams/destroy:151:8)
[@speckle/server]: [gqlgen]     at emitErrorCloseNT (node:internal/streams/destroy:116:3) {
[@speckle/server]: [gqlgen]   jse_shortmsg: 'Redis encountered an error.',
[@speckle/server]: [gqlgen]   jse_cause: Error: connect ECONNREFUSED 127.0.0.1:6379
[@speckle/server]: [gqlgen]       at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16) {
[@speckle/server]: [gqlgen]     errno: -4078,
[@speckle/server]: [gqlgen]     code: 'ECONNREFUSED',
[@speckle/server]: [gqlgen]     syscall: 'connect',
[@speckle/server]: [gqlgen]     address: '127.0.0.1',
[@speckle/server]: [gqlgen]     port: 6379
[@speckle/server]: [gqlgen]   },
[@speckle/server]: [gqlgen]   jse_info: { code: 'ENVIRONMENT_RESOURCE_ERROR', statusCode: 502 },
[@speckle/server]: [gqlgen]   cause: [Function: ve_cause]
[@speckle/server]: [gqlgen] }
[@speckle/server]: [gqlgen] yarn gqlgen:watch exited with code 1
[@speckle/webhook-service]: WARN: Connection Error: Connection ended unexpectedly {"component":"webhook-service"}
[@speckle/webhook-service]: node:internal/process/promises:288
[@speckle/webhook-service]:             triggerUncaughtException(err, true /* fromPromise */);
[@speckle/webhook-service]:             ^
[@speckle/webhook-service]:
[@speckle/webhook-service]: Error: Connection terminated unexpectedly
[@speckle/webhook-service]:     at Object.raw (C:\Users\tjany\Documents\work\VectoAPI5\node_modules\knex\lib\knex-builder\make-knex.js:116:30)
[@speckle/webhook-service]:     at Function.value (C:\Users\tjany\Documents\work\VectoAPI5\node_modules\knex\lib\knex-builder\make-knex.js:92:29)
[@speckle/webhook-service]:     at startTask (C:\Users\tjany\Documents\work\VectoAPI5\packages\webhook-service\src\main.js:17:29)
[@speckle/webhook-service]:     at C:\Users\tjany\Documents\work\VectoAPI5\packages\webhook-service\src\main.js:128:30
[@speckle/webhook-service]:     at Array.map (<anonymous>)
[@speckle/webhook-service]:     at doStuff (C:\Users\tjany\Documents\work\VectoAPI5\packages\webhook-service\src\main.js:126:19)
[@speckle/webhook-service]:     at async main (C:\Users\tjany\Documents\work\VectoAPI5\packages\webhook-service\src\main.js:167:3) {
[@speckle/webhook-service]:   originalStack: 'Error: Connection terminated unexpectedly\n' +
[@speckle/webhook-service]:     '    at Connection.<anonymous> (C:\\Users\\tjany\\Documents\\work\\VectoAPI5\\node_modules\\pg\\lib\\client.js:132:73)\n' +
[@speckle/webhook-service]:     '    at Object.onceWrapper (node:events:631:28)\n' +
[@speckle/webhook-service]:     '    at Connection.emit (node:events:517:28)\n' +
[@speckle/webhook-service]:     '    at Socket.<anonymous> (C:\\Users\\tjany\\Documents\\work\\VectoAPI5\\node_modules\\pg\\lib\\connection.js:107:12)\n' +
[@speckle/webhook-service]:     '    at Socket.emit (node:events:529:35)\n' +
[@speckle/webhook-service]:     '    at endReadableNT (node:internal/streams/readable:1400:12)\n' +
[@speckle/webhook-service]:     '    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)'
[@speckle/webhook-service]: }
[@speckle/webhook-service]:
[@speckle/webhook-service]: Node.js v18.20.7
[@speckle/server]: [server] ERROR: Preview generation failed {"component":"preview"}
[@speckle/server]: [server]     err: {
[@speckle/server]: [server]       "type": "Error",
[@speckle/server]: [server]       "message": "read ECONNRESET",
[@speckle/server]: [server]       "stack":
[@speckle/server]: [server]           Error: read ECONNRESET
[@speckle/server]: [server]               at TCP.onStreamRead (node:internal/stream_base_commons:217:20)
[@speckle/server]: [server]       "errno": -4077,
[@speckle/server]: [server]       "code": "ECONNRESET",
[@speckle/server]: [server]       "syscall": "read"
[@speckle/server]: [server]     }
[@speckle/frontend-2]: [0] ERROR: / request failed in 10 ms {"browser":false,"speckleServerVersion":"unknown","serverName":"local","frontendType":"frontend-2","serverLogger":true,"req":{"id":"50828a10-d6b1-44dd-9bee-411d5a547754
","method":"GET","path":"/","headers":{"x-request-id":"50828a10-d6b1-44dd-9bee-411d5a547754","accept-language":"de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7","accept-encoding":"gzip, deflate, br, zstd","sec-fetch-dest":"document","sec-fe
tch-user":"?1","sec-fetch-mode":"navigate","sec-fetch-site":"none","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","user-agent":"
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36","upgrade-insecure-requests":"1","sec-ch-ua-platform":"\"Windows\"","sec-ch-ua-mobile":"?0","sec-ch-ua":"\"Chromium\
";v=\"134\", \"Not:A-Brand\";v=\"24\", \"Google Chrome\";v=\"134\"","cache-control":"max-age=0","connection":"close","host":"127.0.0.1:8081","x-forwarded-for":"127.0.0.1","x-forwarded-port":"52302","x-forwarded-proto":"http"}},"res":{"statusCode":500,"isRequestAborted":false},"responseTime":10,"requestStatus":"failed","requestPath":"/"}
[@speckle/frontend-2]: [0]     err: {
[@speckle/frontend-2]: [0]       "type": "Error",
[@speckle/frontend-2]: [0]       "message": "failed with status code 500",
[@speckle/frontend-2]: [0]       "stack":
[@speckle/frontend-2]: [0]           Error: failed with status code 500
[@speckle/frontend-2]: [0]               at onResFinished (C:\Users\tjany\Documents\work\VectoAPI5\packages\frontend-2\node_modules\pino-http\logger.js:110:39)
[@speckle/frontend-2]: [0]               at ServerResponse.onResponseComplete (C:\Users\tjany\Documents\work\VectoAPI5\packages\frontend-2\node_modules\pino-http\logger.js:173:14)
[@speckle/frontend-2]: [0]               at ServerResponse.emit (node:events:529:35)
[@speckle/frontend-2]: [0]               at onFinish (node:_http_outgoing:1008:10)
[@speckle/frontend-2]: [0]               at callback (node:internal/streams/writable:555:21)
[@speckle/frontend-2]: [0]               at afterWrite (node:internal/streams/writable:500:5)
[@speckle/frontend-2]: [0]               at onwrite (node:internal/streams/writable:480:7)
[@speckle/frontend-2]: [0]               at WriteWrap.onWriteComplete [as oncomplete] (node:internal/stream_base_commons:106:10)
[@speckle/frontend-2]: [0]               at WriteWrap.callbackTrampoline (node:internal/async_hooks:128:17)
[@speckle/frontend-2]: [0]     }

Could anyone shed light on why this might be happening and how I can fix it? Any guidance would be greatly appreciated!

Thank you!

Hi @Shelim_Muslim — welcome to the community! :waving_hand:

Getting involved and customizing Speckle is awesome, but it can also get tricky — especially when running self-hosted setups. It’s difficult for us to support issues arising from custom deployments, but I’ve had a look at your logs and here are a few things that might help:

  1. Environment — Windows

The biggest red flag: your logs show Windows file paths.

:backhand_index_pointing_right: Speckle Server is not supported on Windows runtimes.
If you’re not already using Docker with WSL2 or a native Linux/macOS environment, that’s likely the root cause.

The remaining points from what your error logs say are somewhat moot if you are on windows so feel free to ignore the rest of the reply

  1. Redis not running

Your error ECONNREFUSED 127.0.0.1:6379 means Redis isn’t running or not reachable.

Make sure Redis is up and running locally or that your environment config points to the correct host. If unsure, you can spin Redis up with:

docker run -p 6379:6379 redis
  1. PostgreSQL connection errors

The webhook service is failing to connect to the database. This suggests either:

  • The DB container/service isn’t running
  • Connection details in your .env file are incorrect

Double-check that PostgreSQL is running and your connection strings are correct.

  1. Preview generation failures

The ECONNRESET in preview generation errors usually means another service it relies on is unavailable or misconfigured.

Make sure all backend services (server, preview, webhook, frontend) are up and talking to each other.

  1. 500 errors from frontend

The frontend failing with 500 errors often comes from backend services crashing due to the above issues.

My recommendation:

  • Start from the official develop branch or a clean release.
  • Run everything in Docker or on Linux/macOS.
  • Use the official guide to double-check your setup
  • Apply any custom changes one by one, testing after each change.

Let us know how you get on! The community is here to help — but sticking to supported environments will save you a lot of headaches.