Deux mois. Un rejet Apple pour un logo Safari dans une screenshot. Et ce matin, la notif : « WAKU (iOS) — L'état de la version 1.0.0 est passé à Prête à être distribuée ». Mon deuxième bébé numérique est vivant.
Pourquoi j'ai construit Waku
Pocket a fermé. Read Later s'est arrêté. Raindrop est devenu une usine à gaz. GoodLinks date de 2019.
Des millions de gens sauvegardent des liens chaque semaine — articles, threads, vidéos, recettes — et ne les retrouvent jamais. Pas parce qu'ils sont désorganisés, mais parce que les outils existants sont soit morts, soit moches, soit trop complexes.
J'avais le même problème. Des dizaines de liens par semaine, éparpillés entre Notes, Safari Reading List, des onglets ouverts depuis août 2025. Des threads Twitter sur SwiftUI, des recettes, des articles que je voulais relire. Je ne les ai jamais relus.
Un soir, j'ai ouvert Xcode. Si je dois construire mon propre outil, autant le faire bien.
Waku (枠) signifie « cadre » en japonais. C'est ce qui donne forme à tes idées.
Ce que fait Waku
Waku est un gestionnaire de connaissances personnelles (PKM) pour iOS. Pas un outil complexe avec des graphes et des backlinks — un espace élégant où capturer un lien, annoter un article, retrouver une idée.
Les features de la v1.0.0
- Capture instantanée — colle un lien, Waku extrait automatiquement le titre, la description, l'image et le favicon
- Notes enrichies — texte + images + dessins PencilKit, un vrai carnet visuel
- Collections & tags — organise tes bookmarks comme tu veux
- Résumé IA on-device — Apple Intelligence résume tes bookmarks et notes, tout tourne sur le device, aucune donnée envoyée
- Siri & App Intents — « Dis Siri, sauvegarde ce lien dans Waku »
- Widgets iOS — 3 tailles (Small, Medium, Large), tes bookmarks sur l'écran d'accueil
- Spotlight — tes bookmarks indexés, retrouvables depuis la recherche iOS
- 100% offline-first — SwiftData, pas de compte, pas de serveur, tes données restent sur ton device
- Design Bento — grille organique, coins arrondis, accent orange chaud, inspiré de Bento.me et Arc
Waku sur l'App Store
La stack technique
Tout est en Swift natif. Pas de cross-platform, pas de compromis.
| Techno | Rôle |
|---|
| SwiftUI | Interface |
| SwiftData | Persistance offline |
| Swift 6 | Concurrence stricte |
| MVVM | Architecture |
| LinkPresentation | Extraction metadata |
| FoundationModels | IA on-device (Apple Intelligence) |
| AppIntents | Siri & Shortcuts |
| WidgetKit | Widgets iOS |
L'architecture est la même que
Livate : MVVM strict, offline-first, cache-first. La différence : Waku n'a
aucun backend utilisateur. Tout est local. J'ai décidé de rester 100% local, sans collecte de données, pour respecter la vie privée des utilisateurs.
Sous le capot : extraction de metadata
Quand tu colles un lien, Waku lance LinkPresentation et un parsing HTML en parallèle, puis fusionne les résultats avec une stratégie de fallback :
func extract(from url: URL) async throws -> ItemMetadata {
async let lpResult = extractWithLP(from: url)
async let htmlResult = fetchHTML(from: url)
let lp = try? await lpResult
let htmlString = try? await htmlResult
let html = htmlString.map { parseHTML($0, base: url) }
let oembed = await extractWithOEmbed(from: url, html: htmlString)
guard lp != nil || html != nil || oembed != nil else {
throw ExtractionError.extractionFailed
}
let thumbnail = oembed?.thumbnailURL
?? html?.ogImageURL
?? youtubeDirectThumbnail(for: url)
return ItemMetadata(
title: oembed?.title ?? lp?.title ?? html?.title ?? url.host() ?? url.absoluteString,
description: oembed?.description ?? html?.description ?? "",
ogImageURL: thumbnail,
faviconURL: html?.faviconURL ?? faviconFallback(for: url),
siteName: oembed?.providerName ?? html?.siteName ?? lp?.siteName ?? url.host() ?? ""
)
}
LinkPresentation renvoie nil sur pas mal de sites — d'où le fallback HTML qui parse les balises Open Graph directement. La chaîne oEmbed → HTML → LP garantit qu'on récupère toujours quelque chose.
Le modèle SwiftData
Chaque bookmark est un WakuItem persisté avec SwiftData. Les données volumineuses (dessins PencilKit, contenu formaté) sont stockées en externalStorage pour garder la base légère :
@Model
final class WakuItem {
var id: UUID
var url: String
var title: String
var descriptionText: String
var ogImageURL: String?
var siteName: String
var isPinned: Bool
var isFavorite: Bool
@Attribute(.externalStorage) var customImageData: Data?
@Attribute(.externalStorage) var drawingData: Data?
@Attribute(.externalStorage) var noteBlocksData: Data?
var summary: String?
var collection: ItemCollection?
@Relationship(deleteRule: .nullify) var tags: [Tag] = []
}
Siri & App Intents
« Dis Siri, sauvegarde ce lien dans Waku » — ça marche grâce à un AppIntent qui utilise le schema .browser.bookmarkURL :
@AppIntent(schema: .browser.bookmarkURL)
struct SaveBookmarkIntent: AppIntent {
static let title: LocalizedStringResource = "intent.save.title"
@Parameter(title: "URL")
var url: URL
@MainActor
func perform() async throws -> some IntentResult & ReturnsValue<BrowserBookmarkEntity> & ProvidesDialog {
let displayName = url.host() ?? url.absoluteString
switch BookmarkPendingStore.save(urlInput: url.absoluteString) {
case .saved(let host):
return .result(value: entity, dialog: "\(host) capturé dans Waku !")
case .alreadyPending:
return .result(value: entity, dialog: "Ce lien est déjà en attente")
case .invalidURL:
return .result(value: entity, dialog: "URL invalide")
case .storeError:
return .result(value: entity, dialog: "Erreur de sauvegarde")
}
}
}
Le journal de bord
1er février 2026 — Premier item capturé end-to-end. J'ai cru que ce serait bouclé en deux semaines. Non.
Mi-février — Troisième itération de design system. Le neumorphisme faisait 2019, le glassmorphism faisait trop iOS 15. J'ai passé trois soirées à dessiner des coins arrondis dans Figma avant de trouver le bon équilibre : flat, coins très ronds, ombres douces, orange chaud, SF Pro Rounded.
5 mars — L'extraction de metadata plante sur 30% des liens. LinkPresentation renvoie nil sans raison sur certains sites. J'ai codé un fallback HTML en parallèle qui parse le <head> directement.
18 mars — Siri & App Intents fonctionnent. « Dis Siri, sauvegarde ce lien dans Waku. » Ça marche du premier coup. Premier vrai moment de satisfaction depuis trois semaines.
14 mars — Première soumission Apple. À partir de là, tu ne peux plus rien faire. Tu rafraîchis App Store Connect. Tu vérifies tes mails. Tu dors mal. Et tu attends. Près d'une semaine avant que la review commence. Une semaine à regarder « En attente de review » sans rien pouvoir faire.
22 mars, 14h12 — Rejet Apple. Logo Safari dans une screenshot. Corrigé en 5 minutes, resoumis.
23 mars, 9h03 — « Prête à être distribuée. »
Publier une app en 2026, c'est devenu un sport de combat
Ce que personne ne te dit quand tu commences à dev une app, c'est que le code c'est la partie facile. Le vrai boss de fin, c'est la review Apple.
1 600 apps par jour : le goulot d'étranglement
Avant, soumettre une app et avoir une réponse en 24-48h, c'était la norme. En 2026, c'est un lointain souvenir.
Le vibe coding a changé la donne. Avec des outils comme Cursor, Replit ou Claude qui génèrent du code, n'importe qui peut produire une app en un week-end et la soumettre. En 2025, l'App Store recevait environ 1 340 nouvelles apps par jour. En mars 2026, on est passé à
1 600 soumissions quotidiennes — soit plus de 45 000 apps par mois (
Apptunix). Le pipeline de review d'Apple n'a pas suivi.
Le résultat, tu le devines : des délais qui s'allongent, des équipes de reviewers surchargées, et toi, indie dev, tu attends. Tu rafraîchis App Store Connect toutes les heures. Tu vérifies tes mails à 2h du matin. Tu te demandes si ton app va être rejetée parce que tu as utilisé le mot « best » dans ta description.
Le crackdown Apple de mars 2026
Le 18 mars 2026 — alors que mon app attendait sa review depuis quatre jours — Apple a
discrètement bloqué les mises à jour de plusieurs apps de vibe coding, dont
Replit et
Vibecode. Pas de nouvelle règle : juste l'application stricte de la clause
3.3.1(B) qui interdit aux apps de modifier leur fonctionnement après validation.
Le problème de fond : ces apps permettent de générer une app iOS
depuis un iPhone, de la soumettre, et de la modifier après coup. Apple considère ça comme un contournement de sa review. Replit n'a pas pu publier de mise à jour depuis janvier 2026 et a dégringolé de la 1ère à la 3ème place du classement Developer Tools (
MacRumors).
Le paradoxe, c'est qu'Apple a en parallèle intégré le support de Cursor et Claude dans Xcode. Le vibe coding sur desktop, c'est OK. Sur mobile, c'est bloqué. La différence ? Sur desktop, le code passe par la review avant publication. Sur mobile, il contourne tout.
Le vrai problème : la qualité
Au-delà des délais, il y a la question de ce qui arrive sur l'App Store. Le vibe coding accélère le prototypage, pas la qualité. Des analyses techniques (
Glide,
Magnise) pointent les mêmes problèmes récurrents dans les apps générées par IA : failles de sécurité non détectées, architecture incohérente, bugs sur les cas limites, dette technique qui explose dès que l'app sort du mode prototype.
Comme l'écrit Addy Osmani : le vibe coding n'est pas une excuse pour livrer du travail bâclé. C'est un outil. Mais une app stable pour de vrais utilisateurs, ça demande de la rigueur, du testing, de l'architecture. L'IA ne remplace pas ça.
Ce qui rend le process stressant
Le plus dur, c'est l'opacité. Tu soumets ton app, et ensuite c'est le silence. Pas de barre de progression, pas d'estimation de délai. Juste « En attente de review ». Tu ne sais pas si le reviewer va prendre 2 jours ou 2 semaines.
Et quand le rejet arrive — parce qu'il finit souvent par arriver — c'est parfois pour des raisons que tu n'aurais jamais devinées. Un wording dans ta description. Un bouton qui ne mène pas exactement où Apple l'attend. Ou, dans mon cas, un logo Safari dans une capture d'écran.
Pour Livate, j'ai eu des rejets. Pour Waku aussi. Apple protège ses marques visuelles, et même un picto qui te semble anodin peut déclencher un refus. Corrigé en quelques heures, mais ça rappelle à quel point chaque détail compte. Les
App Store Review Guidelines, je les connais par cœur maintenant.
Ce que j'ai appris
Quelques conseils pour ceux qui s'apprêtent à soumettre :
- Lis les guidelines avant d'écrire une seule ligne de code, pas la veille de la soumission
- Teste sur un vrai device, pas juste le simulateur — Apple teste sur du vrai hardware
- Prépare tes metadata en avance — descriptions, captures d'écran, catégorie, mots-clés — c'est aussi long que le dev
- Prévois du temps de buffer — ne promets jamais une date de lancement sans avoir la validation Apple en poche
- Soumets tôt, soumets souvent — une pre-release avec les features de base, puis des updates. C'est plus facile de faire passer des updates qu'une première soumission
Waku est gratuite
L'app est gratuite avec 20 bookmarks, 3 collections, et le choix du thème, de la langue et du layout. Pour ceux qui veulent aller plus loin, un seul achat in-app à 4,99 € (lifetime) débloque tout :
- Bookmarks et collections illimités
- Résumé IA on-device
- Widgets iOS
- Couleur d'accent personnalisée
- Import/export
- Guide Siri
Pas d'abonnement. Un achat unique pour soutenir le développement et débloquer l'app complète.
Si tu cherches un endroit simple pour sauvegarder ce qui compte — sans compte, sans cloud obligatoire —
télécharge Waku sur l'App Store et dis-moi ce que tu en penses. Je lis chaque retour.
Et après ?
La v1.1 est déjà en chantier :
- CloudKit — synchronisation iCloud entre tes devices
- Share Extension — capturer depuis n'importe quelle app en un tap
- Import Pocket/Raindrop — migrer tes bookmarks en un clic
Le journal de bord complet (avec du code) est sur
getwaku.app.