Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ Each folder in this repo is a standalone project. Dive in to see how to solve re
| [bestbet](./bestbet) | Sports betting odds comparison tool |
| [tinyskills](./tinyskills) | Multi-source AI skill guide generator |
| [competitor-analysis](./competitor-analysis) | a Live Competitive Pricing Intelligence Dashboard |
| [silicon-signal](./silicon-signal) | Semiconductor supply chain tracker for lifecycle, availability, and lead-time signals |
| [stay-scout-hub](./stay-scout-hub) | Searches across all sites for places to stay when travel for conventions or events |
| [summer-school-finder](./summer-school-finder) | Discover and compare summer school programs from universities around the world |

Expand Down
41 changes: 41 additions & 0 deletions silicon-signal/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# env files (can opt-in for committing if needed)
.env*

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts
56 changes: 56 additions & 0 deletions silicon-signal/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Silicon Signal

Live link: https://silicon-signal.vercel.app/

## What it is
Silicon Signal is a real-time semiconductor tracking tool that scans distributor and foundry pages to surface lifecycle, availability, lead time, and pricing signals. It uses the TinyFish web agent (Mino) to drive live web navigation and DOM-level extraction.

## Demo video
![Demo](image.png)

## TinyFish API usage (snippet)
```ts
if (process.env.MINO_API_KEY) {
agentLogs.push(`${logPrefix} System Status: Successfully detected MINO_API_KEY. Secure link established.`);
}

const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'],
});
```

## How to run
1. Install deps: `npm install`
2. Create `.env.local`:
```
MINO_API_KEY=your_tinyfish_key
```
3. Start dev server: `npm run dev`

## Architecture diagram
```mermaid
graph TD
User([User]) -->|Inputs Part #| DP[Dashboard / PlatformView]

subgraph "Core Backend"
API[API: /api/scan]
Store[(Historical Snapshot Store)]
Engine[Technical Assessment Engine]
end

subgraph "Tracking Layer (Tinyfish/Mino)"
Crawler[Automated Crawler]
DOM[DOM Extraction Engine]
Sources((Live Web Sources))
end

DP -->|Request| API
API -->|Deploy| Crawler
Crawler -->|Navigate| Sources
Sources -->|Telemetry| DOM
DOM -->|Parsed Data| Engine
Store <-->|History Link| Engine
Engine -->|Structured Report| API
API -->|Result| DP
```
149 changes: 149 additions & 0 deletions silicon-signal/data/history.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
{
"STFM4567": {
"snapshots": [
{
"timestamp": "2026-01-20",
"lifecycle_status": "Active",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Limited"
}
]
},
"STM3467FT": {
"snapshots": [
{
"timestamp": "2026-01-20",
"lifecycle_status": "Unknown",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
}
]
},
"STM32F103C8T6": {
"snapshots": [
{
"timestamp": "2026-01-20",
"lifecycle_status": "NRND",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Limited",
"risk_score": 15
},
{
"timestamp": "2026-01-29",
"lifecycle_status": "Unknown",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
},
{
"timestamp": "2026-01-30",
"lifecycle_status": "Unknown",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
}
]
},
"PIC16F877A-I/P": {
"snapshots": [
{
"timestamp": "2026-01-20",
"lifecycle_status": "Active",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Limited",
"risk_score": 40
}
]
},
"STM32F103C87": {
"snapshots": [
{
"timestamp": "2026-01-29",
"lifecycle_status": "NRND",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Limited",
"risk_score": 85
}
]
},
"ATmega328P": {
"snapshots": [
{
"timestamp": "2026-01-29",
"lifecycle_status": "Active",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
},
{
"timestamp": "2026-01-30",
"lifecycle_status": "Active",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
}
]
},
"NE555": {
"snapshots": [
{
"timestamp": "2026-01-29",
"lifecycle_status": "Active",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
},
{
"timestamp": "2026-01-30",
"lifecycle_status": "Active",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
}
]
},
"ESP32-WROOM-32": {
"snapshots": [
{
"timestamp": "2026-01-29",
"lifecycle_status": "Unknown",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
},
{
"timestamp": "2026-01-30",
"lifecycle_status": "Unknown",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
}
]
},
"LM358": {
"snapshots": [
{
"timestamp": "2026-01-30",
"lifecycle_status": "Unknown",
"lead_time_weeks": 0,
"moq": 0,
"availability": "Unknown",
"risk_score": 50
}
]
}
}
25 changes: 25 additions & 0 deletions silicon-signal/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";

const eslintConfig = defineConfig([
...nextVitals,
...nextTs,
// Override default ignores of eslint-config-next.
globalIgnores([
// Default ignores of eslint-config-next:
".next/**",
"out/**",
"build/**",
"next-env.d.ts",
]),
{
rules: {
"eqeqeq": "error",
"no-var": "error",
"prefer-const": "error",
},
},
]);

export default eslintConfig;
Binary file added silicon-signal/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions silicon-signal/next.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { NextConfig } from "next";
import path from "path";

const nextConfig: NextConfig = {
turbopack: {
root: path.resolve(__dirname),
},
};

export default nextConfig;
Loading