Giter VIP home page Giter VIP logo

nataliiasolomchak21 / moviegeek-booking Goto Github PK

View Code? Open in Web Editor NEW
0.0 1.0 1.0 20.03 MB

A full-stack movie ticket booking web app, built with HTML, CSS, JS, Python, Django, and Bootstrap. Explore showtimes, book tickets for featured movies, and easily reserve seats online.

Home Page: https://moviegeek-booking-1c00719de368.herokuapp.com/

Dockerfile 2.67% Shell 1.12% Python 39.01% Procfile 0.03% HTML 37.22% CSS 17.66% JavaScript 2.29%
bootstrap cloudinary css django html javascript python

moviegeek-booking's Introduction

MovieGeek Booking Website

MovieGeek Booking Website is a full-stack application created using HTML, CSS, JS, Python, Django and Bootstrap. It is a movie ticket booking web application that allows users to view showtimes and book tickets for 4 featured new release movies. Customers can select a movie, showtime, number of seats, and complete booking checkout. The site provides an easy way to reserve seats and books tickets online.

View the live project here

Am I Responsive

Table of Contents

UX

Target Audience

The primary audience is moviegoers and cinephiles looking to conveniently book tickets online for upcoming movie releases. This includes casual movie fans, friends/family planning a night out, as well as frequent moviegoers who attend opening weekends. The focus is providing quick booking for the latest films.

Key Project Goals

  • Allow users to search for and view information about movies playing, including title, showtimes, ticket prices, and seat availability.
  • Provide users with a personal profile where they can view their past and current bookings.
  • Integrate a ticketing system.
  • Implement a seamless mobile-friendly booking flow for smartphone users.
  • Build an admin portal where staff can manage movie and showtime listings.

User Stories

Site-visitor

"As a user I can access main pages and features through the header and footer so that I can easily navigate the site"

"As a new user, I can sign up with form validation so that I can create a new account to book movies."

"As a user I can login so that I can access my account."

"As a user I can reset my password by entering my email so that I can recover access if forgotten."

"As a user I can select a movie, date, time, and up to 8 seats so that I can book tickets and see them in "My bookings."

"As a user I can edit or delete my existing bookings on my profile so that I can manage my tickets."

"As a user I can view information about movies so that I can choose movie to book tickets to."

"As a user I can view my profile containing my details so that I can confirm my account information."

"As a a logged in user I can log out so that I can securely end my session."

"As a user, I can see customized and informative error pages for 404 and 500 errors so that I understand what happened and can take appropriate action."

Site-admin

"As a site owner/administrator I can create, read, update and delete movies so that I can manage showtime content.

Agile Methodology

For this project I used Agile methodology. Agile methodology is a project management approach that prioritizes cross-functional collaboration and continuous improvement. It divides projects into smaller phases and guides teams through cycles of planning, execution, and evaluation.

Kanban Board

Kanban Board

This a visual representation of my Kanban Board during the project. In addition to three essential columns, I created a column "Won't Have For This Project" later renamed into "Won't Have For This Deployment" for the user stories that I wasn't able to implement. My process was divided into 3 iterations (Milestones). Once the iteration is done, all of the user stories from that iteration were going to "Done" column. If any of the user stories from a particular iteration weren't implemented, they were going back to the Product Backlog.

Iterations

Iteration 1

Iteration One

The first iteration is focused on creating the look of the website (home page and profile page) and part of the CRUD functionality.

Iteration 2

Iteration Two

The second iteration is focused on creating site navigation, the rest of the CRUD functionality as well as profile page features.

Iteration 3

Iteration Three

The third iteration is focused on authorisation.

Issues

I had 15 issues:

  • 3 epics:
    • Admin Site
    • Booking
    • Authorisation
  • 7 must-haves
    • Admin
    • Sign Up
    • Log In
    • Log Out
    • Site Navigation
    • Create/View booking
    • Edit/Delete booking
  • 4 should-haves
    • Main page
    • Home page
    • Profile Details
    • Update/Delete Profile
  • 4 could-haves
    • Verify Email
    • Password Reset
    • Profile Picture Update/Upload
    • Error pages

View here

Labels, Issues and MoSCoW prioritization

Labels

Labels

The labels were given to each user stories based on MoSCoW prioritization which is a technique used in project management, particularly in the context of Agile and Scrum methodologies, to prioritize and categorize requirements or features.

Issues

Issues

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

Story Points

I used Fibonacci sequence for story point estimation. Each number in the sequence is the sum of the two preceding ones. These points also meant to be relative, not absolute.

  • 2 - A task with a story point of 2 is considered small, relatively simple, and straightforward.
  • 3 - A task with a story point of 3 is slightly more complex than a 2 but still relatively simple.
  • 5 - A task with a story point of 5 represents a moderate level of complexity. It's more involved than a 3.
  • 8 - A task with a story point of 8 is considered large and complex. It's significantly more involved than a 5.

Won't Have For This Deployment

Product Backlog

All the user stories that weren't finished were put back into the Product Backlog for the next iteration.

UI

Initial Design

After discussing wireframes with my mentor, we determined that visual mockups were not necessary for this project. Since my designs thoroughly document the website's functionality and features in detail, comprehensive wireframes would be redundant.

The sizes that were used for the design:

  • Mobile (360x740)
  • Tablet (768x1024)
  • Desktop (1440x1024)

Header (Authenticated User)

Header (Authenticated User)

Header (Authenticated User)

Header (Non-Authenticated User)

Header (Non-Authenticated User)

Header (Non-Authenticated User)

Things I have changed: The header looks a little bit different as for the mobile size I used a Bootstrap collapsed navbar instead of using my own.

Footer

Footer

Footer

Things I have changed: I got rid of logo.

Sign Up page

Sign Up page

Sign Up page

Things I have changed: I've added "Password Rules" for better UX as well as for the desktop size I got rid of the image.

Log In page

Log In page

Log In page

Things I have changed: I also got rid of the image for the desktop size and changed "Email address" field to "Username".

Home page (Authenticated User)

Home page (Authenticated User)

Home page (Authenticated User)

Home page (Non-Authenticated User)

Home page (Non-Authenticated User)

Home page (Non-Authenticated User)

Nothing was changed here.

Booking page

Booking page

Booking page

Booking page

Booking page

Things I have changed: I wanted to created a real cinema experience by letting users choose the seats for the movie but because I wasn't able to implement that functionality, I sticked to the number input (users can choose the number of seats they want to book). Also, for the date and time I did a dropdown menu.

Booking Confirmation page

Booking Confirmation page

Booking Confirmation page)

Nothing was changed here.

Profile page (with bookings)

Profile page (with bookings)

Profile page (with bookings)

Things I have changed: The "My bookings" section looks the same the only thing is that the user can't edit or delete their profile.

Profile page (without bookings)

Profile page (without bookings)

Profile page (without bookings)

Nothing was changed here.

Log Out page

Log Out page

Log Out page

Things I have changed: I wanted to make the log out modal first but then sticked to the html template for that.

Messages

Sign Up

Messages

Log In

Messages

Edit booking

Messages

Delete booking

Messages

Log Out

Messages

Things I have changed: I wanted to create my own messages but to save some time I used Bootstrap alert messages.

Modals

Delete booking confirmation

Modals

Things I have changed: Although I wanted to create my own modal, I used Bootstrap modal as it (again) was less time-consuming.

Colour Palette

Colour Palette

For this project, I chose these colors to be presented in my colour palette as they have a positive affect on the user experience.

Colour Palette

I also used black, white and green colours mostly for text or as a background colours. RGB colours such as rgba(0,0,0,0.65), rgba (255, 255, 255, .6), and rgba(0, 0, 0, .3) were used for an overlay.

Typography

For this project I used Montserrat font family as I thought it was a readable font and would be beneficial to user experience.

ERD (Entity-Relationship Diagram)

I've used Entity-Relationship Diagram(ERD). Entity-Relationship Diagram represent the relationships between entities, more specifically the relationships between my "Movie" and "Booking" models as well as Django built-in User model.

This ERD conveys that:

  • Each Movie can have multiple Booking entries (one-to-many).
  • Each User can have multiple Booking entries (one-to-many).

ERD

Features

Existing Features

The features that are presented are for desktop size.

Header (Authenticated User)

Header (Authenticated User)

Header (Authenticated User)

If the user is authenticated, they will see Home, Profile and Log Out links in the navigation menu which gives them ability to go through the available movies and book them, go to their Profile page and see the bookings they have there or make a new one. They also can log out from their account and will be redirected to the Home page.

Header (Non-Authenticated User)

Header (Non-Authenticated User)

Header (Non-Authenticated User)

If the user is not authenticated, they will see Home, Sign Up and Log In links in the navigation menu which gives them ability to go through the available movies and watch trailers, sign up as a new user or log in as an existing one.

Footer

Footer

Footer

The footer includes links to the social media that each opens in a new tab.

Sign Up page

Sign Up page

Sign Up page

The sign up page gives user ability to enter their information(username, email address, password and confirm password) in order to authorise them as a website user and give them ability to create, view, edit and delete their bookings.

Log In page

Log In page

Log In page

The log in page gives user ability to enter their information(username and password) in order to get access to their existing profile and give them ability to create, view, edit and delete their bookings.

Password Reset

Password Reset

Log In page

The password reset page gives user ability to get back access to their account after resetting their password.

Home page (Authenticated User)

Home page (Authenticated User)

Home page (Authenticated User)

If the user is authenticated, they will see the welcome message with their username and "My bookings" button that will redirect them to their Profile page where they can manage their bookings. They have an ability to go through the available movies and book them as well as watch trailers.

Home page (Non-Authenticated User)

Home page (Non-Authenticated User)

Home page (Non-Authenticated User)

If the user is not authenticated, they will see the general welcome message and information about the website. They can watch trailers but don't have an ability to book movies and if they click on "Book Now" button will redicted to Log In page.

Booking page (Create booking)

Booking page

Booking page

The booking page includes a dropdown with four movies to choose from, the numbers of seats you can select, date and time, and price which populates depending on how many tickets the user will choose with "Book" button.

Booking Confirmation page

Booking Confirmation page

Booking Confirmation page)

After the user did their booking, they will be redirected to the "Booking confirmation" page that confirm that their booking was successful. They also have an option to either see their newly created booking in their Profile page or go back to the Home page.

Profile page (with bookings) (View booking)

Profile page (with bookings)

Profile page (with bookings)

The Profile page with existing bookings includes information about the user (username and email address) as well as information about their bookings. Each booking has the date and time of movie being screened, movie title, an amount of seats, price as well as "Edit" and "Delete" buttons so that the user can change their booking or delete it completely.

Profile page (without bookings)

Profile page (without bookings)

Profile page (without bookings)

The Profile page without bookings includes the text with "No bookings yet" and "Book a Movie" button that gives the user the ability to book a movie.

Edit booking

Edit booking

Edit booking

User can edit their booking and will be presented with a page identical to the Booking page but with functionality to change their booking and "Update" button to save their changes. The message about their booking being changed is displayed.

Delete booking

Delete booking

Delete booking

User can delete their booking and will be presented with a modal to confirm the delete process. The message about their booking being deleted is displayed.

Admin panel

Admin panel

Admin panel

Although, the Django admin panel is not created by me, it's still plays the most important part for the website. In my admin panel, I have two models: Booking and Movie and I also use the default User model. I customize the admin title and header.

Log Out page

Log Out page

Log Out page

The Log Out page gives the user the ability to log out from their account. After logging out they will be redirected to the Home page.

Messages

Sign Up

Messages

Sign In (Log In)

Messages

Updated booking

Messages

Deleted booking

Messages

Sign Out (Log Out)

Messages

Password Changed

Messages

Each of the alert messages being displayed when the various actions such as Sign Up, Log In, Log Out, Password Changed, Create, Edit or Delete a booking is being done to give a visual feedback to the user. The user can close the message or it will dissapear in a few seconds.

Error pages

500 Internal Server Error

Error page

The error page for when there is a problem on the server's side.

404 Page Not Found

Error page

The error page for when a user tries to access a resource or page on a website that cannot be found.

Features Left to Implement

Besides the features mentioned in Won't Have For This Deployment, these are some other features I would like to implement in the future.

  • Search and Filter:
    • Implement a search functionality for movies.
    • Allow users to filter movies based on genre, release date, etc.
  • Notifications:
    • Send email or in-app notifications for booking confirmations and updates.
  • User Reviews and Ratings:
    • Allow users to leave reviews and ratings for movies.
    • Display average ratings for each movie.
  • Social Features:
    • Sign Up with Social Account (Google, Facebook)

Technologies Used

  • Figma was used to create the final design of a website.
  • Font Awesome was used for social media icons in the footer.
  • Iconify was used for menu icon in the header.
  • Favicon was used for favicon.
  • LucidChart was used for creating ERD.
  • Google Fonts was used to add specific font family to the stylesheet.
  • Adobe Color was used to create a colour palette.
  • VSCode was used to code the website.
  • Bootstrap was used for styling certain elements on the page.
  • W3C validation was used to check the markup validity of html file.
  • Jigsaw was used to check the validity of css file.
  • JSHint was used to check the validity of js files.
  • CI Python Linter was used to check the validity of python files.
  • Am I Responsive was used to get a screenshot of a final look of the website on various devices.
  • Github was used to store the code of the website.
  • Django used as the Python framework for the site.
  • PostgreSQL used as the relational database management.
  • ElephantSQL used as the Postgres database.
  • Heroku used for hosting the deployed site.
  • Cloudinary used for online static file storage.
  • Pillow used for image processing
  • Gunicorn used for WSGI server
  • sycopg2 used as a PostgreSQL database adapter
  • Chrome DevTools was used to check the responsiveness of the website as well as to debug it.
  • Chrome's Developer Tool Lighthouse was used to check the performance of the website.

Testing

All the information on testing is in TESTING.md

Deployment

Right after finishing the Django setup, the app was deployed to Heroku for the first time to confirm all was working as expected.

Database (ElephangSQL)

  1. Navitate to ElephantSQL website, log in to your account
  2. Click “Create New Instance”.
  3. Enter database name, leave plan field as it is. You can leave the Tags field blank.
  4. Select region, click on "Review".
  5. Check that your details are correct. Then click “Create instance”
  6. Return to the ElephantSQL dashboard and click on the database instance name for this project.
  7. Copy your ElephantSQL database URL using the Copy.
  8. Paste this URL into env.py file as DATABASE_URL value and save the file.
os.environ["DATABASE_URL"] = "postgres://yourdatabaseURL"

Cloudinary

  1. Navigate to https://cloudinary.com/ and log in to your account.
  2. Navigate to dashboard/console https://console.cloudinary.com/console/ copy API Enviroment variable starting with "cloudinary://".
  3. Paste copied url into env.py file as CLOUDINARY_URL value and save the file.
os.environ["CLOUDINARY_URL"] = "cloudinary://yourAPIEnviromentvariable"

Django secret key

You need to include you Django secret key that you can generate using any of the Django secret keys generators online. In order to protect django app secret key it was set as an enviroment variable and stored in env.py.

os.environ["SECRET_KEY"] = "yourSecretKey"

Heroku

  1. Log in to Heroku or create an account.
  2. Navigate to your Heroku dashboard, click "New" and select "Create new app".
  3. Enter a name for your app (can be a name of your project) and choose the region that suits best to your location.
  4. Select "Settings" from the tabs.
  5. Click "Reveal Config Vars".
  6. These are: CLOUDINARY_API_KEY - Get from Cloudinary. DATABASE_URL - Get from your SQL provider. DISABLE_COLLECTSTATIC - Set to '1' (without '') SECRET_KEY - This is your Django project secret key, generated by your Django project. You can generate a new key that is different from your localhost version. You can also add any other Config Vars you need.
  • Heroku needs two additional files in order to deploy properly.
    • requirements.txt
    • Procfile
  1. Select "Deploy" from the tabs.
  2. Select "GitHub - Connect to GitHub" from deployment methods.
  3. Click "Connect to GitHub" in the created section.
  4. Search for the GitHub repository by name.
  5. Click to 'Connect' to the relevant repo.
  6. Either click ‘Enable Automatic Deploys’ for automatic deploys or ‘Deploy Branch’ to deploy manually. Manually deployed branches will need re-deploying each time the repo is updated.
  7. Click 'View' to view the deployed site.

Final Deployment

  1. Make sure to set DEBUG = False.
  2. You can remove DISABLE_COLLECTSTATIC - Set to '1' (without '').

How to Fork the Github Repository

  1. If you want to fork the repository log in to Github or create an account.
  2. Locate to the repository for the project.
  3. In the top right corner click on 'Fork' button.
  4. Now you have a copy of the original repository in your Github account.

How to Clone the Github Repository

  1. If you want to clone the repository log in to Github or create an account.
  2. Go to the main page of the repository.
  3. Click on '<> Code' and copy the URL from HTTPS.
  4. Open Git Bash.
  5. Change your current working directory to the location where you want your clone to be made.
  6. Type 'git clone' into your terminal window, paste the URL you copied earlier and press Enter to create your local clone.

Credits

Content

Media

Code

Acknowledgements

I express my sincere gratitude to my mentor, Dick Vlaanderen, for his invaluable assistance and feedback during the entire project. Additionally, I extend my thanks to our facilitator, Marko Tot, for his guidance on the material and practical advice. Special appreciation goes to my fellow groupmate, Gbemi Akadiri, for his steadfast help and support throughout the project.

moviegeek-booking's People

Contributors

nataliiasolomchak21 avatar

Watchers

 avatar

moviegeek-booking's Issues

USER STORY: Create/View booking

EPIC: Booking

As a user I can select a movie, date, time, and up to 8 seats so that I can book tickets and see them in "My bookings".

Acceptance Criteria

  • Booking page displays available movies, showtimes, and seats
  • User can select movie, date, time, and seats
  • Selected details are displayed with total price
  • If the user selects more than 8 seats, the warning is present
  • The booking is finished by clicking the "Book" button so that the tickets are purchased.
  • Successful booking message is displayed
  • Profile page lists user's ticket bookings
  • Each booking shows date, time, movie, seats, price
  • Each booking has "Edit" and "Delete" button
  • Message is displayed to give visual feedback to the user

Tasks

  • Create booking view with selection form
  • Calculate total booking price
  • Save selected booking details
  • Build profile view to display bookings
  • Add message confirmation

USER STORY: Admin

EPIC: Admin Site

As a site owner/administrator I can create, read, update and delete movies so that I can manage showtime content.

Acceptance Criteria

  • Admin interface allows CRUD of movies
  • Changes reflected on public booking pages

Tasks

  • Create model for movies and booking
  • Register models in admin

USER STORY: Log In

EPIC: Authorisation

As a user I can login so that I can access my account.

Acceptance Criteria

  • Form authenticates valid user
  • Log In form contains fileds for username and password
  • Message is displayed to give visual feedback to the user

Tasks

  • Authenticate user
  • Add template and styling
  • Add message confirmation

USER STORY: Sign Up

EPIC: Authorisation

As a new user, I can sign up with form validation so that I can create a new account.

Acceptance Criteria

  • Sign up form contains fields for username, email, password, confirm password
  • Form has password rules and validation
  • Submitting valid form creates new user account
  • Message is displayed to give visual feedback to the user

Tasks

  • Use Django User model
  • Add form field validation
  • Create user on valid submission
  • Add message confirmation
  • Add template and styling

USER STORY: Profile Details

EPIC: User Profile

As a user I can view my profile containing my details so that I can confirm my account information.

Acceptance Criteria

  • Profile page displays user's username and email
  • Matches user account details

Tasks

  • Profile view gets User data
  • Renders info in template

USER STORY: Profile Picture Update/Upload

EPIC: User Profile

As a user I can upload and update my profile picture so that I can change my account image and make my profile more personalised.

Acceptance Criteria

  • Users can change their profile image
  • Displays updated image
  • Users can upload images
  • Images are stored and retrieved successfully using Cloudinary
  • Message is displayed to give visual feedback to the user

Tasks

  • Add edit profile picture view
  • Image upload field in form
  • Handle image upload and save
  • Update image in User model
  • Display updated image
  • ImageField on User model
  • Add message confirmation

USER STORY: Update/Delete Profile

EPIC: User Profile

As a role I can capability so that received benefit

Acceptance Criteria

  • Form allows changing details in the profile
  • Users can enter and save new profile information for all relevant fields
  • Users can delete their profile
  • Message is displayed to give visual feedback to the user

Tasks

  • Profile update view
  • Edit form fields
  • Delete user information from the database if the profile is deleted
  • Add message confirmation

USER STORY: Main Page

As a user I can view an introduction to the website on the main page so that I can learn about its purpose.

Acceptance Criteria

  • Main page contains website introduction text
  • User has an option to either sign up or log in

Tasks

  • Write intro content
  • Add text and buttons to main page template
  • Add styling

USER STORY: Log Out

EPIC: Authorisation

As a a logged in user I can log out so that I can securely end my session.

Acceptance Criteria

  • Logout button/link logs user out
  • Redirects to homepage
  • User session ended
  • Message is displayed to give visual feedback to the user

Tasks

  • Add logout link to templates
  • Redirect to main page
  • End user session
  • Add message confirmation

USER STORY: Error pages

EPIC:

As a user, I can see customized and informative error pages for 404 and 500 errors ** so that ** I understand what happened and can take appropriate action.

Acceptance Criteria

  • 404 page displayed when a page is not found, indicating the content is unavailable.
  • 500 page displayed on internal server error with apologetic message and retry instructions.
  • All pages designed with navigation links.

Tasks

  • Create 404 and 500 HTML templates
  • Add explanatory messages for each error case
  • Include styling and navigation links

USER STORY: Verify Email

As a new user I can verify and confirm my email address so that I can complete account registration.

Acceptance Criteria

  • New users are sent verification email
  • Clicking verify link opens a new page and enables user to confirm email address
  • Confirming email completes account registration
  • Message is displayed to give visual feedback to the user

Tasks

  • Generate email verification link
  • Send verification email after signup
  • Allow user to confirm email through link
  • Add template and styling
  • Add message confirmation

USER STORY: Site Navigation

As a user I can access main pages and features through the header and footer so that I can easily navigate the site

Acceptance Criteria

  • Header and footer on all pages with homepage, profile, log out links (for authenticated user)
  • Header and footer on all pages with sign up, log in, home page links (for non-authenticated user)
  • Links navigate user to correct pages

Tasks

  • Create base template
  • Add styling

USER STORY: Password Reset

As a user I can reset my password by entering my email so that I can recover access if forgotten.

Acceptance Criteria

  • Password reset page contains email input
  • Submitting email sends reset link
  • Confirmation that the link is sent is present
  • Message is displayed to give visual feedback to the user
  • Clicking on reset link allows user to create new password

Tasks

  • Use password reset template and add styling
  • Allow email input
  • Send email reset link to user
  • Add message confirmation
  • Allow password change

USER STORY: Edit/Delete booking

EPIC: Booking

As a user I can edit or delete my existing bookings on my profile so that I can manage my tickets.

Acceptance Criteria

  • Each booking on profile has edit and delete buttons
  • Editing booking allows user to change details
  • Deleting booking removes it from profile
  • Message is displayed to give visual feedback to the user

Tasks

  • Add edit view
  • Update Booking model on submit
  • Delete view deletes booking
  • Redirect to updated profile
  • Add message confirmation

USER STORY: Home Page

As a user I can view information about movies so that I can choose movie to book tickets to.

Acceptance Criteria

  • Homepage displays movie list with information about each movie
  • Trailer and booking buttons

Tasks

  • Displays movie details
  • Link buttons to trailer and booking
  • Add template and styling

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.