[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81153":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":35,"readmeContent":36,"aiSummary":37,"trendingCount":16,"starSnapshotCount":16,"syncStatus":38,"lastSyncTime":39,"discoverSource":40},81153,"OSINT-Mapping-Tool","anonymousRAID\u002FOSINT-Mapping-Tool","anonymousRAID","An OSINT Mapping tool for research.","",null,"JavaScript",225,43,30,3,0,122,183,195,374,4.93,"GNU General Public License v3.0",false,"main",true,[27,28,29,30,31,32,33,34],"google-maps-api","mapping","maps","nodes","osint","osint-tool","osint-tools","osinttool","2026-06-12 02:04:11","\u003Cdiv align=\"center\">\n\n# OSINT Mapping Tool\n\nA small web app for organizing OSINT research. Jot down identifiers (social handles, phones, vehicles, whatever), pin places on a map (Google or OpenStreetMap), and wire the two together. Nothing leaves your browser.\n\n[![React](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReact-18-61dafb?logo=react&logoColor=black)](https:\u002F\u002Freact.dev)\n[![Vite](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FVite-6-646cff?logo=vite&logoColor=white)](https:\u002F\u002Fvitejs.dev)\n[![License: GPL-3.0](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-%20%20GNU%20GPLv3%20-green)](LICENSE)\n[![Local-first](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLocal--first-✓-success)](#privacy)\n\n\u003C\u002Fdiv>\n\n---\n\n## Introduction\n### How does the OSINT Mapping tool work?\n\nThe **Information tab** is a node graph. Each node is one piece of information: an Instagram account, a phone number, a license plate, a family member. Drag a handle to another node to wire them up. Drop the wire on empty space to spawn a new node already connected (Blender style); right-click does the same thing without dragging. Each type has its own form fields and a brand icon, and you can upload your own icons too.\n\nThe **Map tab** is click-to-pin. Drop a pin anywhere, and if the spot is a place the geocoder recognizes (a coffee shop, a school, a park), the name, address, and a fitting icon get filled in for you. There's a search bar for jumping to a place by name. Pins can be linked back to identifiers, so a coffee shop pin can carry \"tagged here by @johndoe on March 14\" with the relevant Instagram account attached. Pick **Google Maps** (richer POI data, needs an API key) or **OpenStreetMap** (no key, no signup) from the gear icon.\n\nEverything saves out to a single `.osint.json` file you can stash anywhere, share, or version-control.\n\n## Screenshots\n\n![Information tab](.\u002Freadme_images\u002FExample1.png)\n![Map tab](.\u002Freadme_images\u002FExample2.png)\n\n\u003Cbr>\n\n\u003Ch2 align=\"center\"> 🛠 Stack \u003C\u002Fh2>\n\n\u003Cdiv align=\"center\">\n\n|Component |Tool |\n|:---|:---|\n| UI | React 18, Vite |\n| Node graph | [`@xyflow\u002Freact`](https:\u002F\u002Freactflow.dev) |\n| Maps | [`@vis.gl\u002Freact-google-maps`](https:\u002F\u002Fvisgl.github.io\u002Freact-google-maps\u002F), [`leaflet`](https:\u002F\u002Fleafletjs.com) + [`react-leaflet`](https:\u002F\u002Freact-leaflet.js.org) |\n| State | React Context (no Redux \u002F no store libs) |\n| Storage | Local JSON files (projects) + `localStorage` (settings, custom icons) |\n\n\u003C\u002Fdiv>\n\n\u003Cbr>\n\n\u003Ch2 align=\"center\"> 🚀 Getting started \u003C\u002Fh2>\n\nYou'll need Node 18+ and npm.\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FanonymousRAID\u002FOSINT-Mapping-Tool\ncd OSINT-Mapping-Tool\nnpm install\nnpm run dev\n```\n\nThen open \u003Chttp:\u002F\u002Flocalhost:5173>.\n\nTo build a production bundle:\n\n```bash\nnpm run build       # writes to .\u002Fdist\nnpm run preview     # serves .\u002Fdist on port 4173\n```\n\n\u003Cbr>\n\n## Setting up Google Maps (optional)\n\nYou only need this if you want Google Maps mode. If you'd rather skip Google Cloud entirely, jump to [OpenStreetMap mode](#openstreetmap-mode). Your key lives only in your browser and never gets committed or sent anywhere else.\n\nIn Google Cloud Console, pick or create a project and:\n\n1. Under **APIs & Services → Library**, enable **Maps JavaScript API**, **Geocoding API**, and **Places API**. Maps JS is required; the other two power address auto-fill and place-type detection.\n2. Under **APIs & Services → Credentials**, make an API key.\n3. On that key, set **Application restrictions → HTTP referrers** and add `http:\u002F\u002Flocalhost:5173\u002F*` for development. This is the only thing keeping the key safe if it ever leaks.\n4. Optional: create a **Map ID** under Maps Management → Map Styles for custom styling. Without one you'll see a console warning but the app still works.\n\nTwo ways to feed the key to the app:\n\n**In-app:** Paste it into the Map tab's setup screen and click Save. It goes into `localStorage`. If you already proceeded without one, the gear icon at the top left opens the same settings.\n\n**Config file:** Copy the template:\n\n```bash\ncp public\u002Fapp.config.example.json public\u002Fapp.config.json\n```\n\nThen fill in your values:\n\n```json\n{\n  \"googleMaps\": {\n    \"apiKey\": \"AIzaSyD…\",\n    \"mapId\": \"abc123def456…\"\n  }\n}\n```\n\n`public\u002Fapp.config.json` is gitignored, so even if you push commits it won't leak.\n\nIf both are set, `localStorage` wins. Clear it from the gear icon to fall back to the file.\n\n## OpenStreetMap mode\n\nDon't feel like dealing with Google Cloud? Open the Map tab's settings (gear icon) and switch the provider to **OpenStreetMap**. Tiles come from openstreetmap.org and search\u002Freverse-geocoding runs through Nominatim. No key, no signup, it's free. POI detection is coarser than Google's, and the per-pin info card doesn't have live place details (rating, hours, etc.) — everything else works the same.\n\n## Saving, opening, and the \"Continue recent\" list\n\nClick **Save** in the top-right and the project downloads as `\u003Cname>.osint.json`. Click **Open Project** on the landing screen to read one back. The format is plain JSON with a schema version, so old files keep loading after upgrades.\n\nWhile you're working, the app also takes a periodic snapshot to `localStorage`. If you accidentally hit the back arrow without saving (this has happened to me more than once), the project shows up under \"Continue recent\" on the landing screen with an \"unsaved\" badge. Pick it and you're back where you were. Up to 5 recent projects are kept per browser.\n\n`.osint.json` is gitignored too, so dropping one in the repo folder won't end up in commits.\n\n## Features in depth\n\n### Information tab\n\nTwenty built-in identifier types across Social, Contact, Personal, Vehicle, and Other, each with its own typed fields (Instagram: username, followers, posts, bio; Vehicle: make, model, year, color, owner; etc.).\n\nConnections:\n- Drag a handle from one node to another to wire them up.\n- Drag to empty space to get a quick-add popup (this also auto-creates the wire to the new node).\n- Right-click the canvas for the same popup without the wire.\n\nIcons:\n- Brand icons for common platforms (Instagram, Facebook, X\u002FTwitter, YouTube, TikTok, LinkedIn, Snapchat, Discord, Telegram, Google, Spotify, WhatsApp).\n- Upload your own. They get stored per-browser, so they're available across all projects on the same install.\n\nEditing shortcuts (suppressed when you're typing in a field or a modal is open):\n- `Ctrl\u002FCmd + Z` undo, `Ctrl\u002FCmd + Shift + Z` or `Ctrl\u002FCmd + Y` redo. Up to 20 actions, kept in memory.\n- `Ctrl\u002FCmd + C \u002F V` to copy\u002Fpaste selected nodes.\n- `Ctrl\u002FCmd + D` to duplicate.\n- `Del` or `Backspace` removes the selection (a node or an edge).\n\nMulti-select with a marquee or `Shift+click`. Anything done to a multi-selection counts as one undo step.\n\n### Map tab\n\nClick anywhere to drop a pin. If the spot is a known place — a Google POI in Google mode, a Nominatim hit in OSM mode — the name, address, and a fitting icon get filled in. Otherwise you get coordinates and fill the rest in.\n\nTen built-in place icons (coffee, food, gym, home, movie, park, amusement park, school, shopping, clothes, library) with light and dark variants that swap with the theme. The icon and color are overridable per-pin.\n\nClicking a pin opens a card with your notes (visited date, who they were with, free-form notes), the identifiers linked to it, and a link out to the live map. In Google mode the card also shows whatever place details Google has on file (rating, opening hours, phone, website).\n\nA \"Connect pins\" toggle in the sidebar draws a dashed line between pins in the order they were dropped. Line color is customizable.\n\n### Cross-linking the two tabs\n\nPins can be linked to one or more identifiers, each link with a short note (\"checked in on IG\", \"registered owner\", \"previous address\"). Click an identifier chip in a pin's card to jump to the Info tab with that node highlighted. Hover an identifier in the Info-tab sidebar and the pins linked to it pulse on the map.\n\n## Project layout\n\n```\nsrc\u002F\n  components\u002F                 UI components (tabs, modals, pickers)\n  context\u002F                    ProjectContext, NodeHistoryContext, NavigationContext, …\n  images\u002F\n    icons\u002F                    place-type pin icons (light + dark)\n    node_icons\u002F               brand icons for identifiers\n  styles\u002F                     global + theme CSS\n  utils\u002F                      projectIO, customIcons, appConfig, recentProjects\n  identifierTypes.js          identifier type registry + resolvers\n  identifierIcons.js          identifier brand-icon registry\n  mapIcons.js                 place-type icon registry + Google-types mapping\n  pinColors.js                pin color palette\n  App.jsx                     landing ↔ project view gate\n  main.jsx                    provider stack + root render\npublic\u002F\n  app.config.example.json     template for your API key (committed)\n  app.config.json             your real key (gitignored)\n```\n\n## Privacy\n\nThere's no backend and no analytics. In Google mode the only outbound calls are the tile\u002FPlaces API requests the browser makes with your own key. In OpenStreetMap mode they go to openstreetmap.org for tiles and nominatim.openstreetmap.org for search — same requests you'd make using their sites directly.\n\nYour settings and custom icon library live in `localStorage` on this browser. Project files (`*.osint.json`) live on whatever disk you saved them to. To wipe everything, clear site data for the origin you're running on and delete the `.osint.json` files.\n\nThe repo's `.gitignore` keeps `app.config.json` and `*.osint.json` out of commits, so accidentally working inside the cloned folder won't leak your key or your research.\n\n## License\n\n[GPL-3.0](LICENSE).\n\n## Contributing\n\nPRs welcome. The only hard rule is: don't add anything that ships data off the user's machine. No analytics, no remote sync, no third-party tracking. If you're not sure whether something crosses that line, open an issue first.\n\n\u003Cbr>\n\u003Cdiv text-align=\"left\">\n  \u003Cp>\n    \u003Cimg src=\"https:\u002F\u002Fcryptologos.cc\u002Flogos\u002Fethereum-eth-logo.svg\" height=\"20px\">\n    &nbsp;&nbsp;&nbsp;0x59bFD011AaAeA85AF644A574a11836673CAcfCD4\n  \u003C\u002Fp>\n  \u003Cp>\n    \u003Cimg src=\"https:\u002F\u002Fcryptologos.cc\u002Flogos\u002Flitecoin-ltc-logo.svg\" width=\"20\">\n    &nbsp;&nbsp;LYxKNT7TAWZAM96Vz2HRxyUmvZbqEqiofe\n  \u003C\u002Fp>\n\u003C\u002Fdiv>\n","OSINT Mapping Tool 是一个用于组织开源情报研究的小型网页应用。其核心功能包括通过节点图记录各种标识符（如社交媒体账号、电话号码等），并在地图上标记位置，支持Google Maps和OpenStreetMap两种地图服务，同时将这些信息关联起来。该工具采用React 18和Vite构建，利用`@xyflow\u002Freact`库实现节点图，使用`@vis.gl\u002Freact-google-maps`和`leaflet`来展示地图数据，并通过本地JSON文件保存所有信息，确保数据不离开用户的浏览器。适用于需要进行开源情报收集与分析的场景，如安全研究、新闻调查等领域。",2,"2026-06-11 04:03:42","CREATED_QUERY"]