A personal journal for pistol shooting

Your next shot.
A better memory.

From a quick series at the range to a season of progress. Keep your sessions, target photos and personal achievements together in your own MyShotLog.

No coding required for the setup below. A browser is enough.

  • Made for the range
  • Your own installation
  • Swedish & English
Saturday · 10 OctoberPrecision

A good day at the range

Example range

Latest series

46points

Precision pistol · .22 LR

Illustration · fictional recordsSmall details. A clearer picture.

Less to remember. More to learn.

A place for every session.

Log it while it is fresh

Use the mobile quick-entry form at the range. Connect your series to a session later.

See your progress

Follow sessions, shot counts and personal bronze, silver and gold series for supported disciplines.

Keep the target, too

Attach a target photo. MyShotLog reduces its size in your browser and opens it in a simple photo overlay.

Make it your journal

Keep firearms, calibers and locations handy. Choose Swedish or English in your profile.

Your records, with history

A private GitHub repository stores the journal. Entries have Git history, and JSON export lets you move your data.

Rules for that session

Assessments use the rules for the session date and the birth information recorded with the series.

MyShotLog is for personal tracking. Its medal indicators are not official certificates. Automatic assessments cover precision and application shooting; other disciplines can still be recorded.

Three pieces. One journal that is yours.

You will create these under your own accounts. Keeping the app and your records separate is the most important part of the setup.

PUBLIC CODE

Your app copy

A public fork on GitHub holds the application code. No journal records or secrets belong here.

PRIVATE DATA

Your private journal

A separate private GitHub repository holds your records and target photos.

YOUR VERCEL PROJECT

Your website address

Vercel runs the app and stores its private connection settings. You open this address to use MyShotLog.

From zero to your first session

Let’s set up your MyShotLog.

Start with step 1 if GitHub is new to you. Keep this guide open in one tab and follow the links in another. Take your time; each step ends with something you can check.

Before you begin

  • A computer or tablet with a browser and access to your email.
  • A phone with an authenticator app, plus a password manager or another safe place for recovery codes and private setup values.
  • Personal GitHub and Vercel accounts. The guide helps you create them. Check each provider’s current plans and limits; this is not a promise of free hosting forever.

This page is instructions only. Never enter a password, token or recovery code here. The language choice and completed-step checklist stay in your browser.

01

Create your GitHub account

GitHub will hold the app code and your private journal in two different repositories.

  1. Open github.com/signup. Use an email address you can access, choose a username and create a unique password. Save it in your password manager.
  2. Complete GitHub’s verification prompts, then open the email from GitHub and verify your email address. A personal free account is enough to follow this guide.
  3. Sign in at github.com. Use the profile picture at the top right to find your profile and settings. Keep your username handy; you will need it later.

You can sign in to GitHub and your email is verified.

02

Secure the account before going further

Two-factor authentication asks for a second proof when you sign in.

  1. Open your profile picture → Settings → Password and authentication. Find Two-factor authentication and choose to enable it.
  2. Use an authenticator app on your phone. Follow GitHub’s QR-code prompts, enter the code from the app and finish the setup.
  3. Download the recovery codes when prompted. Store them somewhere safe that you can access without this phone; never put them in a repository.
  4. If your device supports it, add a passkey as another sign-in method after enabling 2FA. Keep a recovery option as well.
  5. Protect the email account you use for GitHub, too. Try signing out and back in once so you know your login and second factor work.

Two-factor authentication is enabled and recovery codes are safely saved.

03

Make your own copy of MyShotLog

A fork is the app’s public code copied into your GitHub account.

  1. Open github.com/aawse/myshotlog and click Fork near the top of the page.
  2. Choose your personal account as the owner. Keep the repository name myshotlog, keep the main branch and create the fork.
  3. Check the page address: it should now be github.com/YOUR-USERNAME/myshotlog. This is the code repository you will import into Vercel.
  4. This fork is public because the original is public. That is fine for code. Do not add journal exports, target photos, tokens or passwords to it.

Your own public code fork exists, with your username in its address.

04

Create a separate private journal repository

Your journal must not be stored in the public code fork.

  1. On GitHub, use the + menu → New repository. Choose your personal account as the owner.
  2. Name this second repository myshotlog-data. Choose Private. Select Add a README so the main branch exists, then create the repository.
  3. Look for the Private label on the repository page. Keep this repo private and avoid adding collaborators unless you deliberately want to share the full data history.
  4. Write down the owner/name and branch, for example YOUR-USERNAME/myshotlog-data and main. Do not use the code fork’s name here.

You have two repos: public myshotlog for code and private myshotlog-data for records.

05

Give the app a key to the private journal

This key is a fine-grained personal access token. It is not your GitHub password.

  1. Open GitHub Settings → Developer settings → Personal access tokens → Fine-grained tokens. Choose Generate new token.
  2. Name it MyShotLog journal and choose a sensible expiration date. Set a reminder to replace the token before that date.
  3. Select your personal account as resource owner. Under Repository access, choose Only select repositories, then select only myshotlog-data.
  4. Under Repository permissions, set Contents to Read and write. Leave the automatically required metadata access and do not add unrelated permissions.
  5. Generate the token. Copy it once into a safe password-manager entry; GitHub will not show it again. In step 9 it goes into GIT_DATABASE_TOKEN on Vercel.
  6. Keep the token out of your code fork, screenshots and messages. If it is exposed, revoke it on GitHub and make a replacement.

One unexpired token can read and write only your private data repository.

06

Create your Vercel account and app project

Vercel gives your MyShotLog a website address.

  1. Open vercel.com/signup and continue with your GitHub account. For personal, non-commercial use, review the Hobby option and its limits.
  2. In your Vercel account settings, enable two-factor authentication and save the recovery codes. Follow Vercel’s own prompts.
  3. From the Vercel dashboard, choose Add New → Project. Connect GitHub if asked. Grant the integration access to your myshotlog code fork; the journal repo is connected later through its token.
  4. Import YOUR-USERNAME/myshotlog, not myshotlog-data. Use Next.js as the framework, the repository root as Root Directory and Node.js 24.x. Leave the app’s normal build settings in place.
  5. Deploy once without the private variables. Seeing the app’s setup screen at this stage is normal.
  6. Open the project’s Domains settings and note the stable production domain, such as YOUR-PROJECT.vercel.app. Use that address throughout the remaining steps, not a one-off preview deployment URL.

A Vercel project runs your code fork and you know its stable HTTPS production address.

07

Find your numeric GitHub user ID

The app allows access by a fixed account number, not by a changeable username.

  1. Open a new tab at https://api.github.com/users/YOUR-USERNAME, replacing YOUR-USERNAME with your GitHub username.
  2. The page shows text with field names. Find login and html_url to confirm it is your profile, then check type is User.
  3. Copy the number beside id. Do not copy node_id, your username or the whole page. The number is not a password, but you do not need to post it publicly.
  4. Keep it for GITHUB_ALLOWED_USER_IDS in step 9. For your personal installation, enter only your own number.
https://api.github.com/users/YOUR-USERNAME

You have the numeric id for your own GitHub user account.

08

Register the GitHub login connection

An OAuth app is a login connection. It is different from the token that accesses your journal.

  1. Open GitHub Settings → Developer settings → OAuth Apps → New OAuth App. Make sure you are creating an OAuth App, not a GitHub App.
  2. For the application name, use MyShotLog personal. For Homepage URL, enter your stable HTTPS production origin from step 6, for example https://YOUR-PROJECT.vercel.app.
  3. For Authorization callback URL, use the same origin followed by /auth/github/callback/. Keep the final slash. Register the application.
  4. Copy the Client ID. Generate a new client secret and save it privately in your password manager.
  5. In step 9 these go into GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET. Keep the secret private. This login connection does not need access to all your repositories.
https://YOUR-PROJECT.vercel.app/auth/github/callback/

The OAuth app uses your exact production domain and a callback ending in /auth/github/callback/.

09

Add the settings and redeploy

You now have everything needed to connect the app, the journal and your login.

  1. In Vercel, open your MyShotLog app project → Settings → Environment Variables. Use the table below to add each name and value.
  2. For each entry, choose Production. Use your own values instead of the uppercase placeholders. Do not include quotation marks or extra spaces around values.
  3. Use a password manager to generate a separate random secret of at least 64 letters and numbers for AUTH_SESSION_SECRET. Do not reuse your GitHub password or either GitHub secret.
  4. Enable Sensitive for GIT_DATABASE_TOKEN, GITHUB_CLIENT_SECRET and AUTH_SESSION_SECRET. Keep all three private. The other values still belong in Vercel settings, not in a new public configuration file.
  5. Check NEXT_PUBLIC_SITE_URL: it is only https:// plus the stable domain, with no extra path, query or trailing slash. The OAuth callback has a path and a final slash; the origin variable does not.
  6. Open Deployments and redeploy the current production deployment after saving the variables. Wait for Ready. Changes apply to a new deployment, not to the old one.
  7. Open the stable production address again. You should now see the GitHub sign-in option instead of incomplete setup instructions.

The values your app needs

Add these to the MyShotLog app project in Vercel, not to this instruction website. Copy a variable name exactly, then enter your own value in Vercel. Every example below is a placeholder.

GIT_DATABASE_PROVIDER
Standard valuegithub

Use the GitHub adapter.

GIT_DATABASE_REPOSITORY
Your valueYOUR-USERNAME/myshotlog-data

The private repo from step 4; owner and name separated by /.

GIT_DATABASE_BRANCH
Standard valuemain

The branch in your private data repo.

GIT_DATABASE_PREFIX
Standard valuemyshotlog/v1

Keep this standard path for a new installation.

GIT_DATABASE_TOKEN
Private valueYOUR_PRIVATE_DATA_TOKEN

Fine-grained token from step 5.

GIT_DATABASE_API_URL
Standard valuehttps://api.github.com

GitHub.com API address.

GITHUB_CLIENT_ID
Your valueYOUR_OAUTH_CLIENT_ID

Client ID from step 8.

GITHUB_CLIENT_SECRET
Private valueYOUR_PRIVATE_OAUTH_SECRET

Client secret from step 8.

GITHUB_ALLOWED_USER_IDS
Your valueYOUR_NUMERIC_GITHUB_ID

Your numeric id from step 7.

AUTH_SESSION_SECRET
Private valueYOUR_NEW_RANDOM_SESSION_SECRET

A separate random secret of at least 64 letters and numbers.

NEXT_PUBLIC_SITE_URL
Your valuehttps://YOUR-PROJECT.vercel.app

The stable production origin, without a path or final slash.

Select Production for this first installation. Enable Sensitive for the database token, OAuth client secret and session secret. Do not rename any key or add NEXT_PUBLIC_ to a secret. Never put these values in a GitHub file, issue, screenshot or chat.

The production deployment is Ready and all required settings are filled in.

10

Sign in and record your first session

This is the point where you use your own journal website.

  1. At your stable production address, choose Sign in with GitHub. Check that the GitHub authorization screen identifies your own OAuth app and approve the login.
  2. If you have a MyShotLog JSON backup, import it from the empty dashboard or Settings before saving a new profile. Otherwise start a new journal.
  3. Open Settings. Choose the app’s language and optionally add your birth date. Save the profile. The date can be used for age-based assessments; it stays in your private journal.
  4. Add a firearm if you want, then create a session with its date, location, sport, distance, target and shooting time. Record a series and save.
  5. Check that the session appears in the list. Try a target photo and a JSON export. Sign out and sign back in once to check the complete flow.

You can sign in, save a session and export your own journal.

11

Keep your installation healthy

A few small habits protect the journal you have just set up.

  1. Export a JSON backup from MyShotLog Settings regularly and before updates. Keep backups private. CSV is for spreadsheets, not a full restore.
  2. Before the GitHub token expires, generate a replacement with the same narrow permissions, update GIT_DATABASE_TOKEN in Vercel and redeploy. Revoke the old token after checking the replacement.
  3. For app updates, open your code fork on GitHub and use Sync fork. Review changes, then let Vercel deploy the updated production branch. Avoid changing the data repository or its prefix during an update.
  4. Check provider usage and current plan limits occasionally. You manage your own accounts and installation; the code author does not receive your records.
  5. Removing a record in the app does not remove old versions from Git history or existing backups. Protect the whole repository history as well as the current files.
  6. If a secret leaks, revoke or rotate it, update Vercel and redeploy. Rotating AUTH_SESSION_SECRET signs everyone out. Do not post secret values when asking for help.

You have a private backup and a reminder before your journal token expires.

A few words, in plain language

Repository (repo)
A folder of files on GitHub, with a history of changes.
Fork
Your own copy of the app repository, under your GitHub account.
Deployment
A built version of the app that Vercel puts online.
Environment variable
A named setting in Vercel. It connects the app to your private records and login.
Token / client secret
A private key for a service connection. Treat it like a password.
OAuth app
The GitHub login connection you register for your own MyShotLog website.

If something does not look right

A few common fixes.

Vercel cannot see my fork

Check that the fork is owned by your personal GitHub account. In the Vercel GitHub integration, grant access to that code repository, then try importing again. Do not import the data repository.

The first deployment shows setup instructions

That is expected before step 9. Complete the variables in Vercel and redeploy. If it remains, check exact names and whether all required values were added to Production.

GitHub login fails or access is denied

Check your numeric user ID, the Client ID and Client secret, and the OAuth callback address. The callback must be the production origin followed by /auth/github/callback/.

Redirects repeat endlessly

Use one stable production domain and keep the app’s trailing-slash settings in next.config.ts and vercel.json aligned. Both should be true. The callback ends with a slash.

Records will not load or save

Check that the data repository is private, owner/repo and branch are correct, and the fine-grained token is unexpired with Contents read/write access to that repository. Do not change an existing prefix to try to fix an error.

Vercel blocks the deployment author

For a Hobby project, a commit may need to come from the Vercel account owner. In your own fork, edit README.md with a harmless sentence, commit using GitHub’s editor, then retry. Never add secret values to this file.

I changed a setting, but nothing changed

Changing Vercel variables does not alter an existing deployment. Redeploy the production branch, then open the stable production domain again.

Read the full app setup reference

Before you get started.

Do I need to know how to code?

No. This guide uses GitHub and Vercel in your browser. You will copy names and your own private setup values into the right places. Ask someone you trust to help if you get stuck, without sharing passwords or tokens.

Where will my shooting records live?

In the separate private data repository you create. Your Vercel app accesses it using a repository-scoped token. People with access to that repo can read its history; keep its membership limited.

Will this website store my records?

No. It has no account, record upload or secret entry form. The language preference and checklist are saved in your browser. Vercel Web Analytics and Speed Insights measure visits and browser performance on this public guide; query strings and fragments are excluded from reported page URLs. Your own MyShotLog installation is separate.

Does it cost anything?

The guide uses personal accounts and can fit within provider free plans for small, non-commercial use. Limits and eligibility apply. Check GitHub and Vercel before choosing a plan, and monitor usage. No paid plan or custom domain is required by this guide.

Can I take my data with me?

Yes. Export a MyShotLog JSON backup from Settings. CSV is useful for spreadsheets but is not a full restore. A JSON import applies the rules for each session date.

How do I get app updates?

Use Sync fork on GitHub to bring upstream changes into your code fork. Review the changes first and keep a data export. Vercel deploys the code update; your separate data repository stays separate.