Git Product home page Git Product logo

criticalmaps-ios's Introduction

Critical Maps iOS App

CI Localized Status

What's "Critical Mass"?

Critical Mass has been described as 'monthly political-protest rides', and characterized as being part of a social movement.

http://en.wikipedia.org/wiki/Critical_Mass_(cycling)

What's this app?

This iOS app is made for Critical Maps. It tracks your location and shares it with all other participants of the Critical Mass bicycle protest. You can use the chat to communicate with all other participants.

Where can I get the app?

Project Setup

The App uses Apple's Combine.framework for operation scheduling. The UI-Layer is built with The Composable Architecture and SwiftUI. Minimum platform requirements are: iOS 15.0

Modularization

The application is built in a hyper-modularized style. This allows to work on features without building the entire application, which improves compile times and SwiftUI preview stability. Every feature is its own target which makes it also possible to build mini-apps to run in the simulator for preview.

Getting Started

This repo contains both the client for running the entire Critical Maps application, as well as an extensive test suite. To get things running:

  1. Grab the code:
    git clone https://github.com/criticalmaps/criticalmaps-ios
    cd criticalmaps-ios
  2. Open the Xcode project CriticalMaps.xcodeproj.
  3. To run the client locally, select the Critical Maps target in Xcode and run (⌘R).

Optional Install fastlane with

make dependencies

Assets

The project is using type-safe assets generated with SwiftGen. If you add images to the project be sure to install it and run make assets from the root folder and add the changes to your PR.

Contribute

  • Please report bugs with GitHub issues.
  • If you can code please check the build & contribute guide below.
  • If you have some coins left you can help to finance the project on Open Collective.

How to contribute

In general, we follow the "fork-and-pull" Git workflow.

  1. Fork the repo on GitHub
  2. Clone the project to your own machine
  3. Commit changes to your own branch. Please add your changes also to the CHANGELOG. We're following the standard of Keep a Changelog
  4. Push your work back up to your fork
  5. Submit a Pull request so that we can review your changes

NOTES:

  • Be sure to merge the latest from "upstream" before making a pull request!

Open Source & Copying

We ship CriticalMaps on the App Store for free and provide its entire source code for free as well. In the spirit of openness, CriticalMaps is licensed under MIT so that you can use my code in your app, if you choose.

However, please do not ship this app under your own account. Paid or free.

Credits

lennet
Leo Thomas
normansander
Norman Sander
mltbnz
Malte Bünz
fbernutz
Felizia Bernutz
i5glu
I5glu
maxxx777
Maxim Tsvetkov
besilva
Bernardo Silva
stephanlindauer
Stephan Lindauer
jacquealvesb
Jacqueline Alves
huschu
Joscha
woxtu
Null
jkandzi
Justus Kandzi
zutrinken
Peter Amende
ravi-aggarwal-code
Ravi Aggarwal
AlbanSagouis
Alban Sagouis
thisIsTheFoxe
Henry
k-nut
Knut Hühne
wacumov
Mikhail Akopov
StartingCoding
Loris

Copyright & License

Copyright (c) 2021 headione - Released under the MIT license.

criticalmaps-ios's People

Contributors

albansagouis avatar besilva avatar dependabot-preview[bot] avatar dependabot[bot] avatar fbernutz avatar github-actions[bot] avatar huschu avatar i5glu avatar jacquealvesb avatar jkandzi avatar k-nut avatar lennet avatar maxxx777 avatar mltbnz avatar normansander avatar ravi-aggarwal-code avatar startingcoding avatar stephanlindauer avatar thisisthefoxe avatar wacumov avatar woxtu avatar zutrinken avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

criticalmaps-ios's Issues

Add explanation about friends feature

Our users should get some more information about how the friends feature works. #96

  • Anyone who has the ID/QR code will know where you are when the app is running
  • Without knowing the ID no-one should be able to track you
  • When you reinstall the app your friends will have to re-add you

We could also add an empty state when you have no friends yet.

Any good ideas how to do this @zutrinken?

Update Rules (Content)

New rules without images. New illustrations will follow in a future update.

Title

Richtlinien

Guidelines

1

Kommunikation

Gute Kommunikation ist essentiell für eine funktionierende Critical Mass. Viele Teilnehmer sind zum ersten mal dabei. Sprecht miteinander und erklärt ihnen die Verhaltensregeln. Informiert eure Mitfahrer wenn abgebogen oder gehalten wird. Warnt euch gegenseitig bei Gefahren und bedankt euch wenn Leute Kreuzungen sichern (korken).

Communication

Good communication is essential for a proper Critical Mass. Remember that many of your fellow riders are there for the first time. Reach out and explain the rules of the mass if anyone seems unclear. Let people know when you are stopping or turning. Warn riders of any danger and give some thanks to those who are protecting the intersections (corking).

2

Hab Spass

Die Critical Mass sollte sicher sein und Spass machen. Manche Fahrer werden wütend und aggressiv. Erklärt das Konzept umstehenden und macht Verbündete aus ihnen. Behaltet ein ruhiges Gemüt und lasst aggressive Situationen nicht eskalieren.

Good Vibes

The Critical Mass should be fun and safe for everyone. Some drivers get angry and aggressive. Try your best to explain the Critical Mass to bystanders and make allies out of them. Never escalate any aggression and always keep the situation chill.

3

Gegenverkehr

Die Critical Mass ist als ein Fahrzeug anzusehen. Bleibt auf eurer Fahrspur und fahrt nicht in den Gegenverkehr! Damit bringt ihr euch und andere Verkehrsteilnehmer in Gefahr.

Oncoming Traffic

The Critical Mass should look and act like one unified vehicle driving on the street. Stick to your own lane and never ride into the opposite lane of oncoming traffic. This can be incredibly dangerous for riders in the mass.

4

Geschwindigkeit

Damit die Critical Mass nicht auseinander gerissen wird, ist es wichtig, ein gemäßigtes Tempo beizubehalten und vorne nicht zu schnell zu fahren. Das verhindert das Bilden von Lücken. Wenn doch mal eine Lücke entsteht, so versucht aufzuschließen!

Pace Yourself

Keeping an even pace is essential to keeping one unified mass and avoiding any interference from competing traffic. To avoid cracks in the mass, don't ride too fast. If you see too much space starting to form, try to fill in immediately.

5

Geschlossener Verband

Fahrt an Kreuzungen nie zwischen stehenden Autos hindurch, sondern wartet dahinter. Sollte doch mal ein Fahrzeug in der Critical Mass stecken, leitet es hinaus. Das Blockieren verursacht nur mehr Stau und stört die Weiterfahrt. Als Kopf der Critical Mass darfst du nur bei Grün über die Ampel. Sobald der Verband einmal die Kreuzung überquert hat, müssen alle folgenden Radfahrer auch bei Rot weiterfahren.

Unified Mass

Never ride between standing cars at intersections. If a car gets itself stuck in the mass, just let it out. Blocking cars only causes more traffic to back up. Those leading the Critical Mass should only pass a traffic light if it is green. Once the mass is moving through an intersection, others should continue to follow, even when the light has turned red.

6

Blaulicht

Blockiert niemals Krankenwagen oder andere Einsatzfahrzeuge! Macht Platz, fahrt an den Rand und bildet eine Gasse. Prüft eure Umgebung und fahrt erst weiter wenn das Weiterkommen der Einsatzfahrzeuge gewährleistet ist.

Emergency Vehicle

Never block an emergency vehicle! Ride along the edges and create a lane where the vehicle can pass. Be absolutely sure the vehicle has safely passed before riding as usual.

7

Kreuzungen (Korken)

Korken ist das Absichern der Critical Mass an Kreuzungen. Stellt euch mit eurem Rad direkt vor die Autos und versperrt ihnen den Weg in die Critical Mass. Ein Fahrrad ist meistens nicht genug. Arbeitet zusammen um die Kreuzungen gemeinsam mit anderen Radfahrern zu sichern und löst euch gegenseitig ab. Manche Autofahrer reagieren uneinsichtig und aggressiv. Haltet an und helft die Situation zu schlichten. Klärt sie ruhig und sachlich über die StVo und Critical Mass auf.

Intersections (Corking)

Corking is protecting the Critical Mass at intersections. Stand at the intersection and use your bicycle to block cars from driving into the mass. Sometimes one bicycle is not enough. Work together to block the intersections with many bicycles and relieve those who have been corking for a long time. Some drivers get angry and aggressive for being blocked. Stop and help to calm the situation down. Explain the Critical Mass and traffic regulations calmly and factually.

8

Bürgersteig

Fahrt nicht auf dem Bürgersteig! Als schwächstes Glied im Netz der Verkehrsteilnehmer gilt den Fußgängern gegenüber besondere Rücksicht. Reclaim the Streets, nicht die Gehwege.

Sidewalk

Never ride on the sidewalk! Pedestrians are the weakest link in the traffic chain, and we need to look out for them. Reclaim the streets, not the sidewalk.

9

Polizeibegleitung

Oft wird die Critical Mass von der Polizei begleitet. Sie sichern kritische Kreuzungen und zähmen wütende Autofahrer. Als Kopf der Critical Mass ist es vorteilhaft (je nach Laune und Situation) zu kooperieren und die gewünschte Route der Polizei mitzuteilen.

Police Escort

The Critical Mass will be escorted by the police quite often. They protect intersections and tame raging drivers. As the head of the Critical Mass it can be an advantage (depending on your mood and situation) to cooperate and communicate the desired route to the police.

Improve CI stability

We often get the following error message for our CI builds

[!] Operation not permitted - /Users/travis/Library/Application Support/CallHistoryTransactions (Errno::EPERM)

manually restarting the build often resolves the issue but it's something we should investigate and fix

ability to use a custom api server

Hey!

I'd like to (ab)use this wonderful app for hitchhiking, for this purpose it would make sense to run a custom server. What do you think about adding a hidden way to change the API server address?

Chat & Twitter cell paddings

Chat and Twitter cells don't have the right paddings / margins and font sizes / line height. Defined in sketch.

Chat:

Is:

7373765457

Should:

5987654354

Specs:

Padding: 16px
Date: 15px / 16px - Bold #262626
Margin between date and message: 4px
Message: 17px / 24px - Regular #45474D

Twitter:

Is:

211263534654

Should:

5473652435

Specs:

Padding: 16px
Avatar: 40x40px - Inner border: 1px rgba(55,64,82,0.18)
Margin between avatar and text: 16px
Name: 15px / 16px - Bold #262626
Margin between name and username: 4px
Username: 15px / 16px - Regular #909399
Date: 13px / 16px - Medium #45474D
Margin between name and message: 4px
Message: 17px / 24px - Regular #45474D

Question: Deployment target

Hi. I just discovered this repo and would like to participate.
I would like to know if there is a reason that the the deployment target is iOS 8.0?

I think the codebase could benefit from even little things like StackViews.
Regards

Avoid empty messages

It's possible to send an empty message. Send button should be disabled until there's at least one character.

Active / Inactive Location Icon

When the map got moved and isn't following my own position the location icon should be outlined as in apple or google maps.

img_4265
img_4266

Dynamic poll rate

We are currently updating the Apps content every 12 seconds or after the user send a message as it's using the same API. This may result in an outdated map especially if a request failed because we are currently waiting another 12 seconds for the next try at which point the app might already be in the background.

It would be nice to be smarter about updating the poll the data every 6 seconds if the app is in foreground and every 12 seconds in background (maybe as well in lower power/ data mode ?). Additionally we should retry sooner, if possible as soon as possible (maybe check for internet connection on iOS 12+ devices https://developer.apple.com/documentation/network/nwpathmonitor)

Observing Mode

Observing mode is for users that want to look at the map without participating in the critical mass.

screenshot

SettingsFooterView uses deprecated API

"Setting the background color on UITableViewHeaderFooterView has been deprecated. Please set a custom UIView with your desired background color to the backgroundView property instead."

Add Snapshot testing

Add Snapshot testing library https://github.com/pointfreeco/swift-snapshot-testing (it supports installation with SPM).

Pros:

  • automatically test how all the screens/views we need to test look on different devices.
  • automatically test how all the screens/views we need to test look in both light and dark modes.
  • automatically test how all the strings on the screens/views we need to test look
  • automatically test how all the strings on the screens/views we need to test look in different localizations (if we have different localizations)
  • don't need to submit before/after screenshots with every PR, because it will be tested automatically

Link support for Chat & Twitter

It would be nice to have interactive links in chat messages and additionally interactive hashtags and username in the Twitter integration that link to the browser or twitter.

Critical Mass simulation for debugging

We are currently don't have a dedicated environment for testing are directly hitting the production backend for debugging and testing. This works for most use cases.

However, some scenarios require a lot of activity on the map. If would be nice if we could mock the data that the App is using locally for test purposes or even replay recorded backend responses.

Testdata can be found here https://github.com/criticalmaps/criticalmaps-testdata

UI Tests

It would be nice to have a infrastructure for UI tests. We could use that for testing but also screenshot to have a quick overview how the app looks like in different languages and device types

iOS 13 Support

Modal presentations

iOS 13 has a new default modal transition.

modal

Do we need some design changes here @zutrinken . Using the old full screen presentation would also be possible

Colors - Darkmode

Our Theming/ Darkmode implementation breaks for some components. Maybe we should adopt to the system Darkmode for iOS 13 Users.
Bildschirmfoto 2019-06-28 um 14 33 36
Bildschirmfoto 2019-06-28 um 14 33 25

Swift Package Manager

It would be nice in my opinion to replace our current dependency manager cocoapods with the Swift Package Manager that is built into Xcode 11. That would allow us to build the project without needing any additional tooling

Rule artworks are clipped

Some Rule artworks are not displayed in the correct ratio

Repro steps

  1. Navigate to Rules
  2. Open "When Driving at the head .. "

Actual Result:
bildschirmfoto 2019-01-22 um 13 09 24

Expected Result:
green

wrong icon state when leaving following mode

Triggering the compass on the map while being in following mode (location arrow with line pointing north) does end following mode, but the tabbar icon stays in following mode.

Crash on chat

Steps to reproduce:

  1. Go to settings
  2. Deactivate GPS
  3. Go to chat
  4. Type a message
  5. Press 'send'

Result: App crashes

Ambiguous auto layout constraints for Settings

Prettified Error

[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x600001778d20 CMAppLogo.height == 56 (active, names: CMAppLogo:0x7f8631f535c0 )>",
"<NSLayoutConstraint:0x600001778050 UILayoutGuide:0x600000e2ea00'UIViewSafeAreaLayoutGuide'.bottom == UIStackView:0x7f8631f52b60.bottom + 32 (active)>",
"<NSLayoutConstraint:0x60000177b070 UIStackView:0x7f8631f52b60.top == UILayoutGuide:0x600000e2ea00'UIViewSafeAreaLayoutGuide'.top + 24 (active)>",
"<NSLayoutConstraint:0x60000177ea80 'UISV-canvas-connection' UIStackView:0x7f8631f52b60.top == CMAppLogo.top (active, names: CMAppLogo:0x7f8631f535c0 )>",
"<NSLayoutConstraint:0x60000177fbb0 'UISV-canvas-connection' V:[CMAppLogo]-(0)-| (active, names: CMAppLogo:0x7f8631f535c0, '|':UIStackView:0x7f8631f52b60 )>",
"<NSLayoutConstraint:0x60000177fa70 'UIView-Encapsulated-Layout-Height' CriticalMaps.SettingsFooterView:0x7f8631f524a0.height == 156 (active)>",
"<NSLayoutConstraint:0x600001779360 'UIViewSafeAreaLayoutGuide-bottom' V:[UILayoutGuide:0x600000e2ea00'UIViewSafeAreaLayoutGuide']-(0)-| (active, names: '|':CriticalMaps.SettingsFooterView:0x7f8631f524a0 )>",
"<NSLayoutConstraint:0x60000177b660 'UIViewSafeAreaLayoutGuide-top' V:|-(0)-[UILayoutGuide:0x600000e2ea00'UIViewSafeAreaLayoutGuide'] (active, names: '|':CriticalMaps.SettingsFooterView:0x7f8631f524a0 )>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x600001778d20 CMAppLogo.height == 56 (active, names: CMAppLogo:0x7f8631f535c0 )>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
2019-04-11 21:37:26.613142+0200 CriticalMaps[2427:80984] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x600001732fd0 V:[UILabel:0x7f8671c72bc0'GPS']-(0)-| (active, names: '|':UITableViewCellContentView:0x7f8671c725a0 )>",
"<NSLayoutConstraint:0x600001733020 V:|-(0)-[UILabel:0x7f8671c72bc0'GPS'] (active, names: '|':UITableViewCellContentView:0x7f8671c725a0 )>",
"<NSLayoutConstraint:0x6000017328f0 UILabel:0x7f8671c72bc0'GPS'.height >= 56 (active)>",
"<NSLayoutConstraint:0x600001733b10 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7f8671c725a0.height == 56 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x6000017328f0 UILabel:0x7f8671c72bc0'GPS'.height >= 56 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
2019-04-11 21:37:26.613667+0200 CriticalMaps[2427:80984] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x6000014d9cc0 UILabel:0x7f8671c8aa70'Website'.centerY == UITableViewCellContentView:0x7f8671c8a880.centerY (active)>",
"<NSLayoutConstraint:0x6000014db7f0 V:[UILabel:0x7f8671c8aa70'Website']-(0)-| (active, names: '|':UITableViewCellContentView:0x7f8671c8a880 )>",
"<NSLayoutConstraint:0x6000014d8e60 UILabel:0x7f8671c8aa70'Website'.height >= 56 (active)>",
"<NSLayoutConstraint:0x60000174d310 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7f8671c8a880.height == 56 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x6000014d8e60 UILabel:0x7f8671c8aa70'Website'.height >= 56 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
2019-04-11 21:37:26.614103+0200 CriticalMaps[2427:80984] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x60000174d810 UILabel:0x7f8631c31920'Twitter'.centerY == UITableViewCellContentView:0x7f8631c31730.centerY (active)>",
"<NSLayoutConstraint:0x60000174d950 V:[UILabel:0x7f8631c31920'Twitter']-(0)-| (active, names: '|':UITableViewCellContentView:0x7f8631c31730 )>",
"<NSLayoutConstraint:0x60000174d7c0 UILabel:0x7f8631c31920'Twitter'.height >= 56 (active)>",
"<NSLayoutConstraint:0x60000174def0 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7f8631c31730.height == 56 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x60000174d7c0 UILabel:0x7f8631c31920'Twitter'.height >= 56 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
2019-04-11 21:37:26.614450+0200 CriticalMaps[2427:80984] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x60000174e1c0 UILabel:0x7f8631c48e50'Facebook'.centerY == UITableViewCellContentView:0x7f8631c48c60.centerY (active)>",
"<NSLayoutConstraint:0x60000174e210 V:[UILabel:0x7f8631c48e50'Facebook']-(0)-| (active, names: '|':UITableViewCellContentView:0x7f8631c48c60 )>",
"<NSLayoutConstraint:0x60000174e0d0 UILabel:0x7f8631c48e50'Facebook'.height >= 56 (active)>",
"<NSLayoutConstraint:0x60000174e940 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7f8631c48c60.height == 56 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x60000174e0d0 UILabel:0x7f8631c48e50'Facebook'.height >= 56 (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

Script for updating our dependencies

It would be nice to have a script to update all our dependencies such as

  • bundle update and bundle exec
  • fastlane snapshot update
  • license-plist
  • swiftformat

Friends

Open Questions/Tasks

  • Verification (Signature?)
  • Verification caching
  • Maps UI
  • Settings UI
  • Storage
  • documentation

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.