dchristl / macless-haystack Goto Github PK
View Code? Open in Web Editor NEWCreate your own AirTag with OpenHaystack, but without the need to own an Apple device
License: GNU General Public License v3.0
Create your own AirTag with OpenHaystack, but without the need to own an Apple device
License: GNU General Public License v3.0
Hello,
I'm currently testing a couple of ESP32 with the OpenHaystack firmware.
Unfortunately there is a big problem with the mail plugin in the MacApp.
I am currently retrieving the coordinates using a Python script.
python scripts/locations_cli.py --key-id XXXXXXXXXXX --private-key YYYYYYY
The output is a list with:
timestamp=datetime.datetime(2023, 8, 24, 17, 12, 49)), LocationReport(latitude=50.9559506, longitude=6.6041557, confidence=156, status=0,
This is all very cumbersome and I wanted to take a look at your project.
There are 2 import options on the web server.
1.Import Accessory and 2.Import from JSON File.
For import accessory need ID and private key (Base64)
I get it from the OpenHaystack (MacApp)
(Right click on the tracker den -> Copy ID (Base64) and Copy private Key B64)
If I add it to the web server - Import Accessory and go to Import, I get the error message: ID must be an integer value.
When importing from JSON file I'm missing the JSON ;-) where or how do I get that?
Hey there!
is there a way to Escape "special characters" in the password entry when creating the macless-haystack docker container in interactive mode?
My password is constructed like this: " %5something5% " . I think it has problems with the % character.
I always get this error message
2024-01-20 11:41:27,605 - DEBUG - Querying http://anisette:6969 for an anisette server
2024-01-20 11:41:27,607 - DEBUG - Starting new HTTP connection (1): anisette:6969
2024-01-20 11:41:27,609 - DEBUG - http://anisette:6969 "GET / HTTP/1.1" 200 566
2024-01-20 11:41:27,611 - DEBUG - Starting new HTTPS connection (1): gsa.apple.com:443
2024-01-20 11:41:28,345 - DEBUG - https://gsa.apple.com:443 "POST /grandslam/GsService2 HTTP/1.1" 200 1269
2024-01-20 11:41:28,347 - WARNING - This implementation only supports s2k. Server returned s2k_fo
Traceback (most recent call last):
File "/app/endpoint/mh_endpoint.py", line 124, in <module>
apple_cryptography.registerDevice()
File "/app/endpoint/register/apple_cryptography.py", line 76, in registerDevice
getAuth(regenerate=True, second_factor='trusted_device' 'sms')
File "/app/endpoint/register/apple_cryptography.py", line 49, in getAuth
mobileme = icloud_login_mobileme(
^^^^^^^^^^^^^^^^^^^^^^
File "/app/endpoint/register/pypush_gsa_icloud.py", line 41, in icloud_login_mobileme
pet = g["t"]["com.apple.gs.idms.pet"]["token"]
~^^^^^
TypeError: 'NoneType' object is not subscriptable
Since no SMS arrives I think the entry of the password is somehow interpreted wrong.
When running the python simplehttp server locally on my machine, I cannot import my JSON file. I can see my accessories after selecting the file, but when I click on import I go back to "There is nothing here yet add accessories to continue"
Not seeing any errors in the terminal. Do I need to place my JSON file somewhere in the web directory before running the http server?
As the title says it, from where do I get this python file?
Hello,
Just wanted to let you know https://dchristl.github.io/headless-haystack is down. Will you be bringing it back up? Thanks I use it daily.
Hey,
I hate to be that guy, but would this work with the original Python implementation @ https://github.com/seemoo-lab/openhaystack/tree/main/Firmware/Linux_HCI ? I am fairly technical, so I'd be happy to help :)
I would love to get this to fly on a Raspberry ;)
Best,
stiller-leser
These are so cheap and easily available trackers, would be real nice to also support as well.
Thanks!
I'm having a difficult time getting the certs right I believe. Lets encrypt drops these certs when created:
sh-3.2# ls README cert.pem chain.pem fullchain.pem privkey.pem
so I tried to ln both the cert.pem and the privkey.pem into the proper directory using these:
sudo ln -s <path_to_private_key> /var/lib/docker/volumes/mh_data/_data/privkey.pem
sudo ln -s <path_to_public_key> /var/lib/docker/volumes/mh_data/_data/certificate.pem
making sure the cert.pem gets renamed to certificate.pem. But I get the SSL protocol error. I suspect I need to combine these certs like I do when using stunnel as a patch on my other server?
I have noticed this behavior for a long time now but was never sure I was not mixing up dates in my head. Now I can 100% confirm this:
From time to time recent location data gets replaced by older location data in the app (e.g. last location of car keys known Today at 7:19 changes to Last location yesterday when refreshing the app. An immediate refresh does not correct this. Sometimes a longer wait (>1 hour) will revert that, sometimes I have to wait for actual new location reports. I tried fetching last location only (my default is 7 days) but no changes (fetched 0 locations) there as well. Could something be wrong with handling what is "most recent"?
Can I run it on linux, since WSL is supported?
Is it likely that apple changes the appleID protocol which would break compatibility?
Or that rarely changes and this project only uses a subset of functions anyway.
Hello there, If I flash the firmware here, is it still compatible with the original openhaystack app on the original repo? I mean is it viewable?
Any tips for getting it to connect correctly with my AppleID? I have has this ApplelD since 2012 and have added a credit card already and it it is still not working after several attempts. I fully removed both containers after each attempt.
Any other things I can do the get my account is good enough standing to get this to work?
When using request_reports.py, the file starts to run, but ends with a problem, that i can not get fixed.
Using python3
{"search": [{"endDate": 714847119000000, "startDate": 714760719000000, "ids":["Rz00000000000000000000000000000000000t1Oc="]}]}
200 OK
121 reports received.
Traceback (most recent call last):
File "/Users/users/Desktop/Standalone/macos-webapplication/Proxy/request_reports.py", line 79, in <module>
eph_key = ec.EllipticCurvePublicKey.from_encoded_point(ec.SECP224R1(), data[5:62])
NameError: name 'ec' is not defined
id is anonymized
The Map fix on Android works like a charm, but today i have had to use the browser and there are the problems like before.
Open Broser on xyz.domain.com
just noticed this today, maybe it was never fixed.
my data belongs to version 1.5.2
trying to run the /macless-haystack server, apple id, pwd, and 2fa code are all correct, could it be that i am using a newly created apple account?
'delegates': {'com.apple.mobileme': {'status': 1, 'status-message': 'Account limit reached.'}}, 'status': 0}
ERROR - Invalid status: 1
ERROR - Error message: Account limit reached.
ERROR - Unable to proceed, program will be terminated.
hello there, I was going to try the web interface, looks like it doesnt understand the response from the python script, the python responds correctly with the list of the payloads but the web just doesnt seem to digest it correctly
Hello we have noticed that there are no location reports for our tags when they are near IOS17 devices. Everything works fine for IOS16 but not 17. Anyone else seeing this and if so any ideas on where the reports are now going?
I have now tried a bit, but am again faced with the problem that the endpoint is online, but only throws Python errors (log from the docker container) as soon as the Android app requests data. A 502 Bad Gateway error then appears in the app. I already had this before when I called mh_endpoint.sh without a container.
New app and old Mac-based endpoint works wonders. The new endpoint shows "NOTHING TO SEE HERE" on Ip:port. I don't know what the problem is.
First of all, the Anisette Server sets up without any problem, but the API-Server does not come up.
When i take the Scripts and dependencies, i can set up an endpoint, without docker.
When i run it with docker, the only log entry is: exec /usr/local/bin/python: exec format error
and the server didn't come up.
i like to compile my own firmware for a newer board ESP32-C2 .were to start cant find that this board is compatable with IDE. i have these nano boards from aliexspress esp8684 wroom 07 . im gona itergrate them into usb cables log output error
[817/819] Linking CXX executable openhaystack.elf
FAILED: openhaystack.elf
cmd.exe /C "cd . && C:\Espressif\tools\riscv32-esp-elf\esp-12.2.0_20230208\riscv32-esp-elf\bin\riscv32-esp-elf-g++.exe -march=rv32imc_zicsr_zifencei -nostartfiles -march=rv32imc_zicsr_zifencei --specs=nosys.specs -Wl,--cref -Wl,--defsym=IDF_TARGET_ESP32C2=0 -Wl,--Map=C:/Users/Ju5t3nc4s3/Documents/macless-haystack-main/firmware/ESP32/build/openhaystack.map -Wl,--no-warn-rwx-segments -fno-rtti -fno-lto -Wl,--gc-sections -Wl,--warn-common -T esp32c2.peripherals.ld -T esp32c2.rom.ld -T esp32c2.rom.api.ld -T esp32c2.rom.rvfp.ld -T esp32c2.rom.newlib.ld -T esp32c2.rom.version.ld -T esp32c2.rom.mbedtls.ld -T esp32c2.rom.newlib-nano.ld -T esp32c2.rom.heap.ld -T memory.ld -T sections.ld @CMakeFiles\openhaystack.elf.rsp -o openhaystack.elf && cd ."
c:/espressif/tools/riscv32-esp-elf/esp-12.2.0_20230208/riscv32-esp-elf/bin/../lib/gcc/riscv32-esp-elf/12.2.0/../../../../riscv32-esp-elf/bin/ld.exe: esp-idf/freertos/libfreertos.a(app_startup.c.obj): in function `main_task':
C:/Espressif/frameworks/esp-idf-v5.1.2/components/freertos/app_startup.c:206: undefined reference to `app_main'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
Apologies in advance if this is a silly question.
But I already have a macbook with openhaystack installed and working well.
I am struggling to link my tags with the headless haystack android app. I have imported all my tags, but cannot seem to retrieve the reports from my Mac.
I was hoping somebody could point me in the right direction.
Thanks
Hi,
I ported your script to python3 (I'm using MacOS Ventura on an HW hackintosh), but for a week now i got 400 bad request errors when I call apple endpoint /fetch.
Am I alone? Is there anyone else with this problem?
I would like to use a reverse proxy I already have on my server to handle HTTPS traffic.
That's why I'd prefer to be able to bind only to localhost. A config option would be handy for this.
As I stated in the title via the mobile app i get no location(Unknown) but in docker I get this JSON object { "results":[ { "datePublished":1707413215833, "payload":"K3VEwQMEoenmdFExNMceJBWtQEqmwMduPxlQv9CECEdMc27L0eRpQqDQbAx9amsWQs4NOM5uU7/80OvxU5Uw8QRpTGmg4raTptg0hWRtCkJRtMOKcVUW1Q==", "description":"found", "id":"6hAIahRUzZGDPl8KdE553DH579yOypu5yFCPKS2lXME=", "statusCode":0 }, { "datePublished":1707413215833, "payload":"K3VE1wMEUL7YCWS+mySFftsDmLO7WYrG1SshC7VDRRlX5NJMpSVB3x+r245Q119TbSuIaKGsqkDL/Dp7+Y9VAxuIH5LJOhuLGI8UFEu/fgwZPaKpxr5fYA==", "description":"found", "id":"6hAIahRUzZGDPl8KdE553DH579yOypu5yFCPKS2lXME=", "statusCode":0 } ], "statusCode":"200" }
Hey,
with the version 2.0 and GitHub website I am encountering the following error when refreshing the position "Could not find location reports. Try again later. Error: ClientException: XMLHttpRequest error., uri=http://localhost:6176"
I can see the requests being received by macless on docker so I am not sure about where is the problem
First of all, nice improvement. I think i like the big dot, where several reports habe been received within a time period. Is it dynamic? Is it growing if there are more locations very near, or is it just a big dot to show, here are more than xy location reports in the last hours?
But there is a bug, the slider "How many days back?" does nothing. a place where ive been on friday is showing, even if i set it to 1 (days back).
I have installed all dependencies, though when attempting to run the generate_keys.py file it reports back the following error.
File "C:\Users\XXX\XXX\esp32-firmware\generate_keys.py", line 6, in
from cryptography.hazmat.primitives.asymmetric import ec
ModuleNotFoundError: No module named 'cryptography'
I am unsure if there is a dependency I have missed, as I have gone through the documentation on this repo and the others linked to no avail.
Any assistance with this error message would be greatly appreciated.
How do you go about flashing the BBC MicroBit V2 with the NRF52? I am not finding much documentation on installing firmware on the device. Just hex compiled programs.
Hi,
first of all, thanks for sharing your code. It looks very promising and for developers like me that are not using MacOS is really useful.
I would like to implement an easy script in python to get my openhaystack device position and integrate it in my AppDaemon and HomeAssistant.
Could you please give me some hints in how to do that? Is it possible to download reports from the FindMy network without running an OSX VM?
I see there is a dependency to objc that is used to get the OTP. Is there a way to work around that?
Thanks you!
Hey @dchristl,
do you think you can integrate some kind of connection for Home-Assistent?
Would be really great to use haystack/findmy data in automations or something like that.
Maybe mqtt can be a start, so home-assistent can autodiscover devices in mqtt and add it without any struggle.
I know there are more people interested, but at the moment, nobody has the knowledge to develop a "bridge".
A few days ago, I suddenly got error messages when I tried to call up location reports. At first I thought, ok, maybe the auth key has expired... So I deleted the auth file. But I just can't get the "fresh" container to run. A corresponding error message is attached below, but I can't quite figure it out...
It doesn't even ask for data such as email and password :(
2024-03-02 23:06:57,911 - DEBUG - Searching for token at /app/endpoint/data/auth.json
2024-03-02 23:06:57,911 - INFO - No auth-token found.
2024-03-02 23:06:57,912 - INFO - Trying to register new device.
2024-03-02 23:06:57,918 - DEBUG - Querying http://anisette:6969 for an anisette server
2024-03-02 23:06:57,921 - DEBUG - Starting new HTTP connection (1): anisette:6969
2024-03-02 23:06:57,925 - DEBUG - http://anisette:6969 "GET / HTTP/1.1" 200 566
2024-03-02 23:06:57,928 - DEBUG - Starting new HTTPS connection (1): gsa.apple.com:443
2024-03-02 23:06:58,570 - DEBUG - https://gsa.apple.com:443 "POST /grandslam/GsService2 HTTP/1.1" 200 904
Traceback (most recent call last):
File "/app/endpoint/mh_endpoint.py", line 159, in <module>
apple_cryptography.registerDevice()
File "/app/endpoint/register/apple_cryptography.py", line 76, in registerDevice
getAuth(regenerate=True, second_factor='trusted_device' 'sms')
File "/app/endpoint/register/apple_cryptography.py", line 49, in getAuth
mobileme = icloud_login_mobileme(
^^^^^^^^^^^^^^^^^^^^^^
File "/app/endpoint/register/pypush_gsa_icloud.py", line 40, in icloud_login_mobileme
g = gsa_authenticate(username, password, second_factor)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/endpoint/register/pypush_gsa_icloud.py", line 76, in gsa_authenticate
if r["sp"] != "s2k":
~^^^^^^
KeyError: 'sp'
I have an apple account with 2FA enabled made for this project. I was already using openhaystack on a MacOS VM.
I was able to set up the docker containers.
But after lanching the docker with docker run -it --restart unless-stopped --name macless-haystack -p 6176:6176 --volume mh_data:/app/endpoint/data --network mh-network christld/macless-haystack
and login with my appleID and password, it keeps asking for 2FA.
I don't receive SMS when it asks for 2FA so I launched my MacOS VM and on settings I clicked on "verification code", so I get a 6 digit code. But putting this one doesn't do the trick and it keeps asking for 2FA.
I tried connecting to icloud.com, and requesting my 2FA via SMS, and not putting this code in my browser for icloud.com but instead putting when macless-haystack asks but the same problem, it keep asking for 2FA.
Does someone know why ?
Hi DChristl,
I'll try again with you, because the others have either not updated to the mac free version, or no longer care about their repos. Also, your developments are always stable and you listen to user input.
Could you please include Owntracks/Mqtt as an option in your project?
The idea of Chapoly was already very promising, but still extremely buggy.
MrMay is unfortunately not developing on the Mac free version, and it was always a kind of add-on and not properly integrated.
I would be really happy if you would take another look at it. I'll help you as much as I can with my limited skills.
I've been experiencing an issue with NRF51822 beacons purchased from AliExpress(http://www.holyiot.com/tp/2019042814310092401.pdf). These beacons work as expected for several hours but then unexpectedly stop transmitting. This issue occurs without any modifications to the firmware (besides patching the firmware with the keyfile .
Steps to Reproduce:
1.Follow README.md precisely with 3 keys per device
2.The beacon transmits signals normally for several hours.
3.After a few hours, the beacon stops transmitting without any manual intervention or apparent cause or change of iPhone nearby.
Expected Behavior:
The beacon should continuously transmit signals until the battery runs out.
Actual Behavior:
The beacon stops transmitting after several hours of normal operation.
Troubleshooting Steps Taken:
Restarted the beacon, which resumes normal operation for a few hours before the issue reoccurs.
No firmware updates or changes were made prior to this issue.
Beacon Model: NRF51822 (AliExpress no external crystals. So I used Board_simple)
Used a BLE tracker to check if signals are still being received from nearby devices.
Additional Information:
This issue has been observed in multiple units of the same model.
If I'm using your frontend hosted on github, I cannot access the server on the local network (or on localhost) because:
Access to XMLHttpRequest at 'https://localhost:6176/' from origin 'https://dchristl.github.io' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Private-Network' header was present in the preflight response for this private network request targeting the
localaddress space.
This is on chromium, firefox reports the same issue but less verbosely:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://localhost:6176/. (Reason: CORS request did not succeed). Status code: (null).
I'm working on an OwnTracks integration. I can get the standalone report_request.py
to work. I run a Bash script every 20 minutes to trigger a request.
I'd really like to use the FindMy_proxy.py
If you could help with the API a little I'd be grateful. As far I can tell it expects a POST request with a JSON body. My guess is, the script expects a list of keys. Does it want the private keys or the prefixes?
{
"days": 1,
"ids": [
"key"
"key"
]
}
Hi there,
i managed to install a dockerized MacOS running Windows 10 + Docker-Desktop + WSL2.
However I struggle with this step of the HowTo (https://github.com/dchristl/headless-haystack/blob/main/OSX-KVM/README.md)
sudo su
cd /var/lib/docker/containers/89f71e516b9f_________
There simply ain't no folder /var/lib/docker/containers
...
Somehow Docker-Desktop in conjunction with WSL2 stores the containers somewhere else but I cannot find the location for the heck of it. Any advice?
Thanks in advance!
First of all, really brilliant work you are doing here.
Is it possible to pack the web client into its own container with auto-update?
I'd like to know if i've add my airtag or anything compatible with Apple's Find My network with my iPhone (Shown in the Find My app), how do i make it show in the Openhaystack Android app? (In this case, i do not have a PREFIX_devices.json
)
Thanks!
With Python 3.11 and the newest cryptography package I get this error:
File "headless-haystack/webserver/request_reports.py", line 142, in <module>
iCloud_decryptionkey = args.key if args.key else retrieveICloudKey()
^^^^^^^^^^^^^^^^^^^
File "headless-haystack/webserver/request_reports.py", line 104, in retrieveICloudKey
db_key = unpad(decrypt(db_key_enc, algorithms.TripleDES(master_key), modes.CBC(db_key_IV)), algorithms.TripleDES.block_size)[:24]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "headless-haystack/webserver/request_reports.py", line 36, in unpad
return unpadder.update(paddedBinary) + unpadder.finalize()
^^^^^^^^^^^^^^^^^^^
File "python3.11/site-packages/cryptography/hazmat/primitives/padding.py", line 159, in finalize
result = _byte_unpadding_check(
^^^^^^^^^^^^^^^^^^^^^^
File "python3.11/site-packages/cryptography/hazmat/primitives/padding.py", line 101, in _byte_unpadding_check
raise ValueError("Invalid padding bytes.")
ValueError: Invalid padding bytes.
Reading about the deployment for esp32, where do I get the firmware? So bootloader.bin, firmware.bin and partitions.bin ?
It would be nice to add OTA updates support to the firmwares.
Hello there,
Yesterday I have successfully installed macless-haystack on a Raspberry Pi. (v2.1.0)
Thank you very much for this awesome project!
I got the endpoint working and also the Android App works okay.
However the self-hosted Webapplication has some weird problem.
For several reasons self-hosting the Webapplication ist a must for my use case.
So what are the probems:
What I did:
Any Ideas how to debug this problem?
There was an error
1
/headless-haystack-non_verifiable_keys/webserver/request_reports.py", line 80, in <module>
eph_key = ec.EllipticCurvePublicKey.from_encoded_point(ec.SECP224R1(), data[5:62])
NameError: name 'ec' is not defined
had to add
from cryptography.hazmat.primitives.asymmetric import ec
2
add webserver/requirements.txt
with all dependencies
File "apple_cryptography.py", line 15, in
import objc, six, sys
ModuleNotFoundError: No module named 'objc'
ModuleNotFoundError: No module named 'Foundation'
I started the container via:
docker run -it \
--device /dev/kvm \
-p 50922:10022 \
-p 56176:6176 \
-p 56443:6443 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e "DISPLAY=${DISPLAY:-:0.0}" \
-e GENERATE_UNIQUE=true \
-e ADDITIONAL_PORTS='hostfwd=tcp::6176-:6176,hostfwd=tcp::6443-:6443,' \
-e WIDTH=1024 \
-e HEIGHT=768 \
-e MASTER_PLIST_URL=https://raw.githubusercontent.com/dchristl/headless-haystack/main/OSX-KVM/custom.plist \
sickcodes/docker-osx:auto
In the container, I downloaded OpenHaystack and started it. Got the error message: "You can't use this version fo the application "OpenHAystack " with this version of macOS."
I then tried:
docker run -it \
--device /dev/kvm \
-p 50922:10022 \
-p 56176:6176 \
-p 56443:6443 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e "DISPLAY=${DISPLAY:-:0.0}" \
-e GENERATE_UNIQUE=true \
-e ADDITIONAL_PORTS='hostfwd=tcp::6176-:6176,hostfwd=tcp::6443-:6443,' \
-e WIDTH=1024 \
-e HEIGHT=768 \
-e MASTER_PLIST_URL=https://raw.githubusercontent.com/dchristl/headless-haystack/main/OSX-KVM/custom.plist \
sickcodes/docker-osx:big-sur
but it would not startup, instead I had to install the system, but failed as it said "disk locked" in some step.
dd: no value specified for seek
I'm getting this error while trying to run this command:
xxd -p -c 100000 PREFIX_keyfile | xxd -r -p | dd of=nrf52_firmware.bin skip=1 bs=1 seek=$(grep -oba OFFLINEFINDINGPUBLICKEYHERE! nrf52_firmware.bin | cut -d ':' -f 1) conv=notrunc
I also tried running grep and got nothing as a response:
grep -oba OFFLINEFINDINGPUBLICKEYHERE! nrf52_firmware.bin | cut -d ':' -f 1
I compiled the .bin
files again. Something that I need clarification on is how this command would look for a string in a binary file.
I tried replacing OFFLINEFINDINGPUBLICKEYHERE!
with the actual PUB KEY (which doesn't make sense), but I still did it.
What could be happening?
Appreciate the repo!
Is there somebody else, that have problems with the map, when opening web or android Application?
I always have to zoom out a bit and then it works nicely. Sometimes the map didn't come back, when zooming in to much, so you have to restart the browser/app.
Tried this several times with the "original" openhaystack app, there are no mistakes like that.
I'm using the generate_keys.py to make advertisement keys for the ESP32.
Inside the ESP32 I verify the public key with the code from https://github.com/positive-security/send-my
I read the keys in from the FILE.keys and call: is_valid_pubkey( key_pointer ).
About 50% of the keys do not verify. And furthermore the sequence:
set_addr_from_key( rnd_addr, key_pointer );
memcpy( settingsV.adv_data, raw_adv_data, sizeof( raw_adv_data ));
set_payload_from_key( settingsV.adv_data, key_pointer );
set_advertising( rnd_addr );
often results in a fail setting the random address due to address errors (like C0000000000)
It would be nice to include a public key verification function during generation similar
to the test for '/' in the hashed key.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.