{"id":50831046,"url":"https://github.com/darshjoshi/pitwall","last_synced_at":"2026-06-13T23:06:24.012Z","repository":{"id":344692019,"uuid":"1182487452","full_name":"darshjoshi/pitwall","owner":"darshjoshi","description":"Turn Claude into your F1 race engineer — 67 MCP tools for telemetry, strategy, and 75 years of race history","archived":false,"fork":false,"pushed_at":"2026-03-23T07:03:33.000Z","size":828,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-03T03:30:54.671Z","etag":null,"topics":["claude","f1","fastf1","formula1","mcp","mcp-server","telemetry"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/darshjoshi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-15T15:35:33.000Z","updated_at":"2026-03-23T15:06:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/darshjoshi/pitwall","commit_stats":null,"previous_names":["darshjoshi/pitwall"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/darshjoshi/pitwall","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darshjoshi%2Fpitwall","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darshjoshi%2Fpitwall/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darshjoshi%2Fpitwall/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darshjoshi%2Fpitwall/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/darshjoshi","download_url":"https://codeload.github.com/darshjoshi/pitwall/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darshjoshi%2Fpitwall/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34303303,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude","f1","fastf1","formula1","mcp","mcp-server","telemetry"],"created_at":"2026-06-13T23:06:21.089Z","updated_at":"2026-06-13T23:06:24.006Z","avatar_url":"https://github.com/darshjoshi.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- mcp-name: io.github.darshjoshi/pitwall --\u003e\n\u003ch1 align=\"center\"\u003ePitwall\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eTurn Claude into your F1 race engineer.\u003c/strong\u003e\u003cbr\u003e\n  Real telemetry. Real strategy data. Real-time during races. 75 years of history.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://pypi.org/project/f1pitwall/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/f1pitwall?color=orange\u0026label=PyPI\" alt=\"PyPI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pypi.org/project/f1pitwall/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/dm/f1pitwall?color=blue\u0026label=Downloads\" alt=\"Downloads\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-green.svg\" alt=\"License: MIT\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.python.org/downloads/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Python-3.10+-blue.svg\" alt=\"Python 3.10+\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://modelcontextprotocol.io\"\u003e\u003cimg src=\"https://img.shields.io/badge/MCP-Compatible-purple.svg\" alt=\"MCP Compatible\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/darshjoshi/pitwall/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/darshjoshi/pitwall?style=social\" alt=\"GitHub Stars\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/darshjoshi/pitwall/main/assets/ver_vs_nor_abu_dhabi_2024_quali.png\" alt=\"Verstappen vs Norris — Abu Dhabi 2024 Qualifying Speed Trace\" width=\"700\"\u003e\n\u003c/p\u003e\n\n---\n\n## Quick Start\n\n```bash\npip install f1pitwall\nclaude mcp add pitwall -- f1pitwall\n```\n\nThen ask Claude: *\"Who won the 2025 Australian GP?\"*\n\n\u003e Want visual plots and deep analysis? `pip install \"f1pitwall[full]\"`\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eInstall from source instead\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\ngit clone https://github.com/darshjoshi/pitwall.git \u0026\u0026 cd pitwall\npip install \"mcp[cli]\" requests        # lite\npip install -r requirements-full.txt   # full\nclaude mcp add pitwall -- python3 $(pwd)/pitwall.py\n```\n\n\u003c/details\u003e\n\n---\n\n## Why Pitwall?\n\nClaude knows F1 from training data — but it can't look up last week's race. It can't show you Verstappen's throttle trace through Turn 1. It doesn't know who pitted first or when the safety car came out.\n\nPitwall connects Claude to **live F1 data**:\n\n- **Real data, not hallucinations** — actual timing feeds from formula1.com\n- **Lap-level telemetry** — speed, RPM, throttle, brake, gear, DRS at 4Hz per car\n- **Visual plots** — speed trace comparisons, gear shift maps returned as images\n- **75 years of history** — every race result and championship since 1950\n- **Live during races** — real-time positions, gaps, weather, and race control\n- **Zero API keys** — all core data is free, no account needed\n\n---\n\n## What You Can Ask\n\n```\n\"Who won the 2025 Australian GP?\"           → Race results and classification\n\"Verstappen's speed on lap 25 at Monaco\"    → Lap telemetry at 4Hz\n\"Plot Hamilton vs Norris speed trace\"       → Visual speed comparison chart\n\"Compare Ferrari's tyre strategy\"           → Stint-by-stint breakdown\n\"Who won the 1994 championship?\"            → 75 years of history\n\"When was the safety car at Silverstone?\"   → Race control messages and flags\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eSee all example questions\u003c/strong\u003e\u003c/summary\u003e\n\n| Question | Tool Used |\n|----------|-----------|\n| \"Who won the Chinese GP?\" | `get_standings` |\n| \"What was Verstappen's speed on lap 25?\" | `get_telemetry` |\n| \"Compare Hamilton vs Leclerc\" | `get_driver_comparison` |\n| \"What tyres did everyone use?\" | `get_tyre_strategy` |\n| \"Fastest pit stop at Australia 2025?\" | `get_pit_stops` |\n| \"When was the safety car?\" | `get_race_control` |\n| \"Was it raining during the race?\" | `get_weather` |\n| \"Top speeds at Monza 2024?\" | `get_speed_traps` |\n| \"Norris's lap times in the race\" | `get_lap_times` |\n| \"Who won the 2005 championship?\" | `get_championship_standings` |\n| \"Plot Verstappen vs Hamilton speed trace\" | `plot_telemetry_comparison` |\n| \"Show me the gear shift map at Monaco\" | `plot_gear_shifts` |\n| \"Who gained the most positions?\" | `compare_grid_to_finish` |\n| \"Overtakes in the race\" | `detect_overtakes` |\n| \"Compare Verstappen lap 5 vs lap 50\" | `plot_multi_telemetry_comparison` |\n| \"Ferrari head-to-head in qualifying\" | `team_head_to_head` |\n| \"Deleted laps in qualifying\" | `get_deleted_laps` |\n| \"Gap to leader throughout the race\" | `get_gap_to_leader` |\n\n\u003c/details\u003e\n\n---\n\n## Features\n\n**67 tools** across two modes. Pitwall auto-detects what's installed — no config changes needed.\n\n### Lite Mode (14 tools)\n\n`pip install \"mcp[cli]\" requests` — no heavy dependencies.\n\nRace results, lap times, telemetry, tyre strategy, pit stops, weather, race control, speed traps, driver comparison, and historical data back to 1950. Uses F1's free static archive and the Jolpica API.\n\n### Full Mode (67 tools)\n\n`pip install -r requirements-full.txt` — adds [FastF1](https://github.com/theOehrly/Fast-F1).\n\nEverything in Lite, plus:\n\n| Category | What You Get |\n|----------|-------------|\n| **Visual Plots** | Speed trace comparisons, gear shift maps, multi-lap telemetry overlays |\n| **Deep Telemetry** | Brake point analysis, RPM patterns, DRS usage, throttle traces |\n| **Advanced Strategy** | Stint degradation, compound comparisons, tire age performance |\n| **Race Intelligence** | Overtake detection, gap tracking, position changes, qualifying progression |\n| **Live Data** | Real-time positions, lap times, sector times, weather during active sessions |\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eFull tool list (67 tools)\u003c/strong\u003e\u003c/summary\u003e\n\n#### Lite Tools (always available)\n| Tool | Description |\n|------|-------------|\n| `list_seasons` | Available seasons (2018-present) |\n| `list_races` | Full season calendar with dates |\n| `get_race_info` | Session details and available data feeds |\n| `get_standings` | Race classification — positions, gaps, best laps, pits |\n| `get_lap_times` | Lap-by-lap times, filterable by driver and lap range |\n| `get_telemetry` | Speed, RPM, throttle, brake, gear, DRS for a specific lap |\n| `get_tyre_strategy` | Compound, stint length, new/used for every driver |\n| `get_pit_stops` | All pit stops sorted by fastest |\n| `get_race_control` | Flags, penalties, safety cars, investigations |\n| `get_weather` | Air/track temp, rain, humidity, wind |\n| `get_speed_traps` | Speed at 4 measurement points per driver |\n| `get_driver_comparison` | Head-to-head: position, pace, strategy, pit stops |\n| `get_historical_results` | Race results from 1950 to present |\n| `get_championship_standings` | Driver/constructor championships from 1950+ |\n\n#### FastF1 Tools (requires FastF1)\n| Category | Tools |\n|----------|-------|\n| **Visual Plots** | `plot_telemetry_comparison`, `plot_gear_shifts`, `plot_multi_telemetry_comparison`, `plot_driver_telemetry_comparison` |\n| **Telemetry Analysis** | `analyze_brake_points`, `analyze_rpm_data`, `analyze_drs_usage` |\n| **Lap Analysis** | `get_lap_times_fastf1`, `get_deleted_laps`, `analyze_lap_consistency`, `get_fastest_sectors`, `get_personal_best_laps`, `compare_sector_times` |\n| **Strategy** | `get_driver_tyre_detail`, `get_stint_analysis`, `compare_tire_compounds`, `compare_tire_age_performance`, `analyze_starting_tires`, `compare_strategies` |\n| **Race Analysis** | `get_race_results`, `get_sprint_results`, `get_session_summary`, `get_fastest_lap_data`, `detect_overtakes`, `compare_grid_to_finish`, `get_qualifying_progression` |\n| **Pit Stops** | `get_pit_stop_detail`, `get_fastest_pit_stops` |\n| **Driver \u0026 Team** | `get_driver_info`, `get_driver_standings`, `get_constructor_standings`, `team_head_to_head`, `get_team_laps`, `analyze_long_run_pace` |\n| **Track \u0026 Safety** | `get_circuit_info`, `get_track_status`, `get_track_record`, `get_race_control_messages`, `get_penalties`, `get_dnf_list` |\n| **Speed \u0026 Position** | `get_speed_trap_comparison`, `get_position_changes`, `get_gap_to_leader` |\n| **History** | `get_race_winners_history` |\n| **Live Data** | `get_live_session_status`, `get_live_positions`, `get_live_lap_times`, `get_live_sector_times`, `get_live_telemetry`, `get_live_weather` |\n| **Session** | `get_schedule`, `get_session_info`, `get_weather_data` |\n\n\u003c/details\u003e\n\n---\n\n## Setup\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003emacOS\u003c/strong\u003e\u003c/summary\u003e\n\n**Claude Code:**\n```bash\nclaude mcp add pitwall -- python3 /absolute/path/to/pitwall.py\n```\n\n**Claude Desktop** — add to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n```json\n{\n  \"mcpServers\": {\n    \"pitwall\": {\n      \"command\": \"python3\",\n      \"args\": [\"/absolute/path/to/pitwall.py\"]\n    }\n  }\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWindows\u003c/strong\u003e\u003c/summary\u003e\n\n**1. Find your Python path:**\n```cmd\nwhere python\n```\nThis will return something like `C:\\Users\\YourName\\AppData\\Local\\Programs\\Python\\Python313\\python.exe` or `C:\\Python313\\python.exe`.\n\n**2. Note where you cloned Pitwall:**\nFor example: `C:\\Users\\YourName\\Projects\\pitwall\\pitwall.py`\n\n**Claude Code (PowerShell):**\n```powershell\nclaude mcp add pitwall -- python C:\\Users\\YourName\\Projects\\pitwall\\pitwall.py\n```\n\n**Claude Desktop** — add to `%APPDATA%\\Claude\\claude_desktop_config.json`:\n\n\u003e To open this folder, press `Win + R`, type `%APPDATA%\\Claude`, and hit Enter. If the `Claude` folder or `claude_desktop_config.json` doesn't exist, create them.\n\n```json\n{\n  \"mcpServers\": {\n    \"pitwall\": {\n      \"command\": \"python\",\n      \"args\": [\"C:\\\\Users\\\\YourName\\\\Projects\\\\pitwall\\\\pitwall.py\"]\n    }\n  }\n}\n```\n\n\u003e **Note:** Use double backslashes (`\\\\`) in the JSON path, or forward slashes (`/`) — both work. The command is `python` (not `python3`) on Windows.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eLinux\u003c/strong\u003e\u003c/summary\u003e\n\n**Claude Code:**\n```bash\nclaude mcp add pitwall -- python3 /absolute/path/to/pitwall.py\n```\n\n**Claude Desktop** — add to `~/.config/Claude/claude_desktop_config.json`:\n```json\n{\n  \"mcpServers\": {\n    \"pitwall\": {\n      \"command\": \"python3\",\n      \"args\": [\"/absolute/path/to/pitwall.py\"]\n    }\n  }\n}\n```\n\u003c/details\u003e\n\nRestart Claude Code or Claude Desktop after setup. Works with any MCP-compatible client.\n\n### Optional: Beginner-Friendly Skill (Claude Desktop)\n\nUpload `SKILL.md` as a skill in Claude Desktop (Settings → Skills → Upload). Claude will explain F1 jargon inline — DRS, undercut, compound, safety car, etc.\n\n---\n\n## Data Sources\n\nAll core data is **free and requires no API keys**.\n\n| Source | Coverage | What it provides |\n|--------|----------|-----------------|\n| [F1 Static Live Timing](https://livetiming.formula1.com/static/) | 2018-present | Telemetry, timing, strategy, pit stops, weather, race control |\n| [Jolpica-F1](https://api.jolpi.ca/ergast/f1/) | 1950-present | Historical results and championships |\n| [FastF1](https://github.com/theOehrly/Fast-F1) (optional) | 2018-present | Enhanced telemetry analysis and visual plots |\n| [F1 SignalR Core](https://livetiming.formula1.com/signalrcore) (optional) | Live only | Real-time race data during active sessions |\n\n---\n\n## How It Works\n\nPitwall reads from F1's publicly available static timing archive — the same data that powers the official F1 app. After each session ends (~30 minutes), F1 publishes 33 data feeds per session including full car telemetry (speed, RPM, throttle, brake, gear, DRS at ~4Hz per car), GPS positions, tyre data, pit stops, and race control messages.\n\nThe telemetry tool (`get_telemetry`) correlates the timing stream with the car data stream to extract telemetry for a specific driver on a specific lap — something no other F1 MCP server does.\n\n### Architecture\n\n```\nClaude ──MCP──\u003e Pitwall ──HTTP──\u003e livetiming.formula1.com/static/ (free)\n                       ──HTTP──\u003e api.jolpi.ca/ergast/f1/ (free)\n                       ──lib──\u003e  FastF1 (optional, local)\n                       ──WS───\u003e SignalR Core (optional, live races)\n```\n\n### Running the Server\n\n```bash\npython3 pitwall.py              # MCP stdio (Claude Code / Claude Desktop)\npython3 pitwall.py --http       # MCP HTTP (remote / self-hosted)\npython3 pitwall.py --http --port 3000\n```\n\n---\n\n## Live Race Data\n\nPitwall includes a raw SignalR Core WebSocket client for real-time data during active F1 sessions. Most data is free — car telemetry and GPS require an F1 TV Pro or Premium subscription.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhat's free vs what needs F1 TV\u003c/strong\u003e\u003c/summary\u003e\n\n| Data | Free | F1 TV |\n|------|------|-------|\n| Race positions, gaps, lap times | Yes | Yes |\n| Race control, flags, penalties | Yes | Yes |\n| Weather, track status | Yes | Yes |\n| Tyre compounds, stint info | Yes | Yes |\n| Team radio URLs | Yes | Yes |\n| **Car telemetry** (speed, RPM, throttle, brake) | No | **Yes** |\n| **GPS positions** (X/Y/Z coordinates) | No | **Yes** |\n\n\u003e All data (including telemetry and GPS) becomes **free** in the static archive ~30 minutes after a session ends.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAuthentication setup\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\npython3 auth_setup.py\n```\n\nThis opens a browser for F1 TV login. The token is saved locally:\n- `\u003cproject_dir\u003e/.f1token`\n- `~/Library/Application Support/fastf1/f1auth.json` (macOS)\n\nToken expires every ~4 days. Re-run to refresh. Never uploaded anywhere.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eLive client usage\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport asyncio\nfrom signalr_client import F1LiveClient\n\nasync def main():\n    # Free mode — timing, weather, race control (no auth needed)\n    client = F1LiveClient(no_auth=True)\n\n    @client.on(\"TimingData\")\n    def on_timing(data, timestamp):\n        for num, info in data.get(\"Lines\", {}).items():\n            print(f\"P{info.get('Position','?')} #{num} Gap: {info.get('GapToLeader','')}\")\n\n    @client.on(\"RaceControlMessages\")\n    def on_rc(data, timestamp):\n        for msg in data.get(\"Messages\", {}).values():\n            print(f\"[{msg.get('Flag', '')}] {msg.get('Message', '')}\")\n\n    await client.connect()\n\nasyncio.run(main())\n```\n\nFor full telemetry (speed, RPM, throttle, brake, GPS):\n\n```python\nfrom auth_setup import load_token\n\nclient = F1LiveClient(no_auth=False, auth_token=load_token())\n\n@client.on(\"CarData.z\")\ndef on_telemetry(data, timestamp):\n    # Speed, RPM, throttle, brake, gear, DRS at ~4Hz per car\n    ...\n\n@client.on(\"Position.z\")\ndef on_position(data, timestamp):\n    # GPS X/Y/Z coordinates at ~4Hz per car\n    ...\n```\n\n\u003c/details\u003e\n\n---\n\n## Reference\n\n### Race Names\n\nRace names are fuzzy-matched. All of these work:\n\n```\n\"china\", \"chinese\", \"shanghai\"           → Chinese Grand Prix\n\"australia\", \"melbourne\", \"aus\"          → Australian Grand Prix\n\"monaco\", \"monte carlo\"                  → Monaco Grand Prix\n\"silverstone\", \"great britain\", \"british\" → British Grand Prix\n```\n\n### Driver Codes\n\n```\nVER = Verstappen    HAM = Hamilton    NOR = Norris     LEC = Leclerc\nANT = Antonelli     RUS = Russell     PIA = Piastri    BEA = Bearman\nGAS = Gasly         LAW = Lawson      HAD = Hadjar     SAI = Sainz\nALO = Alonso        STR = Stroll      OCO = Ocon       BOT = Bottas\nALB = Albon         HUL = Hulkenberg  COL = Colapinto  LIN = Lindblad\n```\n\n### Project Files\n\n| File | Purpose |\n|------|---------|\n| `pitwall.py` | MCP server — 67 tools, auto-degrades to 14 without FastF1 |\n| `signalr_client.py` | Raw SignalR Core WebSocket client for live race data |\n| `decompressor.py` | Zlib decompression for CarData.z / Position.z |\n| `merger.py` | Keyframe + delta state management for F1's incremental format |\n| `topics.py` | All 20 SignalR topics with auth/compression metadata |\n| `auth_setup.py` | F1 TV token setup — browser-based OAuth flow |\n\n---\n\n## Contributing\n\nFound a bug? Want to add a tool? Contributions are welcome.\n\n1. Fork the repo\n2. Create a feature branch\n3. Make your changes\n4. Run the test suite: `python3 tests/pitwall_tool_validation.py`\n5. Open a pull request\n\n---\n\n## Credits\n\n- [FastF1](https://github.com/theOehrly/Fast-F1) by @theOehrly — the gold standard F1 Python library\n- [Jolpica-F1](https://github.com/jolpica/jolpica-f1) — the Ergast API successor\n- [drivenrajat/f1](https://github.com/drivenrajat/f1) — inspiration for FastF1 tool patterns\n\n## Built by\n\n**Darsh Joshi** — AI Engineer\n\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-darshjoshi-blue?logo=linkedin)](https://linkedin.com/in/darshjoshi)\n[![GitHub](https://img.shields.io/badge/GitHub-darshjoshi-black?logo=github)](https://github.com/darshjoshi)\n[![Email](https://img.shields.io/badge/Email-contact@darshjoshi.com-red?logo=gmail)](mailto:contact@darshjoshi.com)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarshjoshi%2Fpitwall","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarshjoshi%2Fpitwall","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarshjoshi%2Fpitwall/lists"}