SahrulRamadhani29/portfolio

KeJepret

Public source

A sports photography marketplace with face search, watermarked previews, checkout, photographer balances, and withdrawals. My work covers web/API workflows and their integrations.

Campus PBL

A campus project-based learning (PBL) project assessed for semester progression.

Team award

Cohort Best PBL · Year 2

The KeJepret team received the cohort’s Best PBL award for Year 2.

View the team and award photo
Four KeJepret team members posing together with the Best PBL Tingkat 2 award board.
The KeJepret team with the Best PBL Tingkat 2 award. Enlarge photo
Team contributor · furalmiqbadiBackend/APIs, AI and payment integrations, admin panel, and deployment
KeJepret poster showing three original mobile screens: sign-in, marketplace home, and events in a local preview with an empty database.

Find your running moments. Sports event photo collections, face search, and photo purchases connected in one marketplace. Interface preview · local demo with an empty database

Application preview Sign in / Marketplace home / Event listEnlarge

My contribution highlights

Read all 8 contribution modules
Contents · 8 contribution modules

Main workflow

6 steps

Photographers upload event photos; runners find themselves, purchase photos, and receive download access. Admins manage events and balance withdrawals.

  1. 01Prepare photo collections

    1. Events and uploads

      Admin & photographer
    2. Previews and face indexing

      Backend & AI service
  2. 02Find a runner’s photos

    1. Provide a selfie

      Runner
    2. Search and show matches

      Backend & AI service
  3. 03Purchase and download

    1. Checkout and confirmation

      Runner & payment provider
    2. Original photos and sales balance

      Runner, photographer & admin
Process details & branches
  1. Events and uploadsAdmin & photographer

    Admins manage events and photographer verification. Photographers upload photos to the relevant event collection.

  2. Previews and face indexingBackend & AI service

    Photos are stored in R2, previews receive watermarks, and faces are processed through the embedding API for search.

  3. Provide a selfieRunner

    The runner takes a selfie or uploads a file. The backend associates it with the user’s face reference.

  4. Search and show matchesBackend & AI service

    The face is compared with candidate photos. Results are mapped to the app’s collection and stored in search sessions and history.

    Any matching photos?

    • Matches found. The runner reviews watermarked previews and chooses photos to buy.
    • No matches yet. No photo options are returned; the runner can try another selfie.
  5. Checkout and confirmationRunner & payment provider

    Cart items become an order. The backend connects to Pakasir and checks transaction status with the provider.

    Payment confirmed?

    • Confirmed. The order receives download access and sales recording continues.
    • Not confirmed. Download access to paid photos remains locked.
  6. Original photos and sales balanceRunner, photographer & admin

    The runner downloads purchased photos. The photographer views sales and balances and can request a withdrawal for admin processing.

Previews are watermarked. Confirmed payments unlock downloads and feed into photographer balances and sales history.

CASE_STUDY.mdProduct & my contributions

About KeJepret

KeJepret is a sports photography marketplace connecting runners and photographers. Runners can find photos of themselves with a selfie, review previews, purchase photos, and download them. Photographers upload event collections, monitor sales, and request balance withdrawals. Admins manage events, photographer accounts, and platform operations.

Within the KeJepret development team, I worked on the web/API backend, AI and payment service integrations, interface connections, and deployment requirements.

My contributions

Backend structure, database, and role-based access

I designed models, migrations, controllers, and routes for photos, search, carts, orders, downloads, and balances. I connected web workflows with APIs so the same processes could serve application screens and service integrations. Role middleware separates runner, photographer, and admin access according to their activities.

Photo uploads, watermarks, and media storage

I worked on photographer photo uploads, object storage through an S3 adapter to Cloudflare R2, and repeating watermarks on previews. I also connected uploads to embedding API calls so incoming photos could be used in face search. Upload handling and media URL fixes were part of this work.

Selfies, enrollment, and face search

I connected camera input and selfie uploads to runner face enrollment and the face search service. I aligned parameter contracts between Laravel and FastAPI, including runner identities and candidate photo lists. AI results are mapped back to application photos and stored as search sessions and history for users to view.

Carts, checkout, and order details

I built the conversion of cart items into orders, purchase detail storage, and relationships between users, photos, and transactions. In the web workflow, I used database transactions and row-level locking for related operations to keep order status changes and recorded data coordinated.

Payment integration and download access

I integrated Pakasir, checked provider transaction status, and fixed payment status updates in the application. Confirmed payments are linked to permission to download purchased photos. I also fixed download paths and HTTPS usage so photo links work correctly from the user interface.

Photographer balances, sales, and withdrawals

I worked on photographer balance records, sales history, and withdrawal requests. This connects buyer transactions with the information photographers need and the admin withdrawal process. I also added sales notifications and connected them to the photographer interface.

User pages and the admin panel

I connected Blade pages for login/registration, events, profiles, search, carts, and history to application data. In Filament, I worked on resources for photographer management and verification, along with withdrawals. I also improved navigation and mobile layouts in the areas I handled.

Deployment and integration troubleshooting

I added a Dockerfile and startup configuration for hosting. I fixed mixed content, watermark URLs, PHP upload limits, upload processing, and HTTPS downloads. This work coordinates application, media, and server configuration to keep runner and photographer workflows consistent.

The face processing service connected to this platform is described in the related KEJEPRET-AI project.

Fields & core technologies

Project fields

Backend & APIAI EngineeringFull-stack WebComputer VisionData & Databases

Core technologies

LaravelFilamentPostgreSQLFastAPIInsightFacePakasirCloudflare R2Docker

130 commits in the last 12 months

All branches
NovDecJanFebMarAprMayJunJulAugSeptOctNov
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Hover over a square or focus it to see the date.
LessMore
Current streak0 days
Longest streak in this period4 days
Active days in this period8 days
Verified data · updates scheduled hourly.
How it is counted · 1 repo · 5 branch

My authored commits reachable from all remote branches at sync time. Each SHA is counted once, even across branches or forks. Merge commits are excluded. Dates use the author timestamp in Western Indonesia Time (UTC+7), rather than push time. The current streak remains active when the last commit was yesterday and today is still in progress.

This calendar covers commits across all branches. Its totals may differ from GitHub’s contribution calendar, which includes other activity types and follows its own branch rules. This calendar covers only the project you are viewing.

Contribution history

130 of my non-merge commits · All branches · Data as of 3 November 2026.

Public commit examples

Contribution evidence

Back to all projects