CoinPilot is a crypto portfolio tracker. CoinPilot has been developed as part of the Code Institute's Full-Stack Developer course as my 4th project—focusing on Django and Bootstrap frameworks, database manipulation, and CRUD functionality. It is for educational purposes only.
View the live site here: CoinPilot
For Admin access with relevant sign-in information: CoinPilot Admin
CoinPilot is a crypto portfolio tracker. Users are invited to:
CoinPilot is accessible via all browsers with full responsiveness on different screen sizes. Its aim is to provide a comprehensive tool for cryptocurrency investors to manage their portfolios efficiently and stay informed about market trends. I have created this site to meet the needs of the growing cryptocurrency investment community. With the rising popularity of cryptocurrencies, investors require reliable tools for tracking their investments, analyzing market data, and making informed decisions.
CoinPilot aims to offer a centralized platform where users can manage their crypto investments, receive critical updates, and interact with a community of like-minded investors. In future development of this project, I hope to offer users advanced features such as portfolio optimization suggestions, integration with multiple exchanges, and additional analytics tools. Other features will include enhanced security measures, personalized investment advice, and investing strategy testing.
I was really excited to work on this project's frontend as I had a clear vision of the final product from the beginning. I aimed to create a website with a clean and modern design that emphasizes usability and clarity. The interface is designed to be intuitive, with a focus on functionality and ease of navigation. The color scheme was chosen to create a professional and modern feel, using shades of purple and white.
Original inspiration came from financial dashboards and modern fintech applications. I wanted to create an interactive, data-driven website with a cohesive visual identity.
As mentioned above, the color scheme and logo drove the design of the website. I wanted to create a professional and trustworthy environment for the user to manage their cryptocurrency investments. The colors represent different sections/features of the website. I balanced the subtle shades with a classic, #F8F7F7
white background and a dark purple shade of #1D1A24
, as I felt that it yielded a slightly more matte effect than #000
black. This combination also yielded a high contrast ratio for accessibility, with my color scheme also passing a Color Blind Safe check via Adobe Color. This check was important for accessibility as the colors form the base for my page and feature icons. Each color in the scheme was also contrast checked with dark purple #1D1A24
to ensure no contrast issues, and all passed.
The corresponding sections and colors and identifying CSS variables are:
#1D1A24
'--dark-purple'#79627B
'--accent-purple'#F8F7F7
'--white'#FFFFFF
or #1D1A24
'--white' or '--dark purple' depending on the background#868B94
'--grey' (used for zebra striping)For the login/logout icon, a grey #868B94
was used as a base color. I felt this grey helped to balance the colors and prevent the icons from 'popping' too much for the eye in the navigation bar.
Color Scheme for CoinPilot website
Accessibility check for color scheme
Using Google Fonts, I imported 'Roboto' as the main font to my CSS file. Roboto is a modern, clean sans-serif which I felt worked well in designing my logo and for all text elements in my project. Its readability and professional appearance make it suitable for a financial application like CoinPilot. For future use, I envisioned merchandise bearing the logo for the CoinPilot brand.
Roboto, a Google Font designed by Christian Robertson
The project goal was to build a comprehensive crypto portfolio tracker. The 'product' was a platform where users could track their cryptocurrency investments, and the 'users' were crypto investors, traders, and enthusiasts. Given the complexity of cryptocurrency investments, I aimed to create an easy-to-use, intuitive platform for users. Through planning and design preparation, I realized there was an opportunity to extend this service into a more robust tool with social elements, allowing users to share insights and strategies.
CoinPilot is my first project following Agile planning methods. As someone who loves to prepare and plan, it was a joy to get to know and use. I used my GitHub Projects Board to plan and document all of my work.
I chose to follow the MoSCoW Prioritization method for CoinPilot, identifying and labeling my:
Must Haves: the 'required', critical components of the project. Completing my 'Must Haves' helped me to reach the MVP (Minimum Viable Product) for this project early, allowing me to develop the project further than originally planned.
Should Haves: the components that are valuable to the project but not absolutely 'vital' at the MVP stage. The 'Must Haves' must receive priority over the 'Should Haves'.
Could Haves: these are the features that are a 'bonus' to the project. It would be nice to have them in this phase, but only if the most important issues have been completed first and time allows.
Won't Haves: the features or components that either no longer fit the project's brief or are of very low priority for this release.
User stories and features recorded and managed on GitHub Projects
User Story | Priority |
---|---|
As a user, I want to be able to view the website's home page so that I can learn about it and the services it offers | MUST HAVE |
As a user, I can find the website's navigation area so that I may easily navigate around the website | MUST HAVE |
As a user, I can view any error pages with a 'Home' button so that I can get back to the homepage easily | MUST HAVE |
As a user, I want to see a message when I have successfully/unsuccessfully completed an action so that I can receive feedback from my interaction with the website | MUST HAVE |
User Story | Priority |
---|---|
As a user, I want to be able to register with the application using my email and password so that I can create an account | MUST HAVE |
As a user, I want to be able to log in to the application using my credentials so that I can access my portfolio and other features | MUST HAVE |
As a user, I want to be able to log out of the application so that my account remains secure | MUST HAVE |
As an admin, I want to be able to create, read, update, and delete user accounts so that I can manage the application's users | SHOULD HAVE |
As an admin, I want to be able to assign roles (admin or regular user) to users so that I can control their access and permissions | COULD HAVE |
User Story | Priority |
---|---|
As a user, I want to be able to view a list of supported cryptocurrencies with their real-time market data (price, market cap, etc.) so that I can make informed decisions | MUST HAVE |
As an admin, I want to be able to add or remove cryptocurrencies from the supported list so that I can keep the application up-to-date with the latest cryptocurrencies | COULD HAVE |
User Story | Priority |
---|---|
As a user, I want to be able to create a new cryptocurrency portfolio so that I can start tracking my investments | MUST HAVE |
As a user, I want to be able to view a summary of my portfolio, including the total value and the breakdown of holdings so that I can monitor my investments | MUST HAVE |
As a user, I want to be able to see the profit/loss of each holding, as well as the overall portfolio | MUST HAVE |
As a user, I want to be able to update the details of my portfolio (name, description, etc.) so that I can keep my information accurate | SHOULD HAVE |
As a user, I want to be able to delete a portfolio so that I can remove any unwanted portfolios | MUST HAVE |
User Story | Priority |
---|---|
As a user, I want to be able to open each holding and see all related information like trades of that coin, profit/loss, holding period so that I can have a detailed overview of my investments | MUST HAVE |
User Story | Priority |
---|---|
As a user, I want to be able to add a new trade (buy or sell) for a specific cryptocurrency in my portfolio so that I can track my investment activity | MUST HAVE |
As a user, I want to be able to view the trade history for each cryptocurrency in my portfolio so that I can analyze my investment performance | MUST HAVE |
As a user, I want to be able to update the details of an existing trade (quantity, price, etc.) so that I can correct any mistakes or inaccuracies | MUST HAVE |
As a user, I want to be able to delete a trade from my portfolio so that I can remove any unwanted or erroneous trades | MUST HAVE |
As a user, I want to be able to see the profit/loss for each trade and my overall portfolio so that I can evaluate my investment performance | COULD HAVE |
User Story | Priority |
---|---|
As a user, I want to have a visually appealing and responsive user interface so that I can easily navigate and use the application on different devices | MUST HAVE |
As a user, I want to be able to view charts and visualizations of my portfolio performance so that I can better understand my investment trends | SHOULD HAVE |
As a user, I want to be able to easily access and view cryptocurrency market data so that I can make informed decisions about my investments | MUST HAVE |
As this would be a dual learning/building project using technologies that were new to me, such as Django, SQL, Bootstrap, and Cloudinary, I was cautious to maintain consistent control over the scope of the project and not let my idea grow too big. With the sheer amount of files, I needed to lock down my project features early on into manageable blocks so as not to lose track of the MVP. Following my learning of the Django MVT framework, I was able to identify how to change the templated structure to produce different website features from my base HTML. This allowed me to build upon my original idea of a 'Crypto Portfolio Tracker' and add additional functionalities, such as real-time market data integration and trade tracking.
Following Agile Planning Methodologies, I added my Developer Tasks, and User Stories as issues on my GitHub project board. However, I didn't create any sprints since, during the project, my third child was born and everything was a little chaotic.
Essential features of my project were:
Planning my project thoroughly from the start allowed me to identify areas of importance for MVP completion and satisfaction of assessment criteria, and to balance them with the feasibility of the features.
The wireframes for CoinPilot were created by hand, focusing on simplicity and clarity. Given the scope of the project and my time constraints, I decided to keep the wireframes straightforward and only for desktop. Initially, I considered incorporating some nice animations and UI effects, but I quickly realized it would exceed the project's scope.
Desktop view for:
By keeping the wireframes simple, I was able to maintain a clear vision of the essential features and ensure a functional MVP. Below are the wireframes for each of the main pages:
Creating these wireframes helped me to visualize the layout and user flow of the application, ensuring that the design remained user-friendly and functional. While I initially planned for more advanced UI elements, focusing on a basic, clean design allowed me to deliver a coherent and usable product.
I look forward to iterating on these designs and incorporating more advanced features and animations in future versions of CoinPilot.
Database Schema (ERD) for CoinPilot displaying relationships between feature components saved within the database
This Entity Relationship Diagram (ERD) demonstrates how each feature interacts with each other and the connected PostgreSQL Database. Using Django's User Model and Django AllAuth to carry out all user authentication, a user_id
is created when the user registers with their email and password. This allows the user to create and manage their portfolios, holdings, and trades within the application.
The schema is structured as follows:
For instance, when a user creates a new portfolio, they can add multiple holdings to it, each representing a different cryptocurrency. Within each holding, the user can further add trades, tracking their buy and sell activities. The relationship between trades, holdings, and portfolios is managed via foreign keys, ensuring data integrity and optimal database performance.
Through the Admin Django Dashboard, the connected user_id
to all data entered into the site means that the Admin can manage users and their data efficiently. For example, if a user is removed, all associated data such as portfolios, holdings, and trades can also be deleted through the use of on_delete=models.CASCADE
. At the moment, a user can remove any data they share with the site, but they cannot delete their account completely. This feature will come in the next version.
A number of security steps were taken in this project to protect the user's submitted data. Unlike a strictly informative website, CoinPilot allows users to manage their cryptocurrency portfolios, which involves sensitive financial information. To meet the strict internet standards of protecting a user's data, the following processes were included in the project's development.
AllAuth
Django AllAuth is an installable framework that takes care of the user registration and authentication process. Authentication was needed to determine when a user was registered or unregistered and it controlled what content was accessible on CoinPilot. The setup of AllAuth included:
INSTALLED_APPS
in my settings.py
AUTHENTICATION_BACKENDS
from the AllAuth docs for my settings.py
urls.py
Defensive Design
CoinPilot was developed to ensure a smooth user experience, to the best of my current learning experience with Django.
CSRF Tokens
CSRF (Cross-Site Request Forgery) tokens are included in every form to help authenticate the request with the server when the form is submitted. Absence of these tokens can leave a site vulnerable to attackers who may steal a user's data.
By implementing these security measures, CoinPilot ensures that user data is protected and the application remains secure from common web vulnerabilities.
It was important to me from the beginning that CoinPilot be accessible to an unregistered user, in some capacities. I wanted the website to sell the product to a new user quickly by immediately inviting them to explore the platform's features and benefits. The following is a breakdown of the site's accessibility for registered/unregistered users:
Feature | Unregistered User | Registered, Logged-In User |
---|---|---|
Home Page | Visible | Visible |
Portfolio | Not Visible - redirected to Sign In page/Sign Up | Visible and full feature interaction available |
Coin List | Visible | Visible with full data and interaction available |
Trade Tracking | Not Visible | Visible and full feature interaction available |
Profit/Loss Report | Not Visible | Visible and full feature interaction available |
By providing limited access to certain features for unregistered users, CoinPilot aims to demonstrate the value of the platform and encourage new users to register and take full advantage of all available features.
Users are able to Create, Read, Update, and Delete their information on CoinPilot. Some features have full CRUD functionality available, while others present only the necessary options. Here is my CRUD breakdown for CoinPilot:
Feature | Create | Read | Update | Delete |
---|---|---|---|---|
Profile | Created upon registration | Yes | Yes | Full Profile deletion is currently only available to Admin upon User Account deletion. The profile dashboard clears automatically if a user removes all of their portfolios or trades. |
Portfolios | Yes | Yes | Yes | Yes |
Holdings | Yes | Yes | Yes | Yes |
Trades | Yes | Yes | Yes | Yes |
Coin List | No | Yes | No | No |
By providing full CRUD functionality for key features, CoinPilot ensures that users have complete control over their investment data, allowing them to manage their portfolios effectively.
Header/Navigation & Footer
For features showcase, screenshots of the features in use were taken on Laptop/Desktop
Registered, Logged-In view with additional buttons
The CoinPilot footer has been created with a clean design to complement the overall aesthetic. The social media icons, from Flaticon, open in a new tab when clicked. Tooltips are again used for those who may not be familiar with the icons. CoinPilot does not have any active social media currently, so the links are placeholders for future development.
Home Page
In the Home Page 'Hero' section, when a user is not registered they will see a 'Sign Up' button under the section text, which will bring them to the Sign Up page. When logged in, they will see 'View Portfolio' which will bring them to the portfolio page (Future development).
Portfolio Page
The Portfolio Page allows registered, logged-in users to manage their cryptocurrency portfolios. Users can create new portfolios, add holdings, and track trades. The page provides a summary of each portfolio, including the total value and the breakdown of holdings. Detailed charts and visualizations help users understand their investment performance.
Summary of a user's portfolio, showing total value and holdings breakdown
The Portfolio Page also includes options for users to edit their portfolios, update holdings, and add new trades. Clear and intuitive interfaces ensure that users can manage their investments with ease.
By planning these future features, CoinPilot aims to continuously improve the user experience, expand its functionality, and cater to the evolving needs of its users.
Further information is available in the requirements.txt file
These tools and programs were instrumental in the development and organization of the CoinPilot project, providing essential support for diagramming, learning, organization, and content creation.
To begin this project from scratch, you must first create a new GitHub repository using the Code Institute's Template. This template provides the relevant tools to get you started. To use this template:
pip3 install 'django<4' gunicorn
pip3 install dj_database_url psycopg2
pip3 install dj3-cloudinary-storage
pip3 freeze --local > requirements.txt
command in the terminal. django-admin startproject freefido .
python3 mangage.py startapp booking
python3 manage.py createsuperuser
python3 manage.py migrate
import os
os.environ["DATABASE_URL"]="<copiedURLfromElephantSQL>"
os.environ["SECRET_KEY"]="my_super^secret@key"
For adding to settings.py:
import os
import dj_database_url
if os.path.exists("env.py"):
import env
SECRET_KEY = os.environ.get('SECRET_KEY')
(actual key hidden within env.py) DATABASES = {
'default': dj_database_url.parse(os.environ.get("DATABASE_URL"))
}
BASE_DIR
enter TEMPLATES_DIR = os.path.join(BASE_DIR, ‘templates’)
TEMPLATES = 'DIRS': [TEMPLATES_DIR]
with:os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'templates', 'allauth')
web: gunicorn coinpilot.wsgi
Cloudinary provides a cloud hosting solution for media storage. All users uploaded images in the FreeFid project are hosted here.
Set up a new account at Cloudinary and add your Cloudinary API environment variable to your env.py and Heroku Config Vars. In your project workspace:
'cloudinary_storage',
'django.contrib.staticfiles',
'cloudinary',
os.environ["CLOUDINARY_URL"]="cloudinary://...."
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'cloudinary_storage.storage.StaticHashedCloudinaryStorage'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/media/'
DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
A new database instance can be created on Elephant SQL for your project.
To start the deployment process , please follow the below steps:
Log in to Heroku or create an account if you are a new user.
Once logged in, in the Heroku Dashboard, navigate to the 'New' button in the top, right corner, and select 'Create New App'.
Enter an app name and choose your region. Click 'Create App'.
In the Deploy tab, click on the 'Settings', reach the 'Config Vars' section and click on 'Reveal Config Vars'. Here you will enter KEY:VALUE pairs for the app to run successfully. The KEY:VALUE pairs that you will need are your:
Add the Heroku host name into ALLOWED_HOSTS in your projects settings.py file -> ['herokuappname', ‘localhost’, ‘8000 port url’].
Once you are sure that you have set up the required files including your requirements.txt and Procfile, you have ensured that DEBUG=False, save your project, add the files, commit for initial deployment and push the data to GitHub.
Go to the 'Deploy' tab and choose GitHub as the Deployment method.
Search for the repository name, select the branch that you would like to build from, and connect it via the 'Connect' button.
Choose from 'Automatic' or 'Manual' deployment options, I chose the 'Manual' deployment method. Click 'Deploy Branch'.
Once the waiting period for the app to build has finished, click the 'View' link to bring you to your newly deployed site. If you receive any errors, Heroku will display a reason in the app build log for you to investigate. DISABLE_COLLECTSTATIC may be removed from the Config Vars once you have saved and pushed an image within your project, as can PORT:8000.
A local clone of this repository can be made on GitHub. Please follow the below steps:
git clone
and paste in the copied URL from step 4.pip3 install -r requirements.txt
command, the dependencies and libraries needed for FreeFido will be installed.A copy of the original repository can be made through GitHub. Please follow the below steps to fork this repository:
The following blogs/tutorials complemented my learning for this project, alongside the Code Institute's Learning Content.
The following sites were used to gather the photographic media used in FreeFido: