Skip to main content

max / makenotwork

21.1 KB · 738 lines History Blame Raw
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>audiofiles/ — Pitch</title>
7 <style>
8 @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=Inter:wght@300;400;600;700&family=Recursive:wght@700&display=swap');
9
10 :root {
11 --bg: #ffffff;
12 --bg-cool: #f5f5f5;
13 --bg-deep: #000000;
14 --text: #000000;
15 --text-secondary: #333333;
16 --text-muted: #666666;
17 --accent: #000000;
18 --accent-light: #222222;
19 --teal: #000000;
20 --border: #d0d0d0;
21 --success: #30d158;
22 --on-deep: #ffffff;
23 --red: #ff3b30;
24 }
25
26 * { margin: 0; padding: 0; box-sizing: border-box; }
27
28 @page { size: letter; margin: 0; }
29
30 body {
31 font-family: 'Inter', sans-serif;
32 color: var(--text);
33 background: var(--bg);
34 line-height: 1.6;
35 -webkit-print-color-adjust: exact;
36 print-color-adjust: exact;
37 }
38
39 .page {
40 width: 8.5in;
41 min-height: 11in;
42 margin: 0 auto;
43 padding: 0.6in 0.75in;
44 background: var(--bg);
45 page-break-after: always;
46 position: relative;
47 }
48
49 .page:last-child { page-break-after: auto; }
50
51 /* -- Hero -- */
52
53 .hero {
54 text-align: center;
55 padding: 0.3in 0 0.3in;
56 border-bottom: 2px solid var(--text);
57 margin-bottom: 0.28in;
58 }
59
60 .hero h1 {
61 font-family: 'Recursive', monospace;
62 font-size: 44px;
63 font-weight: 700;
64 font-variation-settings: 'MONO' 1, 'CASL' 0;
65 color: var(--text);
66 margin-bottom: 4px;
67 letter-spacing: -0.5px;
68 }
69
70 .hero .tagline {
71 font-family: 'IBM Plex Mono', monospace;
72 font-size: 14px;
73 color: var(--text-secondary);
74 letter-spacing: 0.3px;
75 }
76
77 .hero .sub {
78 font-size: 12.5px;
79 color: var(--text-muted);
80 margin-top: 8px;
81 }
82
83 /* -- Sections -- */
84
85 h2 {
86 font-family: 'IBM Plex Mono', monospace;
87 font-size: 14px;
88 font-weight: 600;
89 text-transform: uppercase;
90 letter-spacing: 1.5px;
91 color: var(--text);
92 margin-bottom: 12px;
93 padding-bottom: 5px;
94 border-bottom: 1px solid var(--border);
95 }
96
97 h3 {
98 font-family: 'IBM Plex Mono', monospace;
99 font-size: 12.5px;
100 font-weight: 600;
101 color: var(--text);
102 margin-bottom: 5px;
103 margin-top: 14px;
104 }
105
106 h3:first-child { margin-top: 0; }
107
108 .intro {
109 font-size: 14.5px;
110 line-height: 1.7;
111 margin-bottom: 0.25in;
112 }
113
114 /* -- Stats -- */
115
116 .stats {
117 display: grid;
118 grid-template-columns: repeat(5, 1fr);
119 gap: 10px;
120 margin-bottom: 0.25in;
121 }
122
123 .stat {
124 text-align: center;
125 background: var(--bg-deep);
126 border: 1px solid var(--bg-deep);
127 border-radius: 6px;
128 padding: 10px 6px;
129 }
130
131 .stat .num {
132 font-family: 'Recursive', monospace;
133 font-weight: 700;
134 font-variation-settings: 'MONO' 1, 'CASL' 0;
135 font-size: 26px;
136 color: var(--on-deep);
137 display: block;
138 line-height: 1;
139 margin-bottom: 3px;
140 }
141
142 .stat .label {
143 font-family: 'IBM Plex Mono', monospace;
144 font-size: 9.5px;
145 color: #999999;
146 text-transform: uppercase;
147 letter-spacing: 0.4px;
148 }
149
150 /* -- Feature grid -- */
151
152 .features {
153 display: grid;
154 grid-template-columns: 1fr 1fr;
155 gap: 14px;
156 margin-bottom: 0.25in;
157 }
158
159 .feature-card {
160 background: var(--bg-cool);
161 border: 1px solid var(--border);
162 border-radius: 6px;
163 padding: 12px 14px;
164 }
165
166 .feature-card h3 {
167 margin: 0 0 5px 0;
168 font-size: 12px;
169 color: var(--text);
170 }
171
172 .feature-card ul { list-style: none; padding: 0; }
173
174 .feature-card li {
175 font-size: 11.5px;
176 line-height: 1.45;
177 color: var(--text-secondary);
178 padding: 1.5px 0 1.5px 13px;
179 position: relative;
180 }
181
182 .feature-card li::before {
183 content: '';
184 position: absolute;
185 left: 0;
186 top: 7.5px;
187 width: 5px;
188 height: 5px;
189 background: var(--text);
190 border-radius: 50%;
191 }
192
193 /* -- Feature section (full width, 2-col) -- */
194
195 .feature-section { margin-bottom: 0.2in; }
196
197 .feature-section ul {
198 list-style: none;
199 padding: 0;
200 columns: 2;
201 column-gap: 22px;
202 }
203
204 .feature-section li {
205 font-size: 12px;
206 line-height: 1.45;
207 color: var(--text-secondary);
208 padding: 2px 0 2px 13px;
209 position: relative;
210 break-inside: avoid;
211 }
212
213 .feature-section li::before {
214 content: '';
215 position: absolute;
216 left: 0;
217 top: 8px;
218 width: 5px;
219 height: 5px;
220 background: var(--text);
221 border-radius: 50%;
222 }
223
224 /* -- Highlight box -- */
225
226 .highlight-box {
227 background: var(--bg-cool);
228 border-left: 3px solid var(--text);
229 padding: 12px 16px;
230 margin-bottom: 0.2in;
231 border-radius: 0 6px 6px 0;
232 }
233
234 .highlight-box p {
235 font-size: 12.5px;
236 line-height: 1.6;
237 color: var(--text-secondary);
238 }
239
240 .highlight-box strong { color: var(--text); }
241
242 /* -- Device grid -- */
243
244 .devices {
245 display: grid;
246 grid-template-columns: repeat(4, 1fr);
247 gap: 8px;
248 margin-bottom: 0.2in;
249 }
250
251 .device {
252 background: var(--bg-cool);
253 border: 1px solid var(--border);
254 border-radius: 5px;
255 padding: 7px 10px;
256 text-align: center;
257 }
258
259 .device .name {
260 font-family: 'IBM Plex Mono', monospace;
261 font-size: 10.5px;
262 font-weight: 600;
263 color: var(--text);
264 display: block;
265 }
266
267 .device .mfr {
268 font-size: 10px;
269 color: var(--text-muted);
270 }
271
272 /* -- Analysis pipeline -- */
273
274 .pipeline {
275 display: grid;
276 grid-template-columns: repeat(3, 1fr);
277 gap: 10px;
278 margin-bottom: 0.2in;
279 }
280
281 .pipeline-stage {
282 background: var(--bg-cool);
283 border: 1px solid var(--border);
284 border-radius: 6px;
285 padding: 10px 12px;
286 }
287
288 .pipeline-stage h3 {
289 margin: 0 0 4px 0;
290 font-size: 11.5px;
291 color: var(--text);
292 }
293
294 .pipeline-stage p {
295 font-size: 10.5px;
296 line-height: 1.4;
297 color: var(--text-secondary);
298 }
299
300 /* -- Comparison table -- */
301
302 .comparison {
303 width: 100%;
304 border-collapse: collapse;
305 margin-bottom: 0.2in;
306 font-size: 11.5px;
307 }
308
309 .comparison th {
310 font-family: 'IBM Plex Mono', monospace;
311 font-size: 10.5px;
312 font-weight: 600;
313 text-align: left;
314 padding: 7px 8px;
315 background: var(--bg-deep);
316 color: var(--on-deep);
317 border-bottom: 1px solid var(--border);
318 }
319
320 .comparison td {
321 padding: 5px 8px;
322 border-bottom: 1px solid var(--border);
323 color: var(--text-secondary);
324 vertical-align: top;
325 }
326
327 .comparison .check { color: var(--success); font-weight: 700; font-size: 13px; }
328 .comparison .dash { color: var(--text-muted); }
329 .comparison tr:last-child td { border-bottom: none; }
330
331 /* -- Keyboard shortcuts -- */
332
333 .shortcuts {
334 display: grid;
335 grid-template-columns: repeat(3, 1fr);
336 gap: 4px 14px;
337 margin-bottom: 0.15in;
338 }
339
340 .shortcut {
341 display: flex;
342 align-items: center;
343 gap: 6px;
344 font-size: 11px;
345 color: var(--text-secondary);
346 padding: 1.5px 0;
347 }
348
349 .shortcut kbd {
350 font-family: 'IBM Plex Mono', monospace;
351 font-size: 10px;
352 background: var(--bg-deep);
353 border: 1px solid var(--bg-deep);
354 border-radius: 3px;
355 padding: 1px 5px;
356 color: var(--on-deep);
357 min-width: 22px;
358 text-align: center;
359 }
360
361 /* -- Two-mode -- */
362
363 .modes {
364 display: grid;
365 grid-template-columns: 1fr 1fr;
366 gap: 14px;
367 margin-bottom: 0.2in;
368 }
369
370 .mode {
371 background: var(--bg-cool);
372 border: 1px solid var(--border);
373 border-radius: 6px;
374 padding: 12px 14px;
375 }
376
377 .mode h3 {
378 margin: 0 0 5px 0;
379 font-size: 12px;
380 color: var(--text);
381 }
382
383 .mode p {
384 font-size: 11.5px;
385 line-height: 1.5;
386 color: var(--text-secondary);
387 }
388
389 /* -- Footer -- */
390
391 .footer {
392 position: absolute;
393 bottom: 0.45in;
394 left: 0.75in;
395 right: 0.75in;
396 display: flex;
397 justify-content: space-between;
398 align-items: center;
399 padding-top: 10px;
400 border-top: 1px solid var(--border);
401 }
402
403 .footer .left, .footer .right {
404 font-family: 'IBM Plex Mono', monospace;
405 font-size: 10px;
406 color: var(--text-muted);
407 }
408
409 .footer-inline {
410 display: flex;
411 justify-content: space-between;
412 align-items: center;
413 padding-top: 10px;
414 border-top: 1px solid var(--border);
415 margin-top: auto;
416 }
417
418 .footer-inline .left, .footer-inline .right {
419 font-family: 'IBM Plex Mono', monospace;
420 font-size: 10px;
421 color: var(--text-muted);
422 }
423
424 @media print { body { background: white; } .page { box-shadow: none; } }
425 @media screen { body { background: #ccc; padding: 20px 0; } .page { box-shadow: 0 2px 20px rgba(0,0,0,0.15); margin-bottom: 20px; } }
426 </style>
427 </head>
428 <body>
429
430 <!-- PAGE 1 -->
431 <div class="page">
432
433 <div class="hero">
434 <h1>audiofiles/</h1>
435 <div class="tagline">Manage your sample library without the waits.</div>
436 <div class="sub">Content-addressed sample manager. Standalone desktop app. Export to 14 hardware samplers. Drag to your DAW.</div>
437 </div>
438
439 <div class="intro">
440 audiofiles organizes your samples by content, not location. Import once, build unlimited virtual folder structures over a deduplicated store. Analyze BPM, key, loudness, and spectral characteristics automatically. Export to your hardware sampler with device-aware format conversion. Drag samples straight into your DAW. Built entirely in Rust.
441 </div>
442
443 <div class="stats">
444 <div class="stat">
445 <span class="num">14</span>
446 <span class="label">Hardware samplers</span>
447 </div>
448 <div class="stat">
449 <span class="num">5</span>
450 <span class="label">Audio formats</span>
451 </div>
452 <div class="stat">
453 <span class="num">17</span>
454 <span class="label">Bundled themes</span>
455 </div>
456 <div class="stat">
457 <span class="num">535</span>
458 <span class="label">Tests passing</span>
459 </div>
460 <div class="stat">
461 <span class="num">0</span>
462 <span class="label">Duplicate files</span>
463 </div>
464 </div>
465
466 <h2>Core Features</h2>
467
468 <div class="features">
469 <div class="feature-card">
470 <h3>Content-Addressed Storage</h3>
471 <ul>
472 <li>Samples stored by SHA-256 hash &mdash; zero duplicates</li>
473 <li>Import WAV, FLAC, MP3, OGG, AIFF</li>
474 <li>Three strategies: flat, new VFS, merge into existing</li>
475 <li>Cancellable mid-import (partial imports stay valid)</li>
476 <li>Drag-and-drop import + CLI argument import</li>
477 </ul>
478 </div>
479 <div class="feature-card">
480 <h3>Virtual File System</h3>
481 <ul>
482 <li>Multiple independent VFS roots over one store</li>
483 <li>Organize the same samples into unlimited hierarchies</li>
484 <li>All operations are metadata-only &mdash; no file copying</li>
485 <li>Breadcrumb navigation, keyboard nav, directory-first sorting</li>
486 <li>Cascade delete cleans up entire VFS trees</li>
487 </ul>
488 </div>
489 <div class="feature-card">
490 <h3>Search &amp; Filtering</h3>
491 <ul>
492 <li>Text search across names and tags (folder or global scope)</li>
493 <li>Filter by BPM range, key, duration, classification, tags</li>
494 <li>Smart folders: saved filter queries in the sidebar</li>
495 <li>Similarity search via weighted feature vectors</li>
496 <li>Near-duplicate detection via peak envelope fingerprinting</li>
497 </ul>
498 </div>
499 <div class="feature-card">
500 <h3>Tags &amp; Classification</h3>
501 <ul>
502 <li>Hierarchical dot-notation (e.g. <code>genre.techno</code>)</li>
503 <li>Auto-suggested from analysis: BPM, key, classification, loudness</li>
504 <li>Review screen: accept/reject per-suggestion or batch</li>
505 <li>12 auto-classification categories (Kick through Music)</li>
506 <li>Bulk tag/untag across multi-select; tag folders on import</li>
507 </ul>
508 </div>
509 </div>
510
511 <h2>Analysis Pipeline</h2>
512
513 <div class="pipeline">
514 <div class="pipeline-stage">
515 <h3>Loudness</h3>
516 <p>Peak dBFS, RMS dBFS, LUFS (ITU-R BS.1770-4). Instant results, always enabled.</p>
517 </div>
518 <div class="pipeline-stage">
519 <h3>BPM &amp; Key</h3>
520 <p>Autocorrelation tempo (30&ndash;300 BPM). Chroma-based key detection. Confidence scores for both.</p>
521 </div>
522 <div class="pipeline-stage">
523 <h3>Spectral</h3>
524 <p>Centroid, flatness, rolloff, zero-crossing rate, onset strength. STFT-based.</p>
525 </div>
526 <div class="pipeline-stage">
527 <h3>Loop Detection</h3>
528 <p>Cross-correlation of start/end regions. Beat alignment check when BPM is known.</p>
529 </div>
530 <div class="pipeline-stage">
531 <h3>Classification</h3>
532 <p>Rule-based into 12 categories: Kick, Snare, HiHat, Cymbal, Perc, Bass, Vocal, Synth, Pad, FX, Noise, Music.</p>
533 </div>
534 <div class="pipeline-stage">
535 <h3>Waveform</h3>
536 <p>Downsampled peak pairs for display. Custom egui renderer with theme-aware coloring.</p>
537 </div>
538 </div>
539
540 <div class="highlight-box">
541 <p>Analysis runs on a <strong>background worker thread</strong> with progress bar and cancel support. Each stage is individually toggleable. Results feed into auto-tag suggestions and classification badges.</p>
542 </div>
543
544 <h2>Desktop App</h2>
545
546 <div class="highlight-box">
547 <p>Full desktop application with <strong>system audio output</strong>. Native drag-out to Finder and DAWs (REAPER, Ableton, Logic, etc.). Drag-and-drop import, CLI arguments, system tray, OTA updates. macOS app bundle with file associations. MIDI instrument mode with <strong>chromatic and multi-sample mapping</strong>.</p>
548 </div>
549
550 <div class="footer">
551 <div class="left">af/ &mdash; v0.3.0 alpha</div>
552 <div class="right">makenot.work</div>
553 </div>
554
555 </div>
556
557 <!-- PAGE 2 -->
558 <div class="page" style="display: flex; flex-direction: column;">
559
560 <h2>Export to 14 Hardware Samplers</h2>
561
562 <div class="highlight-box" style="margin-bottom: 12px;">
563 <p>Export VFS subtrees with <strong>automatic sample rate conversion</strong>, bit depth dithering, filename sanitization, channel constraints, and file size limits &mdash; all tailored per device. Profiles are <strong>Rhai scripts</strong> with TOML manifests, so the community can add new devices without app updates.</p>
564 </div>
565
566 <div class="devices">
567 <div class="device"><span class="name">Dirtywave M8</span><span class="mfr">Dirtywave</span></div>
568 <div class="device"><span class="name">Digitakt</span><span class="mfr">Elektron</span></div>
569 <div class="device"><span class="name">Digitakt II</span><span class="mfr">Elektron</span></div>
570 <div class="device"><span class="name">Octatrack</span><span class="mfr">Elektron</span></div>
571 <div class="device"><span class="name">Model:Samples</span><span class="mfr">Elektron</span></div>
572 <div class="device"><span class="name">SP-404 MKII</span><span class="mfr">Roland</span></div>
573 <div class="device"><span class="name">MPC Live/One/X</span><span class="mfr">Akai</span></div>
574 <div class="device"><span class="name">Maschine+</span><span class="mfr">Native Instruments</span></div>
575 <div class="device"><span class="name">Deluge</span><span class="mfr">Synthstrom</span></div>
576 <div class="device"><span class="name">Tracker</span><span class="mfr">Polyend</span></div>
577 <div class="device"><span class="name">Blackbox</span><span class="mfr">1010music</span></div>
578 <div class="device"><span class="name">OP-1 / Field</span><span class="mfr">Teenage Engineering</span></div>
579 <div class="device"><span class="name">Volca Sample 2</span><span class="mfr">Korg</span></div>
580 <div class="device"><span class="name">Circuit Rhythm</span><span class="mfr">Novation</span></div>
581 </div>
582
583 <h2>MIDI Instrument Mode</h2>
584
585 <div class="features" style="margin-bottom: 0.18in;">
586 <div class="feature-card">
587 <h3>Chromatic Mode</h3>
588 <ul>
589 <li>Single sample pitch-shifted across the keyboard</li>
590 <li>Linear pitch interpolation</li>
591 <li>Set root note via on-screen piano</li>
592 <li>8-voice polyphony with oldest-note stealing</li>
593 </ul>
594 </div>
595 <div class="feature-card">
596 <h3>Multi-Sample Mode</h3>
597 <ul>
598 <li>Assign different samples to key ranges</li>
599 <li>Velocity targeting per zone</li>
600 <li>Drag samples onto the piano keyboard</li>
601 <li>Visual zone bars showing assignments</li>
602 </ul>
603 </div>
604 </div>
605
606 <div class="highlight-box" style="margin-bottom: 0.18in;">
607 <p><strong>ADSR envelope</strong> with configurable attack, decay, sustain, and release. Velocity-to-gain modulation. 8-voice polyphony with oldest-note stealing.</p>
608 </div>
609
610 <h2>Under the Hood</h2>
611
612 <div class="feature-section">
613 <ul>
614 <li>Native drag-out: drag samples to Finder, Desktop, or any DAW</li>
615 <li>50-deep undo on all destructive operations</li>
616 <li>Bulk rename with pattern templates (<code>{classification}_{bpm}_{name}</code>)</li>
617 <li>Collections: cross-VFS sample groupings for quick access</li>
618 <li>Compatible key search (relative + circle-of-fifths neighbors)</li>
619 <li>Metadata sidecar export (<code>.audiofiles.json</code> per sample)</li>
620 <li>Configurable analysis stages (toggle each independently)</li>
621 <li>OTA update checker with consent dialog (non-intrusive)</li>
622 <li>17 bundled themes (dark, light, high-contrast) + custom TOML themes</li>
623 </ul>
624 </div>
625
626 <h2>Cloud Sync (Optional)</h2>
627
628 <div class="highlight-box" style="margin-bottom: 0.18in;">
629 <p>Sync tags, VFS structure, smart folders, and sample metadata across devices via <strong>MNW SyncKit</strong>. End-to-end encrypted (ChaCha20-Poly1305 + Argon2) &mdash; the server stores only ciphertext. Choose per-VFS whether to sync audio blobs or metadata only. Samples without local files appear as <strong>cloud-only</strong> with full metadata still searchable. Auto-sync scheduler (5/15/30/60 min intervals). <strong>No account required</strong> &mdash; sync is opt-in.</p>
630 </div>
631
632 <h2>How It Compares</h2>
633
634 <table class="comparison">
635 <tr>
636 <th style="width:26%">Feature</th>
637 <th style="width:14.8%">af/</th>
638 <th style="width:14.8%">Splice</th>
639 <th style="width:14.8%">Sononym</th>
640 <th style="width:14.8%">XO</th>
641 <th style="width:14.8%">ADSR</th>
642 </tr>
643 <tr>
644 <td>Content deduplication</td>
645 <td><span class="check">Yes</span></td>
646 <td><span class="dash">&mdash;</span></td>
647 <td><span class="dash">&mdash;</span></td>
648 <td><span class="dash">&mdash;</span></td>
649 <td><span class="dash">&mdash;</span></td>
650 </tr>
651 <tr>
652 <td>Multiple VFS trees</td>
653 <td><span class="check">Yes</span></td>
654 <td><span class="dash">&mdash;</span></td>
655 <td><span class="dash">&mdash;</span></td>
656 <td><span class="dash">&mdash;</span></td>
657 <td><span class="dash">&mdash;</span></td>
658 </tr>
659 <tr>
660 <td>Hardware export</td>
661 <td><span class="check">14 devices</span></td>
662 <td><span class="dash">&mdash;</span></td>
663 <td><span class="dash">&mdash;</span></td>
664 <td><span class="dash">&mdash;</span></td>
665 <td><span class="dash">&mdash;</span></td>
666 </tr>
667 <tr>
668 <td>Native drag to DAW</td>
669 <td><span class="check">Yes</span></td>
670 <td><span class="dash">&mdash;</span></td>
671 <td><span class="dash">&mdash;</span></td>
672 <td><span class="dash">&mdash;</span></td>
673 <td><span class="check">Yes</span></td>
674 </tr>
675 <tr>
676 <td>BPM + key detection</td>
677 <td><span class="check">Yes</span></td>
678 <td><span class="check">Yes</span></td>
679 <td><span class="check">Yes</span></td>
680 <td><span class="check">Yes</span></td>
681 <td><span class="check">Yes</span></td>
682 </tr>
683 <tr>
684 <td>Similarity search</td>
685 <td><span class="check">Yes</span></td>
686 <td><span class="check">Yes</span></td>
687 <td><span class="check">Yes</span></td>
688 <td><span class="check">Yes</span></td>
689 <td><span class="dash">&mdash;</span></td>
690 </tr>
691 <tr>
692 <td>MIDI instrument</td>
693 <td><span class="check">Yes</span></td>
694 <td><span class="dash">&mdash;</span></td>
695 <td><span class="dash">&mdash;</span></td>
696 <td><span class="check">Yes</span></td>
697 <td><span class="dash">&mdash;</span></td>
698 </tr>
699 <tr>
700 <td>Extensible (scripting)</td>
701 <td><span class="check">Rhai</span></td>
702 <td><span class="dash">&mdash;</span></td>
703 <td><span class="dash">&mdash;</span></td>
704 <td><span class="dash">&mdash;</span></td>
705 <td><span class="dash">&mdash;</span></td>
706 </tr>
707 <tr>
708 <td>No subscription</td>
709 <td><span class="check">Yes</span></td>
710 <td>$13&ndash;40/mo</td>
711 <td>$99 once</td>
712 <td>$180 once</td>
713 <td><span class="check">Free</span></td>
714 </tr>
715 <tr>
716 <td>Source-available</td>
717 <td><span class="check">Yes</span></td>
718 <td><span class="dash">&mdash;</span></td>
719 <td><span class="dash">&mdash;</span></td>
720 <td><span class="dash">&mdash;</span></td>
721 <td><span class="dash">&mdash;</span></td>
722 </tr>
723 </table>
724
725 <div class="highlight-box">
726 <p><strong>Free during alpha.</strong> Standalone app for macOS (signed + notarized). Linux builds from source. Source-available under PolyForm Noncommercial 1.0.0.</p>
727 </div>
728
729 <div class="footer-inline" style="margin-top: 14px;">
730 <div class="left">af/ &mdash; v0.3.0 alpha</div>
731 <div class="right">makenot.work</div>
732 </div>
733
734 </div>
735
736 </body>
737 </html>
738