Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
b7c9cc1
Task start baseline checkpoint for code review
Erfan-Ahmadi Apr 28, 2026
7e00dc6
Migrate DevSH Graphics Programming website from Next.js to Vite + React
Erfan-Ahmadi Apr 28, 2026
6496732
Migrate DevSH Graphics Programming website from Next.js to Vite + React
Erfan-Ahmadi Apr 28, 2026
18c1c30
Restore original Next.js project structure (undo Vite port)
Erfan-Ahmadi Apr 28, 2026
1a891d3
Clean up leftover files from previous migration attempts
Erfan-Ahmadi Apr 28, 2026
ff614c0
Add a prominent hero section and expertise grid to the homepage
Erfan-Ahmadi Apr 28, 2026
c6473a7
Adjust layout to fit all content on screen without scrolling
Erfan-Ahmadi Apr 28, 2026
0a11c5a
Improve website layout and call to action button size
Erfan-Ahmadi Apr 28, 2026
d65443c
Update expertise cards with placeholder images and new text
Erfan-Ahmadi Apr 28, 2026
d1243b4
Add image placeholders to expertise grid items
Erfan-Ahmadi Apr 29, 2026
7c42107
Update the website to showcase company expertise and projects
Erfan-Ahmadi Apr 29, 2026
518e7b6
Update expertise cards to be square and improve hover effects
Erfan-Ahmadi Apr 29, 2026
410ebbe
Add partner logos and update project details to show real company data
Erfan-Ahmadi Apr 29, 2026
16254a5
Make project company names larger and logos fully colored by default
Erfan-Ahmadi Apr 29, 2026
62e863c
Add a presentations page and link to watch past videos
Erfan-Ahmadi Apr 29, 2026
39e0743
Organize presentation videos by event with links
Erfan-Ahmadi Apr 29, 2026
c94439b
Update website content and navigation for presentations and blog
Erfan-Ahmadi Apr 29, 2026
b6db3b4
Increase button size and spacing in the ecosystem section
Erfan-Ahmadi Apr 29, 2026
a9f2cf6
Improve visual feedback and interaction on expertise cards
Erfan-Ahmadi Apr 29, 2026
da3a966
Adjust page scrolling to prevent overlapping content
Erfan-Ahmadi Apr 29, 2026
f77b5ed
Update Nabla section with new layout and interactive slideshow
Erfan-Ahmadi Apr 29, 2026
d9b6ce5
Rearrange Nabla section to place SVG under title and subtitle
Erfan-Ahmadi Apr 29, 2026
aa65e0b
nabla glow svg
Erfan-Ahmadi Apr 29, 2026
98911c5
Update ecosystem section with new event photos and captions
Erfan-Ahmadi Apr 29, 2026
040427f
Update event photos to display correct images and captions
Erfan-Ahmadi Apr 29, 2026
91eb27c
more nabla pictured
Erfan-Ahmadi Apr 29, 2026
75f047d
Merge remote-tracking branch 'origin/master'
Erfan-Ahmadi Apr 29, 2026
342ba2e
Update Nabla section with new graphics and placeholder for missing files
Erfan-Ahmadi Apr 29, 2026
0a89969
n4ce images
Erfan-Ahmadi Apr 29, 2026
e85e19e
Merge remote-tracking branch 'origin/master'
Erfan-Ahmadi Apr 29, 2026
f1b77c8
Update images for Nabla section slides to latest versions
Erfan-Ahmadi Apr 29, 2026
2a365d8
Improve text visibility and background in the gallery's Nabla section
Erfan-Ahmadi Apr 29, 2026
704d9a8
Increase size of text and background in gallery captions
Erfan-Ahmadi Apr 29, 2026
9cf939e
Update project images and aspect ratios for better display
Erfan-Ahmadi Apr 29, 2026
a6a9b70
Update project images and aspect ratio handling for visual appeal
Erfan-Ahmadi Apr 29, 2026
8a7685f
Update project details to showcase graphics engine performance improv…
Erfan-Ahmadi Apr 29, 2026
799c876
Improve image display for projects with few images
Erfan-Ahmadi Apr 29, 2026
a7cf907
Make images under Cadd 30% smaller by constraining their width
Erfan-Ahmadi Apr 29, 2026
4ded72a
Add unique image layout for project displays with custom arrangements
Erfan-Ahmadi Apr 29, 2026
56baba9
Update project entries to display images and text more effectively
Erfan-Ahmadi Apr 29, 2026
bd49fde
Update expertise links to jump to specific project sections
Erfan-Ahmadi Apr 29, 2026
4dad343
Update project links to use unique keys for better component stability
Erfan-Ahmadi Apr 29, 2026
6cfa7cf
Add relevant client images to expertise cards
Erfan-Ahmadi Apr 29, 2026
a3f4d1d
Make expertise card text larger and centered
Erfan-Ahmadi Apr 29, 2026
d697e0a
Improve text readability on expertise cards with darker overlays
Erfan-Ahmadi Apr 29, 2026
aebf27d
drawings
Erfan-Ahmadi Apr 29, 2026
339e333
new image
Erfan-Ahmadi Apr 29, 2026
132a15f
Update expertise images to use specific client assets
Erfan-Ahmadi Apr 29, 2026
de94951
Make expertise text less bold and improve readability
Erfan-Ahmadi Apr 29, 2026
a678698
Rearrange projects and remove a partner from the trusted by section
Erfan-Ahmadi Apr 29, 2026
062410e
Fix website build and CI workflow
AnastaZIuk Apr 30, 2026
8efe891
Refine website presentation
AnastaZIuk Apr 30, 2026
a3c8940
Tighten responsive presentation
AnastaZIuk Apr 30, 2026
085d604
small cleanups
Erfan-Ahmadi May 4, 2026
a4682c5
Partners and Testimonial Section
Erfan-Ahmadi May 5, 2026
9059f1b
Expertise and Partners Improve + add Presentations to navbar
Erfan-Ahmadi May 7, 2026
7c0d872
Phil's profile picture
Erfan-Ahmadi May 7, 2026
0d797d6
testimonial with company logo and justified text
Erfan-Ahmadi May 7, 2026
f7e779c
Better Texts
Erfan-Ahmadi May 7, 2026
e7f126a
Nabla improve slideshow component
Erfan-Ahmadi May 7, 2026
3ac4550
Nabla Section, more showcase images in slideshow
Erfan-Ahmadi May 7, 2026
b86cc79
Apply Suggestions and fixes
Erfan-Ahmadi May 7, 2026
1ffa346
wild/factions logo and link
Erfan-Ahmadi May 7, 2026
0daa932
wild and ditt
Erfan-Ahmadi May 8, 2026
42eea63
expertise card mini slideshow
Erfan-Ahmadi May 8, 2026
3236889
better projects and testimonial section
Erfan-Ahmadi May 8, 2026
e76cec8
nabla section improvement. touch scroll slideshow on phone
Erfan-Ahmadi May 8, 2026
3c2d906
lots of edits
Erfan-Ahmadi May 8, 2026
f46ca30
Improvements
Erfan-Ahmadi May 8, 2026
af40fe6
Improve services page
Erfan-Ahmadi May 8, 2026
1452ab2
cleanups and services page
Erfan-Ahmadi May 11, 2026
fa4afa5
cleanups and services page
Erfan-Ahmadi May 11, 2026
ddd8a7d
about improvements
Erfan-Ahmadi May 12, 2026
a11392d
About DevSH -> Who We Are
Erfan-Ahmadi May 12, 2026
3bdcfaf
Fix JSX entity lint errors
AnastaZIuk May 12, 2026
5410853
About and content improvements
Erfan-Ahmadi May 12, 2026
ffc4a93
About and content improvements
Erfan-Ahmadi May 12, 2026
b8e4b98
gpu accelerated
Erfan-Ahmadi May 12, 2026
a9279e7
about
Erfan-Ahmadi May 12, 2026
3c2a42f
Clean up website presentation
AnastaZIuk May 12, 2026
4cef91f
Update workflow actions
AnastaZIuk May 12, 2026
15c17d6
Quiet workflow checkout hints
AnastaZIuk May 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ node_modules
.next
out
dist
tmp
npm-debug.log
.npmrc
.git
Expand Down
87 changes: 66 additions & 21 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ concurrency:

on:
push:
branches: [master]
tags: ["v*"]
branches: ["**"]
pull_request:
workflow_dispatch:

Expand All @@ -20,11 +19,13 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Configure Git default branch
run: git config --global init.defaultBranch master

- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Compute image name (lowercase owner/repo)
id: img
Expand All @@ -34,39 +35,42 @@ jobs:
IMAGE_NAME="${IMAGE_NAME:-$REPO_NAME}"
IMAGE_NAME="$(echo "${IMAGE_NAME}" | tr '[:upper:]' '[:lower:]')"
echo "IMAGE=${REGISTRY}/${OWNER}/${IMAGE_NAME}" >> "$GITHUB_ENV"
echo "Image namespace: ${REGISTRY}/${OWNER}/${IMAGE_NAME}"

- name: Docker metadata
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@v6
with:
images: ${{ env.IMAGE }}
tags: |
type=sha
type=ref,event=tag
type=ref,event=branch,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }}

- name: Set up Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Build image for tests
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: .
file: ./Dockerfile
push: false
load: true
tags: ${{ env.IMAGE }}:ci
tags: |
${{ env.IMAGE }}:ci
${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
cache-to: type=gha,mode=max,ignore-error=true

- name: Run smoke test (curl /)
- name: Run smoke test
env:
IMAGE_UNDER_TEST: ${{ env.IMAGE }}:ci
run: |
set -euo pipefail
cid=$(docker run -d -p 0:3000 "$IMAGE_UNDER_TEST")
trap "docker rm -f $cid >/dev/null 2>&1" EXIT
trap 'docker rm -f "$cid" >/dev/null 2>&1' EXIT
port=$(docker inspect -f '{{ (index (index .NetworkSettings.Ports "3000/tcp") 0).HostPort }}' "$cid")
if [ -z "$port" ]; then
echo "Failed to resolve mapped port for container $cid" >&2
Expand All @@ -75,31 +79,72 @@ jobs:
fi
for i in {1..20}; do
if curl -fsS "http://127.0.0.1:${port}/" > /dev/null; then
exit 0
break
fi
if [ "$i" -eq 20 ]; then
echo "Service did not respond on / after 20s" >&2
docker logs "$cid" || true
exit 1
fi
sleep 1
done
echo "Service did not respond on / after 20s" >&2
docker logs "$cid" || true
exit 1
for path in / /about /services /nabla /presentations /healthz; do
curl -fsS "http://127.0.0.1:${port}${path}" > /dev/null
done

publish:
needs: build
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Configure Git default branch
run: git config --global init.defaultBranch master

- name: Checkout
uses: actions/checkout@v6

- name: Compute image name (lowercase owner/repo)
id: img
run: |
OWNER="$(echo "${GITHUB_REPOSITORY_OWNER}" | tr '[:upper:]' '[:lower:]')"
REPO_NAME="${GITHUB_REPOSITORY##*/}"
IMAGE_NAME="${IMAGE_NAME:-$REPO_NAME}"
IMAGE_NAME="$(echo "${IMAGE_NAME}" | tr '[:upper:]' '[:lower:]')"
echo "IMAGE=${REGISTRY}/${OWNER}/${IMAGE_NAME}" >> "$GITHUB_ENV"
echo "Image namespace: ${REGISTRY}/${OWNER}/${IMAGE_NAME}"

- name: Docker metadata
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.IMAGE }}
tags: |
type=sha
type=ref,event=branch
type=raw,value=latest

- name: Set up Buildx
uses: docker/setup-buildx-action@v4

- name: Log in to GHCR
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/master') || startsWith(github.ref, 'refs/tags/'))
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
# Prefer CR_PAT if provided (for cross-repo scopes); fallback to GITHUB_TOKEN
password: ${{ secrets.CR_PAT != '' && secrets.CR_PAT || secrets.GITHUB_TOKEN }}

- name: Build and push
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/master') || startsWith(github.ref, 'refs/tags/'))
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
cache-to: type=gha,mode=max,ignore-error=true
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,8 @@ yarn-error.log*
next-env.d.ts

# updating user ssh dir
.ssh
.ssh

# Transient cleanup
.old_nm_trash*
tmp/
2 changes: 2 additions & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
auto-install-peers=false
strict-peer-dependencies=false
6 changes: 6 additions & 0 deletions Caddyfile.site
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
:3000 {
root * /srv
respond /healthz 200
try_files {path} {path}.html {path}/index.html
file_server
}
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
FROM node:22-alpine AS build
WORKDIR /app

ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1
ENV NEXT_TELEMETRY_DISABLED=1

RUN apk add --no-cache libc6-compat

Expand All @@ -20,7 +19,8 @@ WORKDIR /srv
RUN addgroup -S caddy && adduser -S caddy -G caddy

COPY --from=build --chown=caddy:caddy /app/out ./
COPY --chown=caddy:caddy Caddyfile.site /etc/caddy/Caddyfile

EXPOSE 3000
USER caddy
ENTRYPOINT ["caddy", "file-server", "--root=/srv", "--listen=:3000"]
ENTRYPOINT ["caddy", "run", "--config=/etc/caddy/Caddyfile"]
97 changes: 10 additions & 87 deletions app/about/page.tsx
Original file line number Diff line number Diff line change
@@ -1,96 +1,19 @@
import Link from "next/link"
import Image, { StaticImageData } from "next/image";
import { Paragraph, Chapter } from "../components/TextUtils"
import ContactEmail from "./ContactEmail"

import vulkanised2026_01 from "@/public/vulkanised_photos/2026/2026_01.jpg";
import vulkanised2026_02 from "@/public/vulkanised_photos/2026/2026_02.jpg";
import vulkanised2026_03 from "@/public/vulkanised_photos/2026/2026_03.jpg";
import vulkanised2026_04 from "@/public/vulkanised_photos/2026/2026_04.jpg";
import vulkanised2026_06 from "@/public/vulkanised_photos/2026/2026_06.jpg";
import vulkanised2026_07 from "@/public/vulkanised_photos/2026/2026_07.jpg";
import vulkanised2026_08 from "@/public/vulkanised_photos/2026/2026_08.jpg";
import vulkanised2026_09 from "@/public/vulkanised_photos/2026/2026_09.jpg";
import vulkanised2023_1 from "@/public/vulkanised_photos/2023/2023_1.jpg";
import vulkanised2023_2 from "@/public/vulkanised_photos/2023/2023_2.jpg";
import vulkanised2024_1 from "@/public/vulkanised_photos/2024/2024_1.jpg";
import vulkanised2024_2 from "@/public/vulkanised_photos/2024/2024_2.jpg";

const vulkanisedPhotos: { src: StaticImageData; alt: string }[] = [
{ src: vulkanised2026_01, alt: "Vulkanised 2026 photo 1" },
{ src: vulkanised2026_02, alt: "Vulkanised 2026 photo 2" },
{ src: vulkanised2026_04, alt: "Vulkanised 2026 photo 4" },
{ src: vulkanised2026_03, alt: "Vulkanised 2026 photo 3" },
{ src: vulkanised2026_06, alt: "Vulkanised 2026 photo 6" },
{ src: vulkanised2026_08, alt: "Vulkanised 2026 photo 8" },
{ src: vulkanised2026_09, alt: "Vulkanised 2026 photo 9" },
{ src: vulkanised2026_07, alt: "Vulkanised 2026 photo 7" },
{ src: vulkanised2023_1, alt: "Vulkanised 2023 photo 1" },
{ src: vulkanised2023_2, alt: "Vulkanised 2023 photo 2" },
{ src: vulkanised2024_1, alt: "Vulkanised 2024 photo 1" },
{ src: vulkanised2024_2, alt: "Vulkanised 2024 photo 2" }
];

function VulkanisedPhoto({ src, alt, priority = false }: { src: StaticImageData | string, alt: string, priority?: boolean }) {
return (
<div className="relative w-[400px] aspect-video overflow-hidden rounded-md bg-neutral-900/70 ring-1 ring-white/5">
<Image
src={src}
alt=""
aria-hidden="true"
fill
sizes="400px"
placeholder="blur"
className="object-cover blur-lg scale-105 opacity-60"
/>
<Image
src={src}
alt={alt}
fill
sizes="400px"
placeholder="blur"
priority={priority}
className="object-contain"
/>
</div>
)
}
import { Paragraph, Chapter } from "../components/TextUtils";
import { aboutParagraphs } from "../data/aboutContent";

export default function Page() {
return (
<main className="container mx-auto max-sm:px-8 flex flex-col gap-4 sm:gap-8 sm:items-center h-full justify-center">
<Chapter title="About Us">
<main className="site-container-narrow section-pad flex flex-col gap-10 sm:gap-14">
<Chapter title="Who We Are">
<Paragraph>
DevSH Graphics Programming Sp. z O.O is a company focused on Graphics, GPU and High Performance Computing. Our consultants develop and maintain Renderers, Simulations and Compilers for our Clients, integrated into or working alongside their teams. We are not a Software House, we work very closely and synergize with our Clients&apos; engineers.
We also conduct our own R&amp;D developing our own Open Source Middleware and Libraries, the most prominent being Nabla, as well as contributing to existing ones.
<br />
<br />
The primary mission for all of our self-funded developments is to advance Open Source ecosystems with innovative tooling with a particular focus on Khronos Standards. We maintain a single source HLSL202x/C++20 Standard Template Header Only Library and our Utility and Rapid Prototyping Framework <Link href="https://github.com/Devsh-Graphics-Programming/Nabla" target="_blank" rel="noopener noreferer" className="no-underline text-teal-600 devsh-link">Nabla</Link> designed {/*this prevents visual bug, "designed must stay here"*/}
to give a CUDA-like programming experience within the Vulkan ecosystem.
<br />
<br />
We have honed the culture of remote work, since the company&apos;s inception, and way before the 2019 paradigm shift. Subject to availability and specific expertise required, our consultants&apos; regular working hours overlap the normal working hours from San Francisco to Sydney.
<br />
<br />
Our alumni have since worked at Intel, Huawei, ARM and Apple as driver and devtech developers and on AAA games.
</Paragraph>

<div className="grid grid-cols-1 lg:grid-cols-2 my-4 gap-4">
{vulkanisedPhotos.map((photo, index) => (
<VulkanisedPhoto
key={photo.alt}
src={photo.src}
alt={photo.alt}
priority={index < 4}
/>
{aboutParagraphs.map((paragraph, index) => (
<span key={index}>
{paragraph}
{index < aboutParagraphs.length - 1 && <><br /><br /></>}
</span>
))}
</div>
</Chapter>
<Chapter title="Contact">
<Paragraph>
If you&apos;re interested in our offer, you can reach us at this e-mail address: <ContactEmail/>
</Paragraph>
</Chapter>
</main>
)
);
}
26 changes: 26 additions & 0 deletions app/components/AboutSection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import CTAButton from "./CTAButton";
import { aboutParagraphs } from "../data/aboutContent";

export default function AboutSection() {
return (
<section id="about" className="scroll-mt-24 pb-14 pt-6 sm:pb-20 sm:pt-6 lg:pb-24 lg:pt-6">
<div className="site-container-narrow">
<div className="section-head mb-9 sm:mb-10">
<h2 className="section-heading">Who We Are</h2>
</div>

<div className="flex flex-col gap-5 text-base leading-relaxed text-neutral-300 sm:text-lg">
{aboutParagraphs.map((paragraph, index) => (
<p key={index} className="!m-0">
{paragraph}
</p>
))}
</div>

<div className="mt-10 flex justify-center sm:mt-12">
<CTAButton href="/services" />
</div>
</div>
</section>
);
}
41 changes: 41 additions & 0 deletions app/components/CTAButton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
type Size = "md" | "lg";

export default function CTAButton({
href = "#",
label = "Talk to our experts",
size = "lg",
}: {
href?: string;
label?: string;
size?: Size;
}) {
const sizing =
size === "lg"
? "w-full max-w-64 sm:w-auto sm:min-w-56 px-4 py-2.5 text-sm sm:px-5 sm:text-base"
: "px-4 py-2.5 text-sm sm:px-5 sm:text-base";

return (
<a
href={href}
className={`brand-button group relative inline-flex items-center justify-center gap-3 ${sizing} rounded-md border border-[var(--brand-accent)]/70 bg-black/45 font-semibold text-[var(--brand-accent-bright)] transition-all duration-200 hover:-translate-y-0.5 hover:border-[var(--brand-accent-bright)] active:translate-y-0 focus:outline-none focus:ring-2 focus:ring-[var(--brand-accent-bright)] focus:ring-offset-2 focus:ring-offset-black`}
style={{ background: "linear-gradient(180deg, rgba(125, 205, 185, 0.16), rgba(85, 181, 166, 0.08))" }}
>
<span>{label}</span>
<span className="flex h-7 w-7 items-center justify-center rounded border border-[var(--brand-accent)]/70 bg-[var(--brand-accent)] text-[#031111] transition-transform duration-200 group-hover:translate-x-0.5 group-hover:bg-[var(--brand-accent-bright)]">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth="2.3"
strokeLinecap="round"
strokeLinejoin="round"
className="h-4 w-4"
aria-hidden="true"
>
<path d="M5 12h14M13 5l7 7-7 7" />
</svg>
</span>
</a>
);
}
Loading