Engineer
Full-stack engineer in Copenhagen. TypeScript from the interface to the database.
- React
- Next.js
- TypeScript
- Node.js
- PostgreSQL
- Now
- Product engineer at Trailr AI, an early-stage AI video startup, part-time with equity warrants. I joined as a frontend intern and led the platform's UI/UX redesign, scoped to what the existing backend could support.
- Before
- Four cycles at Millennial Consulting, from Operations Assistant to Operations Manager to Head of Organization, coordinating around five client projects per cycle with no full-time staff.
function atkinson(gray, width, height) {
const px = Float32Array.from(gray);
const out = Buffer.alloc(width * height);
const spread = [
[1, 0], [2, 0],
[-1, 1], [0, 1], [1, 1],
[0, 2],
];
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
const i = y * width + x;
const value = px[i] < 128 ? 0 : 255;
out[i] = value;
const err = (px[i] - value) / 8;
for (const [dx, dy] of spread) {
const nx = x + dx;
const ny = y + dy;
if (nx < 0 || nx >= width || ny >= height) continue;
px[ny * width + nx] += err;
}
}
}
return out;
}The function that drew every picture in this stack. Bill Atkinson's dither, the one MacPaint and HyperCard shipped, running in this site's build script.