Skip to content

apeskinian/project_lander

Repository files navigation

GitHub commit activity GitHub last commit GitHub repo size

A simple and elegant landing zone picker for your next Fortnite Battle Royale!

Tired of the same drop spots? Debating with your squad about where to land? Let a|lander take the pressure off.

a|lander is your intuitive, map-driven companion for Fortnite. Designed to answer the age-old question: “Where are we landing?” With a single tap, it randomly selects a point of interest (POI) from the current map and zooms in to highlight the spot. Whether you’re looking to shake up your routine or explore hidden corners you’ve never visited, a|lander makes every exciting.

Choose between:

  • All available POIs and named locations for full exploration.
  • Main POIs only for a more focused experience.

No more indecision. No more arguments. Just a touch of fate guiding your next landing zone.

Data for this app is provided by Fortnite-API.

screenshot

Mockup produced with Rotato

UX

Strategy

Purpose

  • Provide the user with a landing site for a Battle Royale in Fortnite that is randomly chosen from the current list of POIs provided by the API.

Primary User Needs

  • Users need a suggested landing site with minimal interaction.
  • They also need to repeat this easily.

Scope

Features

Full details on Features can be viewed below, essentially I wanted to include:

  • Easy interaction with minimal input to get a landing site.
  • Easily repeatable action to get new suggestions.
  • The ability to toggle between the full POI list and the main POIs provided by the API.

Content Requirements

  • Up to date map image for the current iteration of Fortnite.
  • Up to date POI information for the current iteration of Fortnite.
  • Easy to view main map area with clear indicator of selected site.
  • Easy toggle to change between POI preferences.
  • Error messages if there are issues fetching data.

Structure

The site is a Single Page Application and by design is simple and easy to use.

There is a header at the top of the page containing the app name and a toggle switch. Clicking on the a| of the title will take the user to my portfolio site. Clicking on the lander portion will reset the app by removing any selected POIs and zooming out.

The toggle on the right hand side of the header will control which POI set is used to generate a landing site. Toggling this will change the POI set accordingly whilst resetting the map ready to start again.

The main focus of the app is the map area that shows the current Fortnite Battle Royale map. To start the user clicks anywhere on the map. When a POI is picked, a marker will be placed and the map will zoom in tighter onto the marker. Clicking again will pick another marker and the process will repeat.

If there are any errors in fetching the data, the map will be replaced by an information message informing the user.

The bottom of the page contains a footer with another link to my portfolio along with links to my LinkedIn profile and GitHub profile.

Skeleton

In the wire framing process I decided that the interface needed to be as simple and easy as possible. Minimal input for maximum output. A clean interface with emphasis on the map area as that is the focus of the app.

A full list of Wireframes can be viewed in detail below.

Surface

Visual Design Elements

Colour Scheme

The colour scheme for the site is a monochromatic interface combined with the full colour of the Fortnite map. A yellow marker is overlaid to highlight POIs.

Colour Reference Usage
#FFD700 POI Marker
#093576 Background for the map image
#4a5568 Footer text and icons

Typography

Fonts

  • Fjalla One was used for the a| in the header and the label for the POIs on the map.

  • Fira Sans was used for the lander in the header and all other text.

Icons

User Stories

User Capability Benefit
As a user I can be given a place to land in Fortnite Battle Royale so that I don't have to worry about choosing where to land.
As a user I can interact with the app using simple taps or clicks so that I can quickly get a result without complex navigation.
As a user I can easily request a new POI so that I have a new landing site for the next Battle Royale.
As a user I can choose whether to use just the main POIs or the full set of POIs so that I can either focus on landing in the main areas or decide to explore a little further for more challenging starts.
As a user I can toggle between POI sets easily so that I don't have to spend too much time on preferences.
As a user I can see the chosen POI focused and zoomed in on the map so that know exactly where to land.
As a user I can see the name of the POI so that I know where I am landing.
As a user I can access and use the app on mobile devices so that I can use it wherever I play Fortnite.
As a user I can install the app as a PWA on my homescreen so that it feels like a native app with fast access.
As a user I can see a welcome message on first launch so that I understand how to use the app.
As a user I can use the app without needing to sign in so that I can jump straight into gameplay without any friction.
As a user I can use the app in landscape or portrait mode so that it adapts to how I hold my device.
As a user I can rely that the map and POIs are up to date so that I don't need to worry about having to input anything myself to update it.
As a developer I should carry out automated testing on all applicable files so that I catch problems early and ensure consistent behaviour across updates.
As a developer I should perform manual testing across key user flows and devices so that I can validate real-world usability, catch edge cases not covered by automation, and ensure a smooth experience for all users.

Wireframes

To follow best practice, wire frames were developed for mobile, tablet, and desktop sizes. I've used Balsamiq to design my site wireframes.

Mobile Wireframes

Whole Map View Highlighted POI View
wireframe wireframe

Tablet Wireframes

Whole Map View Highlighted POI View
wireframe wireframe

Desktop Wireframes

Whole Map View Highlighted POI View
wireframe wireframe

Features

Existing Features

  • Header

    The page header contains the main title of app along with a toggle for changing the POI set that is used to generate a landing site. The title has two additional functions:

    • The 'a|' portion of the title is a link to my portfolio website.
    • The 'lander' portion of the title will reset the map when clicked. The current POI will be removed and the map will zoom out to the starting position.

    Header

  • Footer

    The page footer contains a link to my portfolio website on the left and a button to open the help dialog on the right shown by a font awesome icon.

    Footer

  • Help Dialog

    When the app is first run and the help dialog is shown with the simple instructions on how to use the app. This can be accessed any time via the info button in the footer.

    Help Dialog

  • Map

    The map is the main focus of the app and shows the current Fortnite Battle Royale map. When the user clicks on the map a random POI is chosen and a marker is placed. The map then zooms in to focus on the POI and the name label is then shown. To get a new POI the user just clicks again, this process can be repeated.

    Map Usage Base Map Highlighted POI
    Map usage Base Map Highlighted POI

Future Features

There are no current plans for future features, the app is designed to be as minimal and efficient as possible.

Tools & Technologies

Tool / Tech Use
Markdown Badge Generate README and TESTING templates.
Git Badge Version control. (git add, git commit, git push)
GitHub Badge Secure online code storage.
VSCode Local IDE for development.
GitHub Pages Badge Deploying React app to GitHub
Cloudflare Badge Domain hosting and DNS forwarding to GitHub Pages
React Badge Frontend library for creating the site.
Vite Badge Frontend Build Tool
HTML5 Badge Main site content and layout.
JSX Main site content and layout.
CSS Badge Design and layout.
JavaScript Badge User interaction on the site.
Tailwind CSS Badge Front-end CSS framework for modern responsiveness.
Vitest Badge Automated unit and integration testing.
Cypress Badge Automated end-to-end testing.
Fortnite Badge Providing up-to-date data for Fortnite Battle Royale
Balsamiq Creating wireframes.
Font Awesome Badge Icons.
Microsoft Copilot Help debug, troubleshoot, and explain things.
Clop Image optimisation.
Cleanshot X Screenshot and screen recording capture.
Math.js Computing coordinates

Agile Development Process

GitHub Projects

GitHub Projects served as an Agile tool for this project. Through it, User Stories, issues/bugs, and Milestone tasks were planned, then subsequently tracked on a regular basis using the Kanban project board.

Agile Tracker

I also created an overview page where I could easily see at a glance the current progress in development. This allowed me to track start and finish dates along with adding prioritisation for bugs.

Agile Overview

GitHub Issues

GitHub Issues served as an another Agile tool. There, I managed my User Stories and Milestone tasks, and tracked any issues/bugs.

GitHub issues GitHub closed issues

Open Issues
Open Issues
Closed Issues
Closed Issues

MoSCoW Prioritization

I've decomposed my Epics into User Stories for prioritizing and implementing them. Using this approach, I was able to apply "MoSCow" prioritization and labels to my User Stories within the Issues tab.

  • Must Have: guaranteed to be delivered - required to Pass the project (max ~60% of stories)
  • Should Have: adds significant value, but not vital (~20% of stories)
  • Could Have: has small impact if left out (the rest ~20% of stories)
  • Won't Have: not a priority for this iteration - future features

The GitHub projects helped keep track of this with the creation of a graph.

MoSCoW Graph

SEO

Sitemap

I've used XML-Sitemaps to generate a sitemap.xml file. This was generated using my deployed site URL: https://lander.apeskinian.com

After it finished crawling the entire site, it created a sitemap.xml, which I've downloaded and included in the repository.

Robots

I've created the robots.txt file in the public folder.

Testing

Note

For all testing, please refer to the TESTING.md file.

Deployment

The live deployed application can be found deployed on a|lander.

GitHub Pages Deployment

This project uses GitHub Pages, a free static site hosting service provided by GitHub, ideal for deploying static sites like those built with Vite.

Deployment steps are as follows, after account setup:

  • Create a new repository on GitHub (public or private depending on your plan).
  • Clone the repository locally and initialize your Vite React app.
  • Install the gh-pages package to enable deployment:
    • npm install --save-dev gh-pages

Important

This is a sample only; you would replace the values with your own if cloning/forking my repository.

Update your project files with the following:

File Change
vite.config.js Add base: "/<your-repo-name>/" to the config object
package.json Add "homepage": "https://<your-username>.github.io/<your-repo-name>"
package.json > scripts Add "predeploy": "npm run build" and "deploy": "gh-pages -d dist"

Replace <your-username> and <your-repo-name> with your actual GitHub username and repository name.

To deploy your app:

  • Run npm run deploy from the root of your project.
  • This will build your app and push the contents of the dist/ folder to the gh-pages branch.

Note

If you see your README instead of your app, go to your GitHub repository Settings > Pages, and select the gh-pages branch as the source.

Your app should now be live at: https://<USERNAME>.github.io/<REPO-NAME>/

You can customize your domain using a CNAME file in the public/ folder.

If you have your own packages that have been installed, then the dependencies file needs updating using:

  • npm install <your-package>
  • npm run build
  • npm run deploy

To update your dependencies file:

  • npm list --depth=0
  • npm install
  • npm update
  • npm audit fix (optional)
  • npm install --save-dev gh-pages (if not already installed)

The project should now be connected and deployed to GitHub Pages!

Tip

For routing issues with React Router, consider using hash-based routing or adding a fallback 404.html that redirects all paths to index.html.

Fortnite API (HTML Version)

This project uses the Fortnite-API to display public game data such as cosmetics, shop items, and events. The HTML version of the API allows you to embed content directly without needing an API key or authentication.

To use the HTML endpoints, visit Fortnite-API for more information on setup, available endpoints, and integration options.

Local Development

This project can be cloned or forked in order to make a local copy on your own system.

For either method, you will need to install any applicable packages found within the package.json file.

  • npm install

You may also need to create a .env file at the root-level to store any environment variables used in your app (e.g. API keys, feature flags, or third-party service URLs).

Important

This is a sample only; you would replace the values with your own if cloning/forking my repository.

Sample .env file:

VITE_API_URL=https://your-api-endpoint.com
VITE_PUBLIC_KEY=your-public-key
VITE_FEATURE_FLAG=true

Important

All environment variables must be prefixed with VITE_ to be exposed to your React app at build time.

Once the project is cloned or forked, in order to run it locally, you'll need to follow these steps:

  • Start the development server: npm run dev
  • Open your browser and visit: http://localhost:5173 (default Vite port)
  • Make any necessary changes to your components, styles, or routes
  • Save your changes and Vite will hot-reload the app automatically

To build the project for production:

  • Run: npm run build
  • Preview the production build locally: npm run preview

Note

npm run preview simulates how your app will behave in production. It serves the contents of the dist/ folder.

If you'd like to update your dependencies or regenerate your lock file:

  • npm update
  • npm audit fix (optional)
  • npm install (to refresh node_modules)

Everything should now be ready for local development and testing!

Tip

You can customize your Vite config in vite.config.js and structure your app using folders like src/components, src/pages, and src/assets for better maintainability.

Cloning

You can clone the repository by following these steps:

  1. Go to the GitHub repository.
  2. Locate and click on the green "Code" button at the very top, above the commits and files.
  3. Select whether you prefer to clone using "HTTPS", "SSH", or "GitHub CLI", and click the "copy" button to copy the URL to your clipboard.
  4. Open "Git Bash" or "Terminal".
  5. Change the current working directory to the location where you want the cloned directory.
  6. In your IDE Terminal, type the following command to clone the repository:
    • git clone https://www.github.com/apeskinian/project_lander.git
  7. Press "Enter" to create your local clone.

Forking

By forking the GitHub Repository, you make a copy of the original repository on our GitHub account to view and/or make changes without affecting the original owner's repository. You can fork this repository by using the following steps:

  1. Log in to GitHub and locate the GitHub Repository.
  2. At the top of the Repository, just below the "Settings" button on the menu, locate and click the "Fork" Button.
  3. Once clicked, you should now have a copy of the original repository in your own GitHub account!

Cross-platform Development

If you are using both Windows and macOS operating systems to develop on, you can use a .gitattributes file to help maintain consistent line endings and file handling across environments. This file should be saved in the root directory of your repository.

Below is a recommended .gitattributes configuration for a Vite-based React project:

# Normalise all text files to use LF line endings
* text=auto

# Explicitly set LF for common web files
*.js text eol=lf
*.jsx text eol=lf
*.ts text eol=lf
*.tsx text eol=lf
*.css text eol=lf
*.html text eol=lf
*.json text eol=lf
*.md text eol=lf

# Treat images and other binary assets correctly
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.svg binary
*.webp binary
*.ico binary

Note

This setup helps prevent unnecessary diffs and merge conflicts caused by inconsistent line endings, especially when collaborating across operating systems.

Once added, you can re-normalize your repository with:

  • git add --renormalize .
  • git commit -m "Normalize line endings via .gitattributes"

This ensures all tracked files follow the new rules without altering their actual content.

Local VS Deployment

There are no major differences between the local version and the deployed version online in terms of functionality or layout.

However, the deployed version is a production build of the React app, created using Vite’s build process. This means:

  • The code is minified and optimized for performance.
  • Static assets are bundled and served from the dist/ folder.
  • Environment variables are baked in at build time (only those prefixed with VITE_).
  • Hot module reloading and development tools are disabled.

To generate the production build locally, use:

  • npm run build

To preview the production build before deploying:

  • npm run preview

Note

The build process ensures faster load times and better performance for end users, but it also means that runtime changes to environment variables or config files won’t affect the deployed app unless you rebuild and redeploy.

Credits

Content

Source Notes
Markdown Builder Tool used for templating the Markdown files
React Udemy Course Course for learning React
Tailwind Documentation Using Tailwind with Vite
Fortnite-API Map image and POI data used in the app
Microsoft Copilot Help with code logic and explanations

Media

Icons

Source Location Type Notes
SVGREPO Entire site Favicon PNG used for favicon generation
Favicon Generator Entire site Favicon Icon generated from parachute png downloaded from SVGREPO
Font Awesome Icons used throughout the site Icons See typography full all icons used

Acknowledgements

  • I would like to thank my sister Natalie, and my good friend Tim Nelson for their feedback and testing throughout the development of this project.
  • I would like to thank my daughter Niamh, my sisters Laura & Natalie, and my whole family for the continued moral support; it keeps me going during periods of self doubt and imposter syndrome.

About

Fortnite lander app no need to decide where to land anymore!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published