diff --git a/.dockerignore b/.dockerignore
index 9bcce7a80897..41c8cb33868e 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,3 +1,21 @@
+# Exclude everything by default
**
+
+# Include necessary files for building
+!package.json
+!package-lock.json
+!tsconfig.json
+!src/
+!lib/
+!patches/
+!ci/
!release-packages
-!ci
+!.git/
+!.gitmodules
+!eslint.config.mjs
+!.prettierrc.yaml
+!.prettierignore
+!.editorconfig
+!.node-version
+!.nvmrc
+!test/
diff --git a/ci/release-image/Dockerfile b/ci/release-image/Dockerfile
index fba7189e6999..6159c686d012 100644
--- a/ci/release-image/Dockerfile
+++ b/ci/release-image/Dockerfile
@@ -1,9 +1,64 @@
# syntax=docker/dockerfile:experimental
-
ARG BASE=debian:12
+
+# ==============================================================================
+# Builder Stage
+# This stage builds code-server from source and creates a .deb package.
+# ==============================================================================
+FROM node:20-bookworm as builder
+
+# TARGETARCH is automatically set by Docker to the architecture of the build machine (e.g., amd64, arm64)
+ARG TARGETARCH
+
+# Install build dependencies.
+# nfpm is used for creating .deb packages.
+# We download the correct version for the target architecture.
+RUN apt-get update && apt-get install -y git curl rsync jq \
+ && NFPM_ARCH=${TARGETARCH} && \
+ if [ "${TARGETARCH}" = "amd64" ]; then NFPM_ARCH="x86_64"; fi && \
+ curl -sL "https://github.com/goreleaser/nfpm/releases/download/v2.35.3/nfpm_2.35.3_Linux_${NFPM_ARCH}.tar.gz" | tar -xz -C /usr/local/bin nfpm \
+ && chmod +x /usr/local/bin/nfpm
+
+WORKDIR /app
+
+# Copy the entire project source. We need the .git directory for versioning.
+COPY . .
+
+# Initialize git submodules.
+# Running as root in the container, so we need to mark the directory as safe.
+RUN git config --global --add safe.directory /app && git submodule update --init --recursive
+
+# Install all dependencies.
+RUN npm install
+
+RUN cd lib/vscode && npm install
+
+# Build and package code-server.
+# All build scripts will now run in a Linux environment, producing the correct artifacts.
+ENV VERSION=0.0.1
+# ENV NODE_OPTIONS="--max-old-space-size=4096"
+RUN npm run build:vscode
+RUN npm run build
+RUN npm run release:standalone
+RUN npm run package
+# RUN ./ci/build/build-release.sh
+# RUN ./ci/build/build-packages.sh
+
+
+# ==============================================================================
+# Packages Stage
+# This stage simply holds the .deb file for the final image.
+# ==============================================================================
FROM scratch AS packages
-COPY release-packages/code-server*.deb /tmp/
+# Copy the .deb package from the builder stage.
+COPY --from=builder /app/release-packages/code-server*${TARGETARCH}*.deb /tmp/
+
+
+# ==============================================================================
+# Final Stage
+# This is the original Dockerfile, mostly unmodified.
+# ==============================================================================
FROM $BASE
RUN apt-get update \
@@ -45,7 +100,8 @@ RUN ARCH="$(dpkg --print-architecture)" \
&& printf "user: coder\ngroup: coder\n" > /etc/fixuid/config.yml
COPY ci/release-image/entrypoint.sh /usr/bin/entrypoint.sh
-RUN --mount=from=packages,src=/tmp,dst=/tmp/packages dpkg -i /tmp/packages/code-server*$(dpkg --print-architecture).deb
+# The glob pattern here is simplified since we now know the exact architecture.
+RUN --mount=from=packages,src=/tmp,dst=/tmp/packages dpkg -i /tmp/packages/code-server*.deb
# Allow users to have scripts run on container startup to prepare workspace.
# https://github.com/coder/code-server/issues/5177
@@ -58,4 +114,4 @@ EXPOSE 8080
USER 1000
ENV USER=coder
WORKDIR /home/coder
-ENTRYPOINT ["/usr/bin/entrypoint.sh", "--bind-addr", "0.0.0.0:8080", "."]
+ENTRYPOINT ["/usr/bin/entrypoint.sh", "--bind-addr", "0.0.0.0:8080", "."]
\ No newline at end of file
diff --git a/patches/getting-started.diff b/patches/getting-started.diff
index 98f8a82c60ab..39a7f60379fd 100644
--- a/patches/getting-started.diff
+++ b/patches/getting-started.diff
@@ -29,7 +29,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/welcomeGettingStarted/bro
import { IWebviewElement, IWebviewService } from '../../webview/browser/webview.js';
import './gettingStartedColors.js';
@@ -874,6 +874,72 @@ export class GettingStartedPage extends
- $('p.subtitle.description', {}, localize({ key: 'gettingStarted.editingEvolved', comment: ['Shown as subtitle on the Welcome page.'] }, "Editing evolved"))
+ $('p.subtitle.description', {}, localize({ key: 'gettingStarted.editingEvolved', comment: ['Shown as subtitle on the Welcome page.'] }, "The One-Stop Quantum Platform"))
);
+ let gettingStartedCoder: HTMLElement = $('.header', {});
@@ -39,7 +39,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/welcomeGettingStarted/bro
+ style: 'margin-bottom: 12px',
+ }, 'Next Up'),
+ $('a', {
-+ href: 'https://cdr.co/code-server-to-coder',
++ href: 'https://account.qbraid.com/account-details',
+ target: '_blank',
+ },
+ $('button', {
@@ -57,21 +57,21 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/welcomeGettingStarted/bro
+ 'margin: 0px 0px 6px',
+ 'font-weight: 500',
+ ].join(';'),
-+ }, 'Deploy code-server for your team'),
++ }, 'Run Quantum Jobs with qBraid'),
+ $('p', {
+ style: [
+ 'margin: 0',
+ 'font-size: 13px',
+ 'color: #dcdee2',
+ ].join(';'),
-+ }, 'Provision software development environments on your infrastructure with Coder.'),
++ }, 'Submit quantum programs to 24+ devices using the qBraid-SDK.'),
+ $('p', {
+ style: [
+ 'margin-top: 8px',
+ 'font-size: 13px',
+ 'color: #dcdee2',
+ ].join(';'),
-+ }, 'Coder is a self-service portal which provisions via Terraform—Linux, macOS, Windows, x86, ARM, and, of course, Kubernetes based infrastructure.'),
++ }, 'Access QPUs from QuEra, IQM, IonQ, OQC, and Rigetti, along with on-demand simulators from qBraid, AWS, IonQ, and more.'),
+ $('p', {
+ style: [
+ 'margin: 0',
@@ -80,7 +80,7 @@ Index: code-server/lib/vscode/src/vs/workbench/contrib/welcomeGettingStarted/bro
+ 'display: flex',
+ 'align-items: center',
+ ].join(';'),
-+ }, 'Get started ', $('span', {
++ }, 'Get credits', $('span', {
+ class: ThemeIcon.asClassName(Codicon.arrowRight),
+ style: [
+ 'color: white',
diff --git a/src/browser/media/favicon-dark-support.svg b/src/browser/media/favicon-dark-support.svg
index 06f1fa00d62c..43b89611afdf 100644
--- a/src/browser/media/favicon-dark-support.svg
+++ b/src/browser/media/favicon-dark-support.svg
@@ -1,7 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/browser/media/favicon.ico b/src/browser/media/favicon.ico
index e721447bd9d1..1c330b571648 100644
Binary files a/src/browser/media/favicon.ico and b/src/browser/media/favicon.ico differ
diff --git a/src/browser/media/favicon.svg b/src/browser/media/favicon.svg
deleted file mode 100644
index 45388729b6b4..000000000000
--- a/src/browser/media/favicon.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/browser/media/pwa-icon-192.png b/src/browser/media/pwa-icon-192.png
index a6ee503115d8..974dd3c5d949 100644
Binary files a/src/browser/media/pwa-icon-192.png and b/src/browser/media/pwa-icon-192.png differ
diff --git a/src/browser/media/pwa-icon-512.png b/src/browser/media/pwa-icon-512.png
index ff42978ce9a5..658d26708677 100644
Binary files a/src/browser/media/pwa-icon-512.png and b/src/browser/media/pwa-icon-512.png differ
diff --git a/src/browser/media/pwa-icon.png b/src/browser/media/pwa-icon.png
index d4f5188ffc0c..658d26708677 100644
Binary files a/src/browser/media/pwa-icon.png and b/src/browser/media/pwa-icon.png differ
diff --git a/src/browser/media/templates.png b/src/browser/media/templates.png
index 1437658ec13a..2c5c5889ee24 100644
Binary files a/src/browser/media/templates.png and b/src/browser/media/templates.png differ