Lancement

Waku : le PKM visuel que j'aurais voulu trouver sur l'App Store

Alexandre
Alexandre
··
Durée de lecture : 8 min
Logo Waku — Télécharger sur l'App Store
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.
Notification Apple — WAKU v1.0.0 prête à être distribuée

Cliquer pour agrandir

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

Waku — Collections et favorisWaku — Capture instantanéeWaku — Notes enrichiesWaku — Tags et organisationWaku — Widgets iOSWaku — Design Bento

La stack technique

Tout est en Swift natif. Pas de cross-platform, pas de compromis.
TechnoRôle
SwiftUIInterface
SwiftDataPersistance offline
Swift 6Concurrence stricte
MVVMArchitecture
LinkPresentationExtraction metadata
FoundationModelsIA on-device (Apple Intelligence)
AppIntentsSiri & Shortcuts
WidgetKitWidgets 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

Illustration — extraction de metadata depuis un lien

Cliquer pour agrandir

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

Illustration — le process de review Apple

Cliquer pour agrandir

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.

Commentaires

Commentaires

Tu as un avis sur cet article ?

Crée un compte gratuit en 10 secondes pour commenter, laisser des likes et recevoir les prochains articles directement dans ta boîte mail.

Pas encore de compte ?

Ce site utilise des cookies pour les statistiques de visite et la publicité. Aucune donnée personnelle n'est revendue. En savoir plus