KeJepret
Public sourceA sports photography marketplace with face search, watermarked previews, checkout, photographer balances, and withdrawals. My work covers web/API workflows and their integrations.
A campus project-based learning (PBL) project assessed for semester progression.
Cohort Best PBL · Year 2
The KeJepret team received the cohort’s Best PBL award for Year 2.
View the team and award photo


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
My contribution highlights
- Built photo uploads, repeating watermarked previews, R2 storage, and photo embedding API calls.
- Connected camera/selfie uploads, enrollment, face search, photo result mapping, and search sessions and history.
- Integrated Pakasir, payment status checks, order updates, and download permissions for purchased photos.
Contents · 8 contribution modules
Main workflow
6 stepsPhotographers upload event photos; runners find themselves, purchase photos, and receive download access. Admins manage events and balance withdrawals.
01Prepare photo collections
Events and uploads
Admin & photographerPreviews and face indexing
Backend & AI service
02Find a runner’s photos
Provide a selfie
RunnerSearch and show matches
Backend & AI service
03Purchase and download
Checkout and confirmation
Runner & payment providerOriginal photos and sales balance
Runner, photographer & admin
Process details & branches
Events and uploadsAdmin & photographer
Admins manage events and photographer verification. Photographers upload photos to the relevant event collection.
Previews and face indexingBackend & AI service
Photos are stored in R2, previews receive watermarks, and faces are processed through the embedding API for search.
Provide a selfieRunner
The runner takes a selfie or uploads a file. The backend associates it with the user’s face reference.
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.
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.
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.
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
Core technologies
130 commits in the last 12 months
All branches| Nov | Dec | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sept | Oct | Nov | |||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sunday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Monday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Tuesday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Wednesday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Thursday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Friday | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Saturday |
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.