Skip to content
Merged
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
12 changes: 8 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,17 +112,21 @@ A few practical suggestions:
- use the canonical site URL
- check that the link works before submitting

## About MIDIWeb
## About MIDIWeb Browser

**MIDIWeb** is a browser for Apple platforms that helps users explore websites using WebMIDI.
**[MIDIWeb Browser](https://apps.apple.com/gb/app/midiweb-browser/id6757226617)** is an App for Apple platforms that helps users explore websites using WebMIDI.

If you are browsing on **iOS**, **iPadOS**, **macOS**, or **visionOS**, MIDIWeb offers a dedicated way to access WebMIDI experiences on Apple devices.
If you are browsing on **iOS**, **iPadOS**, **macOS**, or **visionOS**, [MIDIWeb](https://apps.apple.com/gb/app/midiweb-browser/id6757226617) offers a dedicated way to access WebMIDI experiences on Apple devices.

Find out more at **[midiweb.cc](https://midiweb.cc)**.

## Sponsorship

MIDIWeb Hub may recognise supporters who help fund the MIDIWeb Browser and/or MIDIWeb Hub projects. Sponsorship does not guarantee inclusion, ranking, endorsement, or editorial preference. All listed sites must still be relevant to WebMIDI, browser-based music-making, music learning, or creative music technology.

## Independence and non-affiliation

**MIDIWeb** and **MIDIWeb Hub** are independent projects created by **5of12**.
**MIDIWeb Browser** and **MIDIWeb Hub** are independent projects created by **5of12**.

They are **not affiliated with, endorsed by, sponsored by, or officially connected with The MIDI Association**. Any references to MIDI, WebMIDI, MIDI standards, or related technologies are used for descriptive and informational purposes only.

Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MIDIWeb Hub</title>
<title>MIDIWeb Hub - WebMIDI Directory</title>
</head>
<body>
<div id="root"></div>
Expand Down
6 changes: 3 additions & 3 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -153,9 +153,9 @@ export default function App() {
</span>
</h2>
<p className="text-lg text-zinc-400 leading-relaxed">
A curated directory of synthesizers, utilities, and experiments that
A lovingly curated directory of synths, utilities, teaching tools and experiments that
leverage the Web MIDI API directly in your browser. Connect your
MIDI controller and start playing.
MIDI controller and start playing!
</p>
</div>

Expand Down Expand Up @@ -246,7 +246,7 @@ export default function App() {
<button
key={tag}
onClick={() => toggleTag(tag)}
className={`px-3 py-1.5 text-sm font-medium rounded-lg border transition-all duration-200 ${
className={`px-3 py-1.5 text-xs font-medium rounded-lg border transition-all duration-200 ${
isSelected
? 'bg-emerald-500/10 border-emerald-500/50 text-emerald-400'
: 'bg-zinc-900 border-zinc-800 text-zinc-400 hover:border-zinc-700 hover:text-zinc-200'
Expand Down
17 changes: 12 additions & 5 deletions src/components/SiteCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,18 @@ export function SiteCard({ site, status }: SiteCardProps) {
</div>
</div>

<h3 className={`text-lg font-semibold mb-2 transition-colors ${
status === 'down' ? 'text-orange-400 group-hover:text-orange-300' : 'text-zinc-100 group-hover:text-emerald-400'
}`}>
{site.name}
</h3>
<div className="mb-2 flex items-center gap-2">
<h3 className={`text-lg font-semibold transition-colors ${
status === 'down' ? 'text-orange-400 group-hover:text-orange-300' : 'text-zinc-100 group-hover:text-emerald-400'
}`}>
{site.name}
</h3>
{site.sponsor?.active && (
<span className="rounded-full border border-emerald-500/30 bg-emerald-500/10 px-2 py-0.5 text-[11px] font-medium uppercase tracking-wide text-emerald-300">
Supporter
</span>
)}
</div>

<p className="text-sm text-zinc-400 mb-4 line-clamp-2 flex-1">
{site.description || 'A WebMIDI-capable website.'}
Expand Down
5 changes: 5 additions & 0 deletions src/components/SiteRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ export function SiteRow({ site, status }: SiteRowProps) {
}`}>
{site.name}
</h3>
{site.sponsor?.active && (
<span className="rounded-full border border-emerald-500/30 bg-emerald-500/10 px-2 py-0.5 text-[11px] font-medium uppercase tracking-wide text-emerald-300">
Supporter
</span>
)}
{status === 'loading' && <Loader2 className="w-4 h-4 text-zinc-500 animate-spin flex-shrink-0" />}
{status === 'up' && <span title="Site is reachable" className="flex-shrink-0 flex"><CheckCircle2 className="w-4 h-4 text-emerald-500" /></span>}
{status === 'down' && <span title="Site may be unreachable" className="flex-shrink-0 flex"><AlertCircle className="w-4 h-4 text-orange-500" /></span>}
Expand Down
7 changes: 6 additions & 1 deletion src/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export const initialSites: Site[] = [
id: 'hexatone',
name: 'PLAINSOUND HEXATONE',
url: 'https://hexatone.plainsound.org',
tags: ['synth', 'webaudio', 'lumatone', 'isomorphic keyboard'],
tags: ['synth', 'webaudio', 'lumatone', 'isomorphic', 'keyboard'],
description:
'A microtonal app for mapping keyboards and 2D controllers to custom tunings.',
},
Expand Down Expand Up @@ -179,6 +179,11 @@ export const initialSites: Site[] = [
],
description:
'Practice drums in the browser with 2000+ songs as drum sheet or rhythm game. AI-generated transcription from MP3/YouTube, MIDI input from electronic kits, real-time scoring, sheet editor, and PDF/MIDI export.',
sponsor: {
active: true,
tier: 'supporter',
since: '2026-05-11',
},
},
];

Expand Down
10 changes: 10 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
export type SponsorTier = 'supporter' | 'sponsor' | 'featured-sponsor';

export interface SponsorInfo {
active: boolean;
tier: SponsorTier;
since?: string;
note?: string;
}

export interface Site {
id: string;
name: string;
url: string;
tags: string[];
description?: string;
sponsor?: SponsorInfo;
}

export type ViewMode = 'grid' | 'list';
Expand Down
Loading