Rafat Hossain

Class of 2027, open to new grad roles, any field

CS student, leaning toward ML

Computer science honours student at Dalhousie, graduating May 2027. Co-op developer at SpryPoint, research assistant on Greenland ice segmentation. Looking for new grad roles.

Block diagram of skills: a core connected to Languages, Algorithms, Systems, Web, ML and Product modules. It grows each year of the degree. HELLO, WORLD LANGUAGES ALGORITHMS SYSTEMS WEB ML PRODUCT CORE NOW 10 PROJECTS 3.5 YEARS Block diagram of skills that grows each year of the degree. HELLO, WORLD LANGUAGES ALGORITHMS SYSTEMS WEB ML PRODUCT CORE NOW 10 PROJECTS
At a glance
ProgramBCS (Hons), Dalhousie
GraduatingMay 2027
Based inHalifax, NS
CGPA3.98
About me
  1. 1.

    Co-op developer at SpryPoint Worked on a Scala/Java and Knockout.js billing platform for municipal utilities: bug fixes, configuration pages, forms and tests. About 20 client-facing stories.

  2. 2.

    Research assistant at Dalhousie Worked on U-Net models and patch datasets over Landsat-8 Greenland imagery, plus an Honours study on backdoor attacks in vision models.

  3. 3.

    Treasurer, Dalhousie Machine Learning Society Grants of $1,500+ across two terms for a society of 150+ members.

Timeline

Drag to see my degree year by year; the projects below update to match.

Skills
  • SQL
  • Python
  • PyTorch
  • JavaScript
  • TypeScript
  • React
  • Next.js
  • AWS
  • Java
  • Scala
  • Knockout.js
  • PostgreSQL
  • Docker
  • scikit-learn
  • Ollama
  • Cloudflare Workers

Projects

Eight projects, pulled apart. Hover, tab or tap one to lift it out and read its summary.

Project 01 v1.0.0

Canon film scanners

Two desktop apps that turn a Canon EOS R7 into a film scanner, one over USB at 59.79 fps and one over Wi-Fi at 3.98.

Not started yet.

  • +Two apps for one job: EDSDK at 59.79 fps over USB, CCAPI at 3.98 fps over Wi-Fi, 15x the frame rate.
  • +A double-clickable build of 66 MB with a mock camera, and 250 tests that need neither a camera nor the SDK.
  • +Deflate TIFF positives at 2.4 to 2.6x, verified lossless by reading every pixel back.
  • ~Dropped OpenCV for Pillow, tifffile and numpy, taking the packaged app from 176 MB to 66 MB.
  • ~Stopped reading Canon HEIF as sRGB and read the PQ transfer characteristic out of the file instead.
  • ~Gave the SDK the main thread on macOS, because EdsGetCameraList returns zero cameras from anywhere else.
  • ~Cut fine focus to the SDK minimum of one step by one after the whole-frame metric stopped resolving it.
  • !Corner-by-corner alignment is not built; the per-region sharpness it needs is.
  • !The CCAPI build still previews colour negatives cyan, because its inversion is the first linear flip.
  • !Packaged builds are unsigned, so Gatekeeper blocks them on any other Mac.
Stack Python, NumPy, Canon EDSDK, Canon CCAPI, LibRaw, PyInstaller
View project
Project 02 v1.0.0

SPECTRA-ICA

A team-built EEG artifact remover that strips only artifact-characteristic frequencies during detected events, and beat plain ICA on all 7 P300 metrics.

Not started yet.

  • +Beat standard ICA on all 7 P300 BCI metrics across 10 subjects, Cohen's d = 0.703, a medium effect.
  • +Found 28 more P300 targets and produced 11 fewer false alarms than binary ICA exclusion.
  • +Type-specific event detectors and a per-component spectral weight, with no hardcoded frequency bands.
  • ~Dropped the spectral path for muscle components after it measurably degraded neural preservation.
  • ~Grew the sample benchmark from 6 subjects to the full 10-subject leave-one-person-out result.
  • !The spectral path needs at least 5 STFT frames of artifact; fewer than 5 blinks or heartbeats falls back to broadband.
  • !The Gini quality threshold of 0.05 was never tuned systematically against the full dataset.
  • !One dataset only, so nothing is known about other EEG hardware, electrode layouts or clinical populations.
Stack Python, MNE, scikit-learn, NumPy, ICLabel
View project
Project 03 v0.4.0

CamusGPT

A fine-tuned 12B Camus persona that keeps his biography in a retrieval layer, so a wrong fact is a data bug and not a retrain.

Not started yet.

  • +Shipped a 12B two-pass fine-tune, judged at factuality 4.06 against 3.44 for the 8B build it replaced.
  • +A knowledge base of 13,794 entries holding 109 hand-verified facts, trimmed so those facts surface more often.
  • +34 probes across 10 categories, scored through the real chat pipeline and tracked per commit.
  • +A memory layer, off by default, that fixed a self-reference probe scoring 0 of 5.
  • ~Dropped DPO for a second balanced SFT pass after DPO caused mode collapse.
  • ~Replaced the flat curated boost with BM25 fused into dense, then a cross-encoder reranker.
  • ~Rejected a leaner CORE prompt after a blind A/B: median reply length only moved from 40 words to 38.
  • !Asking for a full list of works is bimodal: it refuses to catalogue in about half of runs.
  • !It still invents titles for posthumous work, and swaps the dogs out for cats.
  • !The public Space is inactive and its code still targets the 8B build.
Stack Python, PyTorch, Ollama, Unsloth, rank-bm25, Gradio
View project
Project 04 v1.0.0

Lumen Gallery

A snap-through feed of the Cleveland Museum of Art's open collection, with docent notes written once and cached for good.

Not started yet.

  • +AI docent notes for $0 a month: cached per artwork, rate limited per IP, capped in the OpenAI dashboard.
  • +Grew the explore pool from 1,000 reachable works to 41,511 by moving off a capped search API.
  • +Lighthouse accessibility 100 and CLS 0, with the first search fired from an inline script before the bundle.
  • ~Moved the whole feed from Chicago to Cleveland in one release after their CDN began 403ing images.
  • ~Fixed a pagination cap nobody had measured: 1,000 records, not the 10,000 the spec assumed.
  • ~Replaced the catalogue grid with a full-screen snap feed, a single-tap lightbox and pinch zoom.
  • !Cleveland publishes no IIIF service, so the fixed web rendition is the only usable image size.
  • !The OpenAI key is live on a keyless public endpoint; the dashboard budget cap is the only backstop.
Stack React 18, Vite 6, Tailwind 4, Cloudflare Pages, Workers KV, OpenAI
View project
Project 05 v0.2.0

Greenland ice segmentation

U-Net segmentation of snow and glacier ice in a Landsat-8 archive over West Greenland, scored against a published ice mask.

Not started yet.

  • +IoU 0.766 for the U-Net against an independent ice mask on 10,318 patches, 3.1x the spectral rule beside it.
  • +40,836 patches and 132 GB across four sets, after re-exporting a winter set that had lost two of its four tiles.
  • +A DL4GAM split script on the official folds, after finding 140 of 239 test glaciers inside the training fold.
  • +A season audit that found August imagery filed as winter across two export sets, and 4,009 duplicate patches.
  • ~Rejected the R/B channel swap: it made the U-Net measurably worse, IoU 0.744 down to 0.619.
  • ~Fixed the nodata rule to reject NaN as well as -9999, which 21.7% of a winter re-export had slipped past.
  • ~Moved the 2015 re-exports into a new folder rather than over the live ones, so nobody read a half-written directory.
  • !About 16% of winter pixels carry reflectance above 1.0, so no winter number can be checked against the ice mask at all.
  • !The 0.520 precision from the refit is provisional: a reflectance filter removes the water half of the denominator.
  • !IoU 0.766 is about 89% of the 0.862 that two independent published ice products agree on between themselves.
Stack Python, U-Net, Google Earth Engine, Landsat 8, NSIDC GIMP
View project
Project 06 v0.5.0

WorkSync

Employee management and payroll app I built on my own: employees log hours on a worksheet, HR forwards the request, admin pays it.

Not started yet.

  • +The payroll path: employees log hours, HR forwards the request, admin marks it paid and the paid rows leave the worksheet.
  • +Sign-in by email, password or Google, plus a server check that signs out anyone whose record says status fired.
  • +Three role views off one login, because the navbar, profile and home page each switch on the userType read from Mongo.
  • +Full CRUD on the worksheet collection, the only one with create, read, update and delete routes.
  • ~Fixed the payment pipeline after a 2025-01-26 commit recorded the database updating while the worksheet entries stayed behind.
  • ~Added the fired-user check at login, one day after the firing system itself landed on 2025-01-19.
  • ~Took the admin option out of the registration form on 2025-01-19, so a signup could not pick its own role.
  • ~Deleted the .env and the Firebase service account key from the server repository on 2025-02-25, after both had been committed.
  • !The hourly rate is a literal 20 inside the amount-owed query, and the employee record has no rate field, so a pay change means a redeploy.
  • !The README claims JWT authentication for role-based access, but the server has no jsonwebtoken dependency and no auth middleware on any route.
  • !Neither repository has a test: the server's test script prints 'no test specified' and exits, and the client package.json has no test script.
Stack React, Express, MongoDB, Firebase Auth, TanStack Table, Vite
View project
Project 07 v0.6.0

DEEBug

A Python debugging platform built with a course team: five locked sections of Keras code, run on a server, scored against a known-good file.

Not started yet.

  • +The five-section editor, with next and previous navigation between sections and a sticky header over them.
  • +Templates for both supervised and unsupervised mode, each section opening on the same starter Keras code.
  • +Template locking: a marker line per section, and Monaco read-only ranges below it, so the harness cannot be edited away.
  • +Per-section saving with a validity check, so an edit that drops a required call is refused instead of overwriting the section.
  • ~Fixed the supervised data preparation step on 2025-03-27, after templating it stopped running.
  • ~Fixed the model definition step in unsupervised mode on 2025-03-27, where the required Dense layers did not match the harness.
  • ~Kept the last valid text per section rather than resetting the whole section, added 2025-03-04 when an invalid edit wiped a stage.
  • ~Rebuilt the editor page around the desktop wireframe, with a sticky header, on 2025-01-30.
  • !The editable ranges are anchored to fixed line numbers, and a comment in CodeTemplates.jsx says so: add an import line and every boundary shifts.
  • !app.py unpacks model, X, Y from generateModel(), which returns a single log filename, so /train_with_logging cannot run as written.
  • !The only test in the repository is the Create React App placeholder in src/App.test.js; none of the Flask routes have one.
Stack React, Flask, TensorFlow, Gemini API, Pyodide, MySQL
View project
Project 08 v0.3.0

LBook

Staff-facing library system built with a team of three: catalog books, track students and loans, and put every page behind a login.

Not started yet.

  • +Eight add and list pages over five tables, every one of them behind a staff login.
  • +Adding a loan wrote the borrowbooks row and set books.status to 1 in the same request.
  • +A dashboard of eight stat tiles and four percentage dials, each tile one query.
  • +A loan list that joins students, borrowbooks and books, so one row shows the student and the book.
  • ~Removed a debug print_r that was left in the tree.
  • ~Replaced the seven per-day shift checkboxes on the employee form with one three-way shift field.
  • ~Took the icons off the list pages.
  • ~Stripped the starter template's redundant comments and reformatted the HTML, CSS and JS, in five commits in January 2025.
  • !Passwords are md5, and checking.php keeps the same hash in the session for the life of the login.
  • !No prepared statements anywhere: the id from ?eid= goes into four SELECTs unescaped, and the list pages delete on a posted id.
  • !The dashboard's Unavailable tile counts books.status = 2, but the book form only writes 0 or 1, so that tile reads zero.
Stack PHP, MySQL, HTML, CSS, JavaScript, Bootstrap
View project

All projects

Every project, not only the featured ones. Rows dim for anything not yet started at the point in the timeline you pick.

No. Project Version Stack Type Status
01 Canon film scanners v1.0.0 Python, NumPy, Canon EDSDK, Canon CCAPI, LibRaw, PyInstaller Systems Stable New Planned
02 SPECTRA-ICA v1.0.0 Python, MNE, scikit-learn, NumPy, ICLabel ML Archived New Planned
03 CamusGPT v0.4.0 Python, PyTorch, Ollama, Unsloth, rank-bm25, Gradio ML In progress New Planned
04 Lumen Gallery v1.0.0 React 18, Vite 6, Tailwind 4, Cloudflare Pages, Workers KV, OpenAI Web In production New Planned
05 lazy-catalog v0.2.0 Python 3.9+, ffprobe, TMDB API, OMDb API, Ollama, launchd Systems In progress New Planned
06 PhotosByRH v1.0.0 Next.js 16, React 19, Tailwind CSS v4, Framer Motion, Vercel Web In production New Planned
07 Greenland ice segmentation v0.2.0 Python, U-Net, Google Earth Engine, Landsat 8, NSIDC GIMP ML In progress New Planned
08 WorkSync v0.5.0 React, Express, MongoDB, Firebase Auth, TanStack Table, Vite Product Archived New Planned
09 DEEBug v0.6.0 React, Flask, TensorFlow, Gemini API, Pyodide, MySQL ML Archived New Planned
10 LBook v0.3.0 PHP, MySQL, HTML, CSS, JavaScript, Bootstrap Web In progress New Planned

Experience

Work, research, leadership, teaching and awards.

No. Dates Role
Software development
D 2026 — present
Software Developer, co-op, SpryPoint Services Inc. Worked on about 20 client-facing stories on SpryCIS, a billing platform for municipal utilities. Invited back for a second term.
3 more outcomes
  • Fixed a 5-point issue on the billing page, spending most of the estimate working out what the change could affect before altering anything.
  • Wrote unit and UI tests, ran regression testing at each sprint close, and reviewed teammates' code.
  • Extended cheque endorsement and receipt-printer configuration with new fields, leaving output unchanged for clients who had not opted in.
A 2023 — 2025
Data Architect / Technician, Knownautoparts Built and maintained a relational product database of 1,000+ automotive SKUs.
2 more outcomes
  • Implemented data quality controls that kept the catalogue accurate.
  • Restructured product categories for search, which lifted organic traffic 35%.
Research
B 2025 — present
Honours directed study (CSCI 4192), Dalhousie University, Faculty of Computer Science Promoted once Reproduced a defocus-blur backdoor on a small CIFAR-10 network: 99.80% attack success, clean accuracy within 0.08% of baseline. Previously Undergraduate Research Assistant.
2 more outcomes
  • Showed the blur is detectable (AUC 1.000 for variance of Laplacian) but its intent is not, and that four established defence families fail against it.
  • Proposed a detector based on the fact that real optical defocus varies with scene depth and the trigger does not.
Leadership and teaching
C 2025 — present
Treasurer, Dalhousie Machine Learning Society Managed the society's grants and budgets: $1,500+ across two terms, for 150+ members.
2 more outcomes
  • Wrote the successful applications to the Dalhousie Student Union and ShiftKey Labs.
  • Manage budgets, invoicing and reconciliation across the academic year.
Hackathons and awards
E 2026
SURGE NeuroHack 2026, 1st place, Machine Learning category Part of the team that built SPECTRA-ICA, an EEG artifact-removal algorithm that beat standard ICA on all 7 metrics of a P300 benchmark.

Certifications

Issuer and year for each one.

No. Certification Issuer Year
C1
AWS Certified Cloud Practitioner
Amazon Web Services 2025
C2
Fundamentals of Cloud Administration with Azure
ShiftKey Labs 2025
C3
Level Up with CCubed (cybersecurity)
Computing Councils of Canada 2025
C4
Practical Cybersecurity
ShiftKey Labs 2025
Academics
CGPA3.98
StandingDean's List
Scholarship Sexton Scholar

Get in touch

Open to new grad roles, any field, starting May 2027; a useful first message names the company, the role and the problem you want solved.

Open to New grad roles, any field
Based in Halifax, NS
(c) 2026 Rafat Hossain