this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

๐Ÿ—ƒ๏ธ Update churros

+3952 -55
+3952 -55
works.json
··· 10607 10607 }, 10608 10608 "churros": { 10609 10609 "Partial": false, 10610 - "builtAt": "2025-12-03T13:22:30.0276329+01:00", 10610 + "builtAt": "2025-12-03T20:15:49.887964+01:00", 10611 10611 "content": { 10612 10612 "default": { 10613 10613 "abbreviations": {}, 10614 10614 "blocks": [ 10615 10615 { 10616 - "alt": "Logo", 10616 + "alt": "", 10617 + "analyzed": false, 10618 + "anchor": "", 10619 + "attributes": { 10620 + "autoplay": false, 10621 + "controls": false, 10622 + "loop": false, 10623 + "muted": false, 10624 + "playsinline": false 10625 + }, 10626 + "caption": "", 10627 + "colors": { 10628 + "primary": "", 10629 + "secondary": "", 10630 + "tertiary": "" 10631 + }, 10632 + "content": "<p>La plateforme et application accompagnant la vie รฉtudiante ร  lโ€™ENSEEIHT (et plus ร  venir).</p>", 10633 + "contentType": "", 10634 + "dimensions": { 10635 + "aspectRatio": 0, 10636 + "height": 0, 10637 + "width": 0 10638 + }, 10639 + "distSource": "", 10640 + "duration": 0, 10641 + "hasSound": false, 10642 + "hash": "", 10643 + "id": "x3a7eYA1oT", 10644 + "index": 0, 10645 + "online": false, 10646 + "relativeSource": "", 10647 + "size": 0, 10648 + "text": "", 10649 + "thumbnails": null, 10650 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10651 + "title": "", 10652 + "type": "paragraph", 10653 + "url": "" 10654 + }, 10655 + { 10656 + "alt": "", 10657 + "analyzed": false, 10658 + "anchor": "", 10659 + "attributes": { 10660 + "autoplay": false, 10661 + "controls": false, 10662 + "loop": false, 10663 + "muted": false, 10664 + "playsinline": false 10665 + }, 10666 + "caption": "", 10667 + "colors": { 10668 + "primary": "", 10669 + "secondary": "", 10670 + "tertiary": "" 10671 + }, 10672 + "content": "<p>Cโ€™est une biletterie, un espace de communication des clubs et associations รฉtudiantes, de partage de documents de rรฉvision, un annuaire รฉtudiant, et un portal vers dโ€™autres services offerts par lโ€™association รฉtudiante.</p>", 10673 + "contentType": "", 10674 + "dimensions": { 10675 + "aspectRatio": 0, 10676 + "height": 0, 10677 + "width": 0 10678 + }, 10679 + "distSource": "", 10680 + "duration": 0, 10681 + "hasSound": false, 10682 + "hash": "", 10683 + "id": "zN7q5zCYdj", 10684 + "index": 0, 10685 + "online": false, 10686 + "relativeSource": "", 10687 + "size": 0, 10688 + "text": "", 10689 + "thumbnails": null, 10690 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10691 + "title": "", 10692 + "type": "paragraph", 10693 + "url": "" 10694 + }, 10695 + { 10696 + "alt": "", 10697 + "analyzed": false, 10698 + "anchor": "application", 10699 + "attributes": { 10700 + "autoplay": false, 10701 + "controls": false, 10702 + "loop": false, 10703 + "muted": false, 10704 + "playsinline": false 10705 + }, 10706 + "caption": "", 10707 + "colors": { 10708 + "primary": "", 10709 + "secondary": "", 10710 + "tertiary": "" 10711 + }, 10712 + "content": "", 10713 + "contentType": "", 10714 + "dimensions": { 10715 + "aspectRatio": 0, 10716 + "height": 0, 10717 + "width": 0 10718 + }, 10719 + "distSource": "", 10720 + "duration": 0, 10721 + "hasSound": false, 10722 + "hash": "", 10723 + "id": "9sNAmXk-oL", 10724 + "index": 0, 10725 + "online": false, 10726 + "relativeSource": "", 10727 + "size": 0, 10728 + "text": "Application", 10729 + "thumbnails": null, 10730 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10731 + "title": "", 10732 + "type": "link", 10733 + "url": "https://churros.inpt.fr" 10734 + }, 10735 + { 10736 + "alt": "", 10737 + "analyzed": false, 10738 + "anchor": "code-source", 10739 + "attributes": { 10740 + "autoplay": false, 10741 + "controls": false, 10742 + "loop": false, 10743 + "muted": false, 10744 + "playsinline": false 10745 + }, 10746 + "caption": "", 10747 + "colors": { 10748 + "primary": "", 10749 + "secondary": "", 10750 + "tertiary": "" 10751 + }, 10752 + "content": "", 10753 + "contentType": "", 10754 + "dimensions": { 10755 + "aspectRatio": 0, 10756 + "height": 0, 10757 + "width": 0 10758 + }, 10759 + "distSource": "", 10760 + "duration": 0, 10761 + "hasSound": false, 10762 + "hash": "", 10763 + "id": "UCWFLEFMsb", 10764 + "index": 0, 10765 + "online": false, 10766 + "relativeSource": "", 10767 + "size": 0, 10768 + "text": "Code source", 10769 + "thumbnails": null, 10770 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10771 + "title": "", 10772 + "type": "link", 10773 + "url": "https://git.inpt.fr/churros/churros" 10774 + }, 10775 + { 10776 + "alt": "", 10777 + "analyzed": false, 10778 + "anchor": "code-source-sur-github", 10779 + "attributes": { 10780 + "autoplay": false, 10781 + "controls": false, 10782 + "loop": false, 10783 + "muted": false, 10784 + "playsinline": false 10785 + }, 10786 + "caption": "", 10787 + "colors": { 10788 + "primary": "", 10789 + "secondary": "", 10790 + "tertiary": "" 10791 + }, 10792 + "content": "", 10793 + "contentType": "", 10794 + "dimensions": { 10795 + "aspectRatio": 0, 10796 + "height": 0, 10797 + "width": 0 10798 + }, 10799 + "distSource": "", 10800 + "duration": 0, 10801 + "hasSound": false, 10802 + "hash": "", 10803 + "id": "b2xEuJplk2", 10804 + "index": 0, 10805 + "online": false, 10806 + "relativeSource": "", 10807 + "size": 0, 10808 + "text": "Code source (sur github)", 10809 + "thumbnails": null, 10810 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10811 + "title": "", 10812 + "type": "link", 10813 + "url": "https://github.com/inp-net/churros" 10814 + }, 10815 + { 10816 + "alt": "", 10817 + "analyzed": false, 10818 + "anchor": "", 10819 + "attributes": { 10820 + "autoplay": false, 10821 + "controls": false, 10822 + "loop": false, 10823 + "muted": false, 10824 + "playsinline": false 10825 + }, 10826 + "caption": "", 10827 + "colors": { 10828 + "primary": "", 10829 + "secondary": "", 10830 + "tertiary": "" 10831 + }, 10832 + "content": "<h2>Contexte</h2>", 10833 + "contentType": "", 10834 + "dimensions": { 10835 + "aspectRatio": 0, 10836 + "height": 0, 10837 + "width": 0 10838 + }, 10839 + "distSource": "", 10840 + "duration": 0, 10841 + "hasSound": false, 10842 + "hash": "", 10843 + "id": "MMSn22lsjd", 10844 + "index": 0, 10845 + "online": false, 10846 + "relativeSource": "", 10847 + "size": 0, 10848 + "text": "", 10849 + "thumbnails": null, 10850 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10851 + "title": "", 10852 + "type": "paragraph", 10853 + "url": "" 10854 + }, 10855 + { 10856 + "alt": "", 10617 10857 "analyzed": true, 10618 - "anchor": "logo-loading", 10858 + "anchor": "billetterie-inpt", 10619 10859 "attributes": { 10620 10860 "autoplay": false, 10621 10861 "controls": true, ··· 10625 10865 }, 10626 10866 "caption": "", 10627 10867 "colors": { 10628 - "primary": "#DEDEDE", 10629 - "secondary": "#9B9B9B", 10630 - "tertiary": "#414141" 10868 + "primary": "#5392BF", 10869 + "secondary": "#D6D7D9", 10870 + "tertiary": "#F3F5F5" 10631 10871 }, 10632 10872 "content": "", 10633 10873 "contentType": "image/png", 10634 10874 "dimensions": { 10635 - "aspectRatio": 1.003861, 10636 - "height": 259, 10637 - "width": 260 10875 + "aspectRatio": 1.518409, 10876 + "height": 679, 10877 + "width": 1031 10638 10878 }, 10639 - "distSource": "churros\\.ortfo\\logo-loading.png", 10879 + "distSource": "churros\\.ortfo\\billetterie-inpt.png", 10640 10880 "duration": 0, 10641 10881 "hasSound": false, 10642 - "hash": "k565Trk9qvxePeqX/0DgAw==", 10643 - "id": "bKt3xEgWER", 10882 + "hash": "fVwRorJyuUdGcZC4ZkF4rg==", 10883 + "id": "URji-G5AHN", 10644 10884 "index": 0, 10645 10885 "online": false, 10646 - "relativeSource": "./logo-loading.png", 10647 - "size": 10127, 10886 + "relativeSource": "./billetterie-inpt.png", 10887 + "size": 125889, 10648 10888 "text": "", 10649 10889 "thumbnails": { 10650 - "100": "churros/bKt3xEgWER@100.webp", 10651 - "1200": "churros/bKt3xEgWER@1200.webp", 10652 - "400": "churros/bKt3xEgWER@400.webp", 10653 - "600": "churros/bKt3xEgWER@600.webp" 10890 + "100": "churros/URji-G5AHN@100.webp", 10891 + "1200": "churros/URji-G5AHN@1200.webp", 10892 + "400": "churros/URji-G5AHN@400.webp", 10893 + "600": "churros/URji-G5AHN@600.webp" 10654 10894 }, 10655 - "thumbnailsBuiltAt": "2025-10-02T16:53:07.564592+02:00", 10895 + "thumbnailsBuiltAt": "2025-12-03T20:15:29.3481675+01:00", 10656 10896 "title": "", 10657 10897 "type": "media", 10658 10898 "url": "" ··· 10674 10914 "secondary": "", 10675 10915 "tertiary": "" 10676 10916 }, 10677 - "content": "<p>Lโ€™application de lโ€™AE. Plateforme servant de billetterie, dโ€™annuaire et dโ€™espace de communication pour les clubs.</p>", 10917 + "content": "<p>Quand jโ€™arrive ร  lโ€™ENSEEIHT en 2022, la gestion des billets venait de passer aux mains dโ€™une entreprise tierce, alors mรชme que net7, lโ€™association informatique รฉtudiante de lโ€™รฉcole, maintient et dรฉveloppe une billetterie.</p>", 10918 + "contentType": "", 10919 + "dimensions": { 10920 + "aspectRatio": 0, 10921 + "height": 0, 10922 + "width": 0 10923 + }, 10924 + "distSource": "", 10925 + "duration": 0, 10926 + "hasSound": false, 10927 + "hash": "", 10928 + "id": "nxGlj_zrne", 10929 + "index": 0, 10930 + "online": false, 10931 + "relativeSource": "", 10932 + "size": 0, 10933 + "text": "", 10934 + "thumbnails": null, 10935 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10936 + "title": "", 10937 + "type": "paragraph", 10938 + "url": "" 10939 + }, 10940 + { 10941 + "alt": "", 10942 + "analyzed": false, 10943 + "anchor": "", 10944 + "attributes": { 10945 + "autoplay": false, 10946 + "controls": false, 10947 + "loop": false, 10948 + "muted": false, 10949 + "playsinline": false 10950 + }, 10951 + "caption": "", 10952 + "colors": { 10953 + "primary": "", 10954 + "secondary": "", 10955 + "tertiary": "" 10956 + }, 10957 + "content": "<p>Les fonctions dโ€™annuaires et de liste des membres de clubs sont elles dans un portail, simple site web, lui รฉgalement veillissant et ne rรฉpondant plus vraiment aux attentes des รฉtudiantยทes.</p>", 10678 10958 "contentType": "", 10679 10959 "dimensions": { 10680 10960 "aspectRatio": 0, ··· 10685 10965 "duration": 0, 10686 10966 "hasSound": false, 10687 10967 "hash": "", 10688 - "id": "YYAgMHnXLp", 10968 + "id": "1OC2TW1w_-", 10689 10969 "index": 0, 10690 10970 "online": false, 10691 10971 "relativeSource": "", ··· 10700 10980 { 10701 10981 "alt": "", 10702 10982 "analyzed": false, 10703 - "anchor": "application", 10983 + "anchor": "", 10704 10984 "attributes": { 10705 10985 "autoplay": false, 10706 10986 "controls": false, ··· 10714 10994 "secondary": "", 10715 10995 "tertiary": "" 10716 10996 }, 10997 + "content": "<p>Il y a alors deux ans, un ancien prรฉsident de net7 avait dรฉmarrรฉ une refonte totale de ces deux sites, en une seule application moderne intรฉgrant un systรจme de billetterie et un annuaire. ร€ ce stade, lโ€™application comprend un systรจme rudimentaire de comptes (authentification et inscriptions) et posts.</p>", 10998 + "contentType": "", 10999 + "dimensions": { 11000 + "aspectRatio": 0, 11001 + "height": 0, 11002 + "width": 0 11003 + }, 11004 + "distSource": "", 11005 + "duration": 0, 11006 + "hasSound": false, 11007 + "hash": "", 11008 + "id": "8OzVijx48p", 11009 + "index": 0, 11010 + "online": false, 11011 + "relativeSource": "", 11012 + "size": 0, 11013 + "text": "", 11014 + "thumbnails": null, 11015 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11016 + "title": "", 11017 + "type": "paragraph", 11018 + "url": "" 11019 + }, 11020 + { 11021 + "alt": "", 11022 + "analyzed": true, 11023 + "anchor": "early-centraverse", 11024 + "attributes": { 11025 + "autoplay": false, 11026 + "controls": true, 11027 + "loop": false, 11028 + "muted": false, 11029 + "playsinline": false 11030 + }, 11031 + "caption": "Les dรฉbuts d'application dรฉjร  dรฉveloppรฉs", 11032 + "colors": { 11033 + "primary": "#B5B9D8", 11034 + "secondary": "#9D9EA6", 11035 + "tertiary": "#7A7A7D" 11036 + }, 10717 11037 "content": "", 11038 + "contentType": "image/png", 11039 + "dimensions": { 11040 + "aspectRatio": 0.53349, 11041 + "height": 851, 11042 + "width": 454 11043 + }, 11044 + "distSource": "churros\\.ortfo\\early-centraverse.png", 11045 + "duration": 0, 11046 + "hasSound": false, 11047 + "hash": "XJf9uSA/8katsN1qKy8mEg==", 11048 + "id": "mKMjIPmVgo", 11049 + "index": 0, 11050 + "online": false, 11051 + "relativeSource": "./early-centraverse.png", 11052 + "size": 178278, 11053 + "text": "", 11054 + "thumbnails": { 11055 + "100": "churros/mKMjIPmVgo@100.webp", 11056 + "1200": "churros/mKMjIPmVgo@1200.webp", 11057 + "400": "churros/mKMjIPmVgo@400.webp", 11058 + "600": "churros/mKMjIPmVgo@600.webp" 11059 + }, 11060 + "thumbnailsBuiltAt": "2025-12-03T20:15:30.2374462+01:00", 11061 + "title": "", 11062 + "type": "media", 11063 + "url": "" 11064 + }, 11065 + { 11066 + "alt": "", 11067 + "analyzed": true, 11068 + "anchor": "early-centraverse-event", 11069 + "attributes": { 11070 + "autoplay": false, 11071 + "controls": true, 11072 + "loop": false, 11073 + "muted": false, 11074 + "playsinline": false 11075 + }, 11076 + "caption": "L'application ร  un stade plus avancรฉ. Ici, l'รฉcran d'รฉdition d'un รฉvรจnement", 11077 + "colors": { 11078 + "primary": "#323A47", 11079 + "secondary": "#767B80", 11080 + "tertiary": "#161615" 11081 + }, 11082 + "content": "", 11083 + "contentType": "image/png", 11084 + "dimensions": { 11085 + "aspectRatio": 0.45, 11086 + "height": 2400, 11087 + "width": 1080 11088 + }, 11089 + "distSource": "churros\\.ortfo\\early-centraverse-event.png", 11090 + "duration": 0, 11091 + "hasSound": false, 11092 + "hash": "WZpK/y7CkxB1ry75hPjUoA==", 11093 + "id": "vuGPxHbh1Y", 11094 + "index": 0, 11095 + "online": false, 11096 + "relativeSource": "./early-centraverse-event.png", 11097 + "size": 153655, 11098 + "text": "", 11099 + "thumbnails": { 11100 + "100": "churros/vuGPxHbh1Y@100.webp", 11101 + "1200": "churros/vuGPxHbh1Y@1200.webp", 11102 + "400": "churros/vuGPxHbh1Y@400.webp", 11103 + "600": "churros/vuGPxHbh1Y@600.webp" 11104 + }, 11105 + "thumbnailsBuiltAt": "2025-12-03T20:15:31.4646028+01:00", 11106 + "title": "", 11107 + "type": "media", 11108 + "url": "" 11109 + }, 11110 + { 11111 + "alt": "", 11112 + "analyzed": false, 11113 + "anchor": "", 11114 + "attributes": { 11115 + "autoplay": false, 11116 + "controls": false, 11117 + "loop": false, 11118 + "muted": false, 11119 + "playsinline": false 11120 + }, 11121 + "caption": "", 11122 + "colors": { 11123 + "primary": "", 11124 + "secondary": "", 11125 + "tertiary": "" 11126 + }, 11127 + "content": "<p>Aprรจs avoir convaincu lโ€™AE de rompre leur contrat avec lโ€™entreprise tierce, dont lโ€™application รฉtait remplie de failles de sรฉcuritรฉ et globalement mal faite, je reprend les dรฉbuts de cette application, en offrant ร  lโ€™AE des รฉtapes et retours rรฉguliers pour assurer de lโ€™avancement de lโ€™appli. Nous sommes alors en mai, 4 mois avant la rentrรฉe. Lโ€™ensemble du corps รฉtudiant sโ€™inscrira dรจs le premier jour, et lโ€™appli doit รชtre prรชte ร  cette date.</p>", 10718 11128 "contentType": "", 10719 11129 "dimensions": { 10720 11130 "aspectRatio": 0, ··· 10725 11135 "duration": 0, 10726 11136 "hasSound": false, 10727 11137 "hash": "", 10728 - "id": "9sNAmXk-oL", 11138 + "id": "o9OtHoxYhZ", 11139 + "index": 0, 11140 + "online": false, 11141 + "relativeSource": "", 11142 + "size": 0, 11143 + "text": "", 11144 + "thumbnails": null, 11145 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11146 + "title": "", 11147 + "type": "paragraph", 11148 + "url": "" 11149 + }, 11150 + { 11151 + "alt": "", 11152 + "analyzed": true, 11153 + "anchor": "ae-feedback-1", 11154 + "attributes": { 11155 + "autoplay": false, 11156 + "controls": true, 11157 + "loop": false, 11158 + "muted": false, 11159 + "playsinline": false 11160 + }, 11161 + "caption": "", 11162 + "colors": { 11163 + "primary": "#EEC6C7", 11164 + "secondary": "#D8E6EC", 11165 + "tertiary": "#BBB2B7" 11166 + }, 11167 + "content": "", 11168 + "contentType": "image/png", 11169 + "dimensions": { 11170 + "aspectRatio": 1.250909, 11171 + "height": 825, 11172 + "width": 1032 11173 + }, 11174 + "distSource": "churros\\.ortfo\\ae-feedback-1.png", 11175 + "duration": 0, 11176 + "hasSound": false, 11177 + "hash": "qoiZfsXbClo5WSkwbMy5BA==", 11178 + "id": "6g9de2FcQO", 11179 + "index": 0, 11180 + "online": false, 11181 + "relativeSource": "./ae-feedback-1.png", 11182 + "size": 171754, 11183 + "text": "", 11184 + "thumbnails": { 11185 + "100": "churros/6g9de2FcQO@100.webp", 11186 + "1200": "churros/6g9de2FcQO@1200.webp", 11187 + "400": "churros/6g9de2FcQO@400.webp", 11188 + "600": "churros/6g9de2FcQO@600.webp" 11189 + }, 11190 + "thumbnailsBuiltAt": "2025-12-03T20:15:32.0198156+01:00", 11191 + "title": "", 11192 + "type": "media", 11193 + "url": "" 11194 + }, 11195 + { 11196 + "alt": "", 11197 + "analyzed": true, 11198 + "anchor": "ae-roadmap-1", 11199 + "attributes": { 11200 + "autoplay": false, 11201 + "controls": true, 11202 + "loop": false, 11203 + "muted": false, 11204 + "playsinline": false 11205 + }, 11206 + "caption": "", 11207 + "colors": { 11208 + "primary": "#A4A9B8", 11209 + "secondary": "#B1B4C2", 11210 + "tertiary": "#BCBECD" 11211 + }, 11212 + "content": "", 11213 + "contentType": "image/png", 11214 + "dimensions": { 11215 + "aspectRatio": 0.981257, 11216 + "height": 907, 11217 + "width": 890 11218 + }, 11219 + "distSource": "churros\\.ortfo\\ae-roadmap-1.png", 11220 + "duration": 0, 11221 + "hasSound": false, 11222 + "hash": "Kvc67q42tgp0hNT020pehg==", 11223 + "id": "XsCzP1qJa1", 11224 + "index": 0, 11225 + "online": false, 11226 + "relativeSource": "./ae-roadmap-1.png", 11227 + "size": 117791, 11228 + "text": "", 11229 + "thumbnails": { 11230 + "100": "churros/XsCzP1qJa1@100.webp", 11231 + "1200": "churros/XsCzP1qJa1@1200.webp", 11232 + "400": "churros/XsCzP1qJa1@400.webp", 11233 + "600": "churros/XsCzP1qJa1@600.webp" 11234 + }, 11235 + "thumbnailsBuiltAt": "2025-12-03T20:15:32.5549611+01:00", 11236 + "title": "", 11237 + "type": "media", 11238 + "url": "" 11239 + }, 11240 + { 11241 + "alt": "", 11242 + "analyzed": true, 11243 + "anchor": "ae-roadmap-2", 11244 + "attributes": { 11245 + "autoplay": false, 11246 + "controls": true, 11247 + "loop": false, 11248 + "muted": false, 11249 + "playsinline": false 11250 + }, 11251 + "caption": "", 11252 + "colors": { 11253 + "primary": "#B1B2BF", 11254 + "secondary": "#A5A7B2", 11255 + "tertiary": "#BCBDCA" 11256 + }, 11257 + "content": "", 11258 + "contentType": "image/png", 11259 + "dimensions": { 11260 + "aspectRatio": 0.935966, 11261 + "height": 937, 11262 + "width": 877 11263 + }, 11264 + "distSource": "churros\\.ortfo\\ae-roadmap-2.png", 11265 + "duration": 0, 11266 + "hasSound": false, 11267 + "hash": "NpTq/Wu3KCL7yA1ULudZKA==", 11268 + "id": "U828kgW8Tg", 11269 + "index": 0, 11270 + "online": false, 11271 + "relativeSource": "./ae-roadmap-2.png", 11272 + "size": 155924, 11273 + "text": "", 11274 + "thumbnails": { 11275 + "100": "churros/U828kgW8Tg@100.webp", 11276 + "1200": "churros/U828kgW8Tg@1200.webp", 11277 + "400": "churros/U828kgW8Tg@400.webp", 11278 + "600": "churros/U828kgW8Tg@600.webp" 11279 + }, 11280 + "thumbnailsBuiltAt": "2025-12-03T20:15:33.3025759+01:00", 11281 + "title": "", 11282 + "type": "media", 11283 + "url": "" 11284 + }, 11285 + { 11286 + "alt": "", 11287 + "analyzed": false, 11288 + "anchor": "", 11289 + "attributes": { 11290 + "autoplay": false, 11291 + "controls": false, 11292 + "loop": false, 11293 + "muted": false, 11294 + "playsinline": false 11295 + }, 11296 + "caption": "", 11297 + "colors": { 11298 + "primary": "", 11299 + "secondary": "", 11300 + "tertiary": "" 11301 + }, 11302 + "content": "<h3>Notifications</h3>", 11303 + "contentType": "", 11304 + "dimensions": { 11305 + "aspectRatio": 0, 11306 + "height": 0, 11307 + "width": 0 11308 + }, 11309 + "distSource": "", 11310 + "duration": 0, 11311 + "hasSound": false, 11312 + "hash": "", 11313 + "id": "SSSbjzGQSq", 11314 + "index": 0, 11315 + "online": false, 11316 + "relativeSource": "", 11317 + "size": 0, 11318 + "text": "", 11319 + "thumbnails": null, 11320 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11321 + "title": "", 11322 + "type": "paragraph", 11323 + "url": "" 11324 + }, 11325 + { 11326 + "alt": "", 11327 + "analyzed": false, 11328 + "anchor": "", 11329 + "attributes": { 11330 + "autoplay": false, 11331 + "controls": false, 11332 + "loop": false, 11333 + "muted": false, 11334 + "playsinline": false 11335 + }, 11336 + "caption": "", 11337 + "colors": { 11338 + "primary": "", 11339 + "secondary": "", 11340 + "tertiary": "" 11341 + }, 11342 + "content": "<p>Une des fonctionnalitรฉs phares de la nouvelle application est le support des notifications, pour par exemple prรฉvenir quโ€™un <em>shotgun</em> (ouverture des inscriptions ร  un รฉvรจnement) dรฉmarre. Cโ€™รฉtait un des arguments de vente principaux de lโ€™entreprise tierce pour vendre son appli ร  lโ€™AE.</p>", 11343 + "contentType": "", 11344 + "dimensions": { 11345 + "aspectRatio": 0, 11346 + "height": 0, 11347 + "width": 0 11348 + }, 11349 + "distSource": "", 11350 + "duration": 0, 11351 + "hasSound": false, 11352 + "hash": "", 11353 + "id": "WSnDuMdBth", 11354 + "index": 0, 11355 + "online": false, 11356 + "relativeSource": "", 11357 + "size": 0, 11358 + "text": "", 11359 + "thumbnails": null, 11360 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11361 + "title": "", 11362 + "type": "paragraph", 11363 + "url": "" 11364 + }, 11365 + { 11366 + "alt": "", 11367 + "analyzed": true, 11368 + "anchor": "notification", 11369 + "attributes": { 11370 + "autoplay": false, 11371 + "controls": true, 11372 + "loop": false, 11373 + "muted": false, 11374 + "playsinline": false 11375 + }, 11376 + "caption": "Une notification destinรฉe aux admins, annonรงant une nouvelle inscription (dรฉsactivรฉe pendant la rentrรฉe)", 11377 + "colors": { 11378 + "primary": "#2A3039", 11379 + "secondary": "#606670", 11380 + "tertiary": "#94989D" 11381 + }, 11382 + "content": "", 11383 + "contentType": "image/png", 11384 + "dimensions": { 11385 + "aspectRatio": 2.462415, 11386 + "height": 439, 11387 + "width": 1081 11388 + }, 11389 + "distSource": "churros\\.ortfo\\notification.png", 11390 + "duration": 0, 11391 + "hasSound": false, 11392 + "hash": "kRoGypHrDNMQEry9vV6fOQ==", 11393 + "id": "jpdqhnxDfd", 11394 + "index": 0, 11395 + "online": false, 11396 + "relativeSource": "./notification.png", 11397 + "size": 38948, 11398 + "text": "", 11399 + "thumbnails": { 11400 + "100": "churros/jpdqhnxDfd@100.webp", 11401 + "1200": "churros/jpdqhnxDfd@1200.webp", 11402 + "400": "churros/jpdqhnxDfd@400.webp", 11403 + "600": "churros/jpdqhnxDfd@600.webp" 11404 + }, 11405 + "thumbnailsBuiltAt": "2025-12-03T20:15:33.683218+01:00", 11406 + "title": "", 11407 + "type": "media", 11408 + "url": "" 11409 + }, 11410 + { 11411 + "alt": "", 11412 + "analyzed": false, 11413 + "anchor": "", 11414 + "attributes": { 11415 + "autoplay": false, 11416 + "controls": false, 11417 + "loop": false, 11418 + "muted": false, 11419 + "playsinline": false 11420 + }, 11421 + "caption": "", 11422 + "colors": { 11423 + "primary": "", 11424 + "secondary": "", 11425 + "tertiary": "" 11426 + }, 11427 + "content": "<p>Cependant, รฉtant donnรฉ les contraintes de dรฉveloppement, Churros a dรฉmarrรฉ (voir <a href=\"#capacitor\">Capacitor</a>) comme une <em>PWA</em>, cโ€™est-ร -dire un site web avec des fonctionnalitรฉs supplรฉmentaires qui la rapproche dโ€™une application. Par exemple, les notifications Push.</p>", 11428 + "contentType": "", 11429 + "dimensions": { 11430 + "aspectRatio": 0, 11431 + "height": 0, 11432 + "width": 0 11433 + }, 11434 + "distSource": "", 11435 + "duration": 0, 11436 + "hasSound": false, 11437 + "hash": "", 11438 + "id": "X6OgZjWcTa", 11439 + "index": 0, 11440 + "online": false, 11441 + "relativeSource": "", 11442 + "size": 0, 11443 + "text": "", 11444 + "thumbnails": null, 11445 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11446 + "title": "", 11447 + "type": "paragraph", 11448 + "url": "" 11449 + }, 11450 + { 11451 + "alt": "", 11452 + "analyzed": false, 11453 + "anchor": "", 11454 + "attributes": { 11455 + "autoplay": false, 11456 + "controls": false, 11457 + "loop": false, 11458 + "muted": false, 11459 + "playsinline": false 11460 + }, 11461 + "caption": "", 11462 + "colors": { 11463 + "primary": "", 11464 + "secondary": "", 11465 + "tertiary": "" 11466 + }, 11467 + "content": "<p>Le support des notifications Push pour les sites web sur iOS รฉtait ร  lโ€™รฉpoque trรจs rรฉcent. Il fallait sโ€™assurer que ces fameuses notifications fonctionnaient correctement au sein de la population gรฉnรฉrale, pas simplement sur quelques tรฉlรฉphones. On a donc demandรฉ aux membres organisateurs de lโ€™AE de tester massivement ces notifications, lors dโ€™une de ces pรฉriodes de retours.</p>", 11468 + "contentType": "", 11469 + "dimensions": { 11470 + "aspectRatio": 0, 11471 + "height": 0, 11472 + "width": 0 11473 + }, 11474 + "distSource": "", 11475 + "duration": 0, 11476 + "hasSound": false, 11477 + "hash": "", 11478 + "id": "mXx2DFBYIv", 11479 + "index": 0, 11480 + "online": false, 11481 + "relativeSource": "", 11482 + "size": 0, 11483 + "text": "", 11484 + "thumbnails": null, 11485 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11486 + "title": "", 11487 + "type": "paragraph", 11488 + "url": "" 11489 + }, 11490 + { 11491 + "alt": "", 11492 + "analyzed": true, 11493 + "anchor": "notification-testing", 11494 + "attributes": { 11495 + "autoplay": false, 11496 + "controls": true, 11497 + "loop": false, 11498 + "muted": false, 11499 + "playsinline": false 11500 + }, 11501 + "caption": "", 11502 + "colors": { 11503 + "primary": "#82554B", 11504 + "secondary": "#8D7866", 11505 + "tertiary": "#A4947D" 11506 + }, 11507 + "content": "", 11508 + "contentType": "image/png", 11509 + "dimensions": { 11510 + "aspectRatio": 0.713608, 11511 + "height": 632, 11512 + "width": 451 11513 + }, 11514 + "distSource": "churros\\.ortfo\\notification-testing.png", 11515 + "duration": 0, 11516 + "hasSound": false, 11517 + "hash": "LY9mZmTEA/iwq8UWJ/BKpw==", 11518 + "id": "fF-B3c0rR0", 11519 + "index": 0, 11520 + "online": false, 11521 + "relativeSource": "./notification-testing.png", 11522 + "size": 353909, 11523 + "text": "", 11524 + "thumbnails": { 11525 + "100": "churros/fF-B3c0rR0@100.webp", 11526 + "1200": "churros/fF-B3c0rR0@1200.webp", 11527 + "400": "churros/fF-B3c0rR0@400.webp", 11528 + "600": "churros/fF-B3c0rR0@600.webp" 11529 + }, 11530 + "thumbnailsBuiltAt": "2025-12-03T20:15:34.3517428+01:00", 11531 + "title": "", 11532 + "type": "media", 11533 + "url": "" 11534 + }, 11535 + { 11536 + "alt": "", 11537 + "analyzed": false, 11538 + "anchor": "", 11539 + "attributes": { 11540 + "autoplay": false, 11541 + "controls": false, 11542 + "loop": false, 11543 + "muted": false, 11544 + "playsinline": false 11545 + }, 11546 + "caption": "", 11547 + "colors": { 11548 + "primary": "", 11549 + "secondary": "", 11550 + "tertiary": "" 11551 + }, 11552 + "content": "<p>Cependant, ร  cette pรฉriode, les notifications restent assez instables: lors du dรฉploiement dโ€™une mise ร  jour de lโ€™application, on perd les notifications programmรฉes (mais pas encore envoyรฉes).</p>", 11553 + "contentType": "", 11554 + "dimensions": { 11555 + "aspectRatio": 0, 11556 + "height": 0, 11557 + "width": 0 11558 + }, 11559 + "distSource": "", 11560 + "duration": 0, 11561 + "hasSound": false, 11562 + "hash": "", 11563 + "id": "ChAAezNEll", 11564 + "index": 0, 11565 + "online": false, 11566 + "relativeSource": "", 11567 + "size": 0, 11568 + "text": "", 11569 + "thumbnails": null, 11570 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11571 + "title": "", 11572 + "type": "paragraph", 11573 + "url": "" 11574 + }, 11575 + { 11576 + "alt": "", 11577 + "analyzed": false, 11578 + "anchor": "", 11579 + "attributes": { 11580 + "autoplay": false, 11581 + "controls": false, 11582 + "loop": false, 11583 + "muted": false, 11584 + "playsinline": false 11585 + }, 11586 + "caption": "", 11587 + "colors": { 11588 + "primary": "", 11589 + "secondary": "", 11590 + "tertiary": "" 11591 + }, 11592 + "content": "<p>Plus tard, un serveur de notifications dรฉdiรฉs sera dรฉveloppรฉ (voir <a href=\"#notella\">Notella</a>).</p>", 11593 + "contentType": "", 11594 + "dimensions": { 11595 + "aspectRatio": 0, 11596 + "height": 0, 11597 + "width": 0 11598 + }, 11599 + "distSource": "", 11600 + "duration": 0, 11601 + "hasSound": false, 11602 + "hash": "", 11603 + "id": "SNse4wqyxE", 11604 + "index": 0, 11605 + "online": false, 11606 + "relativeSource": "", 11607 + "size": 0, 11608 + "text": "", 11609 + "thumbnails": null, 11610 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11611 + "title": "", 11612 + "type": "paragraph", 11613 + "url": "" 11614 + }, 11615 + { 11616 + "alt": "", 11617 + "analyzed": false, 11618 + "anchor": "", 11619 + "attributes": { 11620 + "autoplay": false, 11621 + "controls": false, 11622 + "loop": false, 11623 + "muted": false, 11624 + "playsinline": false 11625 + }, 11626 + "caption": "", 11627 + "colors": { 11628 + "primary": "", 11629 + "secondary": "", 11630 + "tertiary": "" 11631 + }, 11632 + "content": "<p>Enfin, avant la rentrรฉe arrive, et lโ€™on vรฉrifie quโ€™elle supporte le pic de charge: la rentrรฉe dโ€™une nouvelle promotion dโ€™n7ienยทnes, quelques 200 personnes.</p>", 11633 + "contentType": "", 11634 + "dimensions": { 11635 + "aspectRatio": 0, 11636 + "height": 0, 11637 + "width": 0 11638 + }, 11639 + "distSource": "", 11640 + "duration": 0, 11641 + "hasSound": false, 11642 + "hash": "", 11643 + "id": "bExbpejqqn", 11644 + "index": 0, 11645 + "online": false, 11646 + "relativeSource": "", 11647 + "size": 0, 11648 + "text": "", 11649 + "thumbnails": null, 11650 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11651 + "title": "", 11652 + "type": "paragraph", 11653 + "url": "" 11654 + }, 11655 + { 11656 + "alt": "", 11657 + "analyzed": true, 11658 + "anchor": "stress-test", 11659 + "attributes": { 11660 + "autoplay": false, 11661 + "controls": true, 11662 + "loop": false, 11663 + "muted": false, 11664 + "playsinline": false 11665 + }, 11666 + "caption": "Stress test de l'application, on simule des dizaines d'inscriptions simultanรฉes par seconde", 11667 + "colors": { 11668 + "primary": "#020949", 11669 + "secondary": "", 11670 + "tertiary": "" 11671 + }, 11672 + "content": "", 11673 + "contentType": "image/gif", 11674 + "dimensions": { 11675 + "aspectRatio": 1.777778, 11676 + "height": 450, 11677 + "width": 800 11678 + }, 11679 + "distSource": "churros\\.ortfo\\stress-test.gif", 11680 + "duration": 0, 11681 + "hasSound": false, 11682 + "hash": "fc6axhpV4rfd63KiFLKn8Q==", 11683 + "id": "2ej02y6e0W", 11684 + "index": 0, 11685 + "online": false, 11686 + "relativeSource": "./stress-test.gif", 11687 + "size": 49857366, 11688 + "text": "", 11689 + "thumbnails": null, 11690 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11691 + "title": "", 11692 + "type": "media", 11693 + "url": "" 11694 + }, 11695 + { 11696 + "alt": "", 11697 + "analyzed": false, 11698 + "anchor": "", 11699 + "attributes": { 11700 + "autoplay": false, 11701 + "controls": false, 11702 + "loop": false, 11703 + "muted": false, 11704 + "playsinline": false 11705 + }, 11706 + "caption": "", 11707 + "colors": { 11708 + "primary": "", 11709 + "secondary": "", 11710 + "tertiary": "" 11711 + }, 11712 + "content": "<p>Et enfin, le jour J arrive, et lโ€™appli est prรฉsentรฉe aux premiรจres annรฉes, qui sโ€™inscrivent en masse. Globalement, tout se passe bien, et les inscriptions aux รฉvรจnements dโ€™intรฉgration de lโ€™AE se dรฉroulent sans soucis.</p>", 11713 + "contentType": "", 11714 + "dimensions": { 11715 + "aspectRatio": 0, 11716 + "height": 0, 11717 + "width": 0 11718 + }, 11719 + "distSource": "", 11720 + "duration": 0, 11721 + "hasSound": false, 11722 + "hash": "", 11723 + "id": "9egTO5MCu9", 11724 + "index": 0, 11725 + "online": false, 11726 + "relativeSource": "", 11727 + "size": 0, 11728 + "text": "", 11729 + "thumbnails": null, 11730 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11731 + "title": "", 11732 + "type": "paragraph", 11733 + "url": "" 11734 + }, 11735 + { 11736 + "alt": "", 11737 + "analyzed": true, 11738 + "anchor": "schoolstart-unveil", 11739 + "attributes": { 11740 + "autoplay": false, 11741 + "controls": true, 11742 + "loop": false, 11743 + "muted": false, 11744 + "playsinline": false 11745 + }, 11746 + "caption": "Diffusion d'une vidรฉo annonรงant l'appli dans le grand amphithรฉรขtre de l'รฉcole, rรฉalisรฉe par l'asso vidรฉo รฉtudiante, TVn7", 11747 + "colors": { 11748 + "primary": "#16181A", 11749 + "secondary": "#C0CBDB", 11750 + "tertiary": "#4D4C4C" 11751 + }, 11752 + "content": "", 11753 + "contentType": "image/png", 11754 + "dimensions": { 11755 + "aspectRatio": 1.746108, 11756 + "height": 835, 11757 + "width": 1458 11758 + }, 11759 + "distSource": "churros\\.ortfo\\schoolstart-unveil.png", 11760 + "duration": 0, 11761 + "hasSound": false, 11762 + "hash": "GkunPZ88zuXA8oduJyW2/A==", 11763 + "id": "RQ__7rPO3H", 11764 + "index": 0, 11765 + "online": false, 11766 + "relativeSource": "./schoolstart-unveil.png", 11767 + "size": 1312339, 11768 + "text": "", 11769 + "thumbnails": { 11770 + "100": "churros/RQ__7rPO3H@100.webp", 11771 + "1200": "churros/RQ__7rPO3H@1200.webp", 11772 + "400": "churros/RQ__7rPO3H@400.webp", 11773 + "600": "churros/RQ__7rPO3H@600.webp" 11774 + }, 11775 + "thumbnailsBuiltAt": "2025-12-03T20:15:40.2737486+01:00", 11776 + "title": "", 11777 + "type": "media", 11778 + "url": "" 11779 + }, 11780 + { 11781 + "alt": "", 11782 + "analyzed": false, 11783 + "anchor": "", 11784 + "attributes": { 11785 + "autoplay": false, 11786 + "controls": false, 11787 + "loop": false, 11788 + "muted": false, 11789 + "playsinline": false 11790 + }, 11791 + "caption": "", 11792 + "colors": { 11793 + "primary": "", 11794 + "secondary": "", 11795 + "tertiary": "" 11796 + }, 11797 + "content": "<h2>Fonctionnalitรฉs</h2>", 11798 + "contentType": "", 11799 + "dimensions": { 11800 + "aspectRatio": 0, 11801 + "height": 0, 11802 + "width": 0 11803 + }, 11804 + "distSource": "", 11805 + "duration": 0, 11806 + "hasSound": false, 11807 + "hash": "", 11808 + "id": "C5sWD_AGAa", 11809 + "index": 0, 11810 + "online": false, 11811 + "relativeSource": "", 11812 + "size": 0, 11813 + "text": "", 11814 + "thumbnails": null, 11815 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11816 + "title": "", 11817 + "type": "paragraph", 11818 + "url": "" 11819 + }, 11820 + { 11821 + "alt": "", 11822 + "analyzed": false, 11823 + "anchor": "", 11824 + "attributes": { 11825 + "autoplay": false, 11826 + "controls": false, 11827 + "loop": false, 11828 + "muted": false, 11829 + "playsinline": false 11830 + }, 11831 + "caption": "", 11832 + "colors": { 11833 + "primary": "", 11834 + "secondary": "", 11835 + "tertiary": "" 11836 + }, 11837 + "content": "<h3>Annuaire, groupes et clubs</h3>", 11838 + "contentType": "", 11839 + "dimensions": { 11840 + "aspectRatio": 0, 11841 + "height": 0, 11842 + "width": 0 11843 + }, 11844 + "distSource": "", 11845 + "duration": 0, 11846 + "hasSound": false, 11847 + "hash": "", 11848 + "id": "GNr9VhiEGs", 11849 + "index": 0, 11850 + "online": false, 11851 + "relativeSource": "", 11852 + "size": 0, 11853 + "text": "", 11854 + "thumbnails": null, 11855 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11856 + "title": "", 11857 + "type": "paragraph", 11858 + "url": "" 11859 + }, 11860 + { 11861 + "alt": "", 11862 + "analyzed": false, 11863 + "anchor": "", 11864 + "attributes": { 11865 + "autoplay": false, 11866 + "controls": false, 11867 + "loop": false, 11868 + "muted": false, 11869 + "playsinline": false 11870 + }, 11871 + "caption": "", 11872 + "colors": { 11873 + "primary": "", 11874 + "secondary": "", 11875 + "tertiary": "" 11876 + }, 11877 + "content": "<p>Churros รฉtant aussi un โ€œrรฉseau socialโ€ รฉtudiant, il est possible de se faire un profil, et de rejoindre des clubs ou associations.</p>", 11878 + "contentType": "", 11879 + "dimensions": { 11880 + "aspectRatio": 0, 11881 + "height": 0, 11882 + "width": 0 11883 + }, 11884 + "distSource": "", 11885 + "duration": 0, 11886 + "hasSound": false, 11887 + "hash": "", 11888 + "id": "i_MjiJXdYd", 11889 + "index": 0, 11890 + "online": false, 11891 + "relativeSource": "", 11892 + "size": 0, 11893 + "text": "", 11894 + "thumbnails": null, 11895 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11896 + "title": "", 11897 + "type": "paragraph", 11898 + "url": "" 11899 + }, 11900 + { 11901 + "alt": "", 11902 + "analyzed": true, 11903 + "anchor": "mobile-user", 11904 + "attributes": { 11905 + "autoplay": false, 11906 + "controls": true, 11907 + "loop": false, 11908 + "muted": false, 11909 + "playsinline": false 11910 + }, 11911 + "caption": "", 11912 + "colors": { 11913 + "primary": "#134C5F", 11914 + "secondary": "#839BD1", 11915 + "tertiary": "#DBE1F0" 11916 + }, 11917 + "content": "", 11918 + "contentType": "image/png", 11919 + "dimensions": { 11920 + "aspectRatio": 0.562219, 11921 + "height": 667, 11922 + "width": 375 11923 + }, 11924 + "distSource": "churros\\.ortfo\\mobile-user.png", 11925 + "duration": 0, 11926 + "hasSound": false, 11927 + "hash": "2/65sTIdD4aC1YP5iYlIkw==", 11928 + "id": "i2hXfLIXGs", 11929 + "index": 0, 11930 + "online": false, 11931 + "relativeSource": "./mobile-user.png", 11932 + "size": 59068, 11933 + "text": "", 11934 + "thumbnails": { 11935 + "100": "churros/i2hXfLIXGs@100.webp", 11936 + "1200": "churros/i2hXfLIXGs@1200.webp", 11937 + "400": "churros/i2hXfLIXGs@400.webp", 11938 + "600": "churros/i2hXfLIXGs@600.webp" 11939 + }, 11940 + "thumbnailsBuiltAt": "2025-12-03T20:15:40.9838334+01:00", 11941 + "title": "", 11942 + "type": "media", 11943 + "url": "" 11944 + }, 11945 + { 11946 + "alt": "", 11947 + "analyzed": false, 11948 + "anchor": "", 11949 + "attributes": { 11950 + "autoplay": false, 11951 + "controls": false, 11952 + "loop": false, 11953 + "muted": false, 11954 + "playsinline": false 11955 + }, 11956 + "caption": "", 11957 + "colors": { 11958 + "primary": "", 11959 + "secondary": "", 11960 + "tertiary": "" 11961 + }, 11962 + "content": "<p>รŠtre membre permet dโ€™accรฉder aux รฉvรจnements limitรฉs ร  celui-ci, et ร  la gestion des รฉvรจnements, si lโ€™on a des responsabilitรฉs. Cโ€™est aussi administrativement important dโ€™avoir une liste des bureaux (prรฉsidentยทe, et vices-prรฉsidentยทes, trรฉsorierยทes et secrรฉatires) de tout les clubs.</p>", 11963 + "contentType": "", 11964 + "dimensions": { 11965 + "aspectRatio": 0, 11966 + "height": 0, 11967 + "width": 0 11968 + }, 11969 + "distSource": "", 11970 + "duration": 0, 11971 + "hasSound": false, 11972 + "hash": "", 11973 + "id": "6m1-yt8Q3R", 11974 + "index": 0, 11975 + "online": false, 11976 + "relativeSource": "", 11977 + "size": 0, 11978 + "text": "", 11979 + "thumbnails": null, 11980 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 11981 + "title": "", 11982 + "type": "paragraph", 11983 + "url": "" 11984 + }, 11985 + { 11986 + "alt": "", 11987 + "analyzed": true, 11988 + "anchor": "mobile-group", 11989 + "attributes": { 11990 + "autoplay": false, 11991 + "controls": true, 11992 + "loop": false, 11993 + "muted": false, 11994 + "playsinline": false 11995 + }, 11996 + "caption": "La page de l'asso photo, Photo7", 11997 + "colors": { 11998 + "primary": "#E4E2E2", 11999 + "secondary": "#A2A2A2", 12000 + "tertiary": "#606060" 12001 + }, 12002 + "content": "", 12003 + "contentType": "image/png", 12004 + "dimensions": { 12005 + "aspectRatio": 0.55922, 12006 + "height": 667, 12007 + "width": 373 12008 + }, 12009 + "distSource": "churros\\.ortfo\\mobile-group.png", 12010 + "duration": 0, 12011 + "hasSound": false, 12012 + "hash": "GidJGjl1rF0pV5Kdo5Nr/Q==", 12013 + "id": "qNAyLbO2_X", 12014 + "index": 0, 12015 + "online": false, 12016 + "relativeSource": "./mobile-group.png", 12017 + "size": 39568, 12018 + "text": "", 12019 + "thumbnails": { 12020 + "100": "churros/qNAyLbO2_X@100.webp", 12021 + "1200": "churros/qNAyLbO2_X@1200.webp", 12022 + "400": "churros/qNAyLbO2_X@400.webp", 12023 + "600": "churros/qNAyLbO2_X@600.webp" 12024 + }, 12025 + "thumbnailsBuiltAt": "2025-12-03T20:15:41.6338205+01:00", 12026 + "title": "", 12027 + "type": "media", 12028 + "url": "" 12029 + }, 12030 + { 12031 + "alt": "", 12032 + "analyzed": false, 12033 + "anchor": "", 12034 + "attributes": { 12035 + "autoplay": false, 12036 + "controls": false, 12037 + "loop": false, 12038 + "muted": false, 12039 + "playsinline": false 12040 + }, 12041 + "caption": "", 12042 + "colors": { 12043 + "primary": "", 12044 + "secondary": "", 12045 + "tertiary": "" 12046 + }, 12047 + "content": "<h3>ร‰vรจnements</h3>", 12048 + "contentType": "", 12049 + "dimensions": { 12050 + "aspectRatio": 0, 12051 + "height": 0, 12052 + "width": 0 12053 + }, 12054 + "distSource": "", 12055 + "duration": 0, 12056 + "hasSound": false, 12057 + "hash": "", 12058 + "id": "0py22-bfYD", 12059 + "index": 0, 12060 + "online": false, 12061 + "relativeSource": "", 12062 + "size": 0, 12063 + "text": "", 12064 + "thumbnails": null, 12065 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12066 + "title": "", 12067 + "type": "paragraph", 12068 + "url": "" 12069 + }, 12070 + { 12071 + "alt": "", 12072 + "analyzed": false, 12073 + "anchor": "", 12074 + "attributes": { 12075 + "autoplay": false, 12076 + "controls": false, 12077 + "loop": false, 12078 + "muted": false, 12079 + "playsinline": false 12080 + }, 12081 + "caption": "", 12082 + "colors": { 12083 + "primary": "", 12084 + "secondary": "", 12085 + "tertiary": "" 12086 + }, 12087 + "content": "<p>Quand lโ€™AE ou un club organise un รฉvรจnement, il est visible dans lโ€™application. Cโ€™est ici que lโ€™on peut rรฉserver sa place.</p>", 12088 + "contentType": "", 12089 + "dimensions": { 12090 + "aspectRatio": 0, 12091 + "height": 0, 12092 + "width": 0 12093 + }, 12094 + "distSource": "", 12095 + "duration": 0, 12096 + "hasSound": false, 12097 + "hash": "", 12098 + "id": "y0hv_y5-1i", 12099 + "index": 0, 12100 + "online": false, 12101 + "relativeSource": "", 12102 + "size": 0, 12103 + "text": "", 12104 + "thumbnails": null, 12105 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12106 + "title": "", 12107 + "type": "paragraph", 12108 + "url": "" 12109 + }, 12110 + { 12111 + "alt": "", 12112 + "analyzed": true, 12113 + "anchor": "desktop-events", 12114 + "attributes": { 12115 + "autoplay": false, 12116 + "controls": true, 12117 + "loop": false, 12118 + "muted": false, 12119 + "playsinline": false 12120 + }, 12121 + "caption": "Liste des รฉvรจnements", 12122 + "colors": { 12123 + "primary": "#634F59", 12124 + "secondary": "#887876", 12125 + "tertiary": "#A89993" 12126 + }, 12127 + "content": "", 12128 + "contentType": "image/png", 12129 + "dimensions": { 12130 + "aspectRatio": 1.666667, 12131 + "height": 1005, 12132 + "width": 1675 12133 + }, 12134 + "distSource": "churros\\.ortfo\\desktop-events.png", 12135 + "duration": 0, 12136 + "hasSound": false, 12137 + "hash": "+yBVY+0TSa33kfrHRPkfCQ==", 12138 + "id": "6wDmiucCUy", 12139 + "index": 0, 12140 + "online": false, 12141 + "relativeSource": "./desktop-events.png", 12142 + "size": 292163, 12143 + "text": "", 12144 + "thumbnails": { 12145 + "100": "churros/6wDmiucCUy@100.webp", 12146 + "1200": "churros/6wDmiucCUy@1200.webp", 12147 + "400": "churros/6wDmiucCUy@400.webp", 12148 + "600": "churros/6wDmiucCUy@600.webp" 12149 + }, 12150 + "thumbnailsBuiltAt": "2025-12-03T20:15:42.3362886+01:00", 12151 + "title": "", 12152 + "type": "media", 12153 + "url": "" 12154 + }, 12155 + { 12156 + "alt": "", 12157 + "analyzed": true, 12158 + "anchor": "mobile-event", 12159 + "attributes": { 12160 + "autoplay": false, 12161 + "controls": true, 12162 + "loop": false, 12163 + "muted": false, 12164 + "playsinline": false 12165 + }, 12166 + "caption": "Un รฉvรจnement", 12167 + "colors": { 12168 + "primary": "#8C8C8C", 12169 + "secondary": "#DADADA", 12170 + "tertiary": "#3B3B3B" 12171 + }, 12172 + "content": "", 12173 + "contentType": "image/png", 12174 + "dimensions": { 12175 + "aspectRatio": 0.556054, 12176 + "height": 669, 12177 + "width": 372 12178 + }, 12179 + "distSource": "churros\\.ortfo\\mobile-event.png", 12180 + "duration": 0, 12181 + "hasSound": false, 12182 + "hash": "XRtLgMz3aEbpnO0Mq4Ls8A==", 12183 + "id": "_v176K9-ER", 12184 + "index": 0, 12185 + "online": false, 12186 + "relativeSource": "./mobile-event.png", 12187 + "size": 35442, 12188 + "text": "", 12189 + "thumbnails": { 12190 + "100": "churros/_v176K9-ER@100.webp", 12191 + "1200": "churros/_v176K9-ER@1200.webp", 12192 + "400": "churros/_v176K9-ER@400.webp", 12193 + "600": "churros/_v176K9-ER@600.webp" 12194 + }, 12195 + "thumbnailsBuiltAt": "2025-12-03T20:15:42.957864+01:00", 12196 + "title": "", 12197 + "type": "media", 12198 + "url": "" 12199 + }, 12200 + { 12201 + "alt": "", 12202 + "analyzed": false, 12203 + "anchor": "", 12204 + "attributes": { 12205 + "autoplay": false, 12206 + "controls": false, 12207 + "loop": false, 12208 + "muted": false, 12209 + "playsinline": false 12210 + }, 12211 + "caption": "", 12212 + "colors": { 12213 + "primary": "", 12214 + "secondary": "", 12215 + "tertiary": "" 12216 + }, 12217 + "content": "<h3>Billetterie</h3>", 12218 + "contentType": "", 12219 + "dimensions": { 12220 + "aspectRatio": 0, 12221 + "height": 0, 12222 + "width": 0 12223 + }, 12224 + "distSource": "", 12225 + "duration": 0, 12226 + "hasSound": false, 12227 + "hash": "", 12228 + "id": "pydYCQsK0K", 12229 + "index": 0, 12230 + "online": false, 12231 + "relativeSource": "", 12232 + "size": 0, 12233 + "text": "", 12234 + "thumbnails": null, 12235 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12236 + "title": "", 12237 + "type": "paragraph", 12238 + "url": "" 12239 + }, 12240 + { 12241 + "alt": "", 12242 + "analyzed": false, 12243 + "anchor": "", 12244 + "attributes": { 12245 + "autoplay": false, 12246 + "controls": false, 12247 + "loop": false, 12248 + "muted": false, 12249 + "playsinline": false 12250 + }, 12251 + "caption": "", 12252 + "colors": { 12253 + "primary": "", 12254 + "secondary": "", 12255 + "tertiary": "" 12256 + }, 12257 + "content": "<p>La billetterie de Churros propose de nombreuses options pour reprรฉsenter tout ce quโ€™une AE peut souhaiter dโ€™avoir: limiter des billets ร  des promos, faire des รฉvรจnements avec des personnes extรฉrieures ร  lโ€™รฉcole, pouvoir parrainer des personnes, faire des billets sur invitation, grouper des billets ensemble et limiter la somme de places sur les billets du groupeโ€ฆ</p>", 12258 + "contentType": "", 12259 + "dimensions": { 12260 + "aspectRatio": 0, 12261 + "height": 0, 12262 + "width": 0 12263 + }, 12264 + "distSource": "", 12265 + "duration": 0, 12266 + "hasSound": false, 12267 + "hash": "", 12268 + "id": "ULFx3Sn6Pf", 12269 + "index": 0, 12270 + "online": false, 12271 + "relativeSource": "", 12272 + "size": 0, 12273 + "text": "", 12274 + "thumbnails": null, 12275 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12276 + "title": "", 12277 + "type": "paragraph", 12278 + "url": "" 12279 + }, 12280 + { 12281 + "alt": "", 12282 + "analyzed": true, 12283 + "anchor": "ticketing-settings", 12284 + "attributes": { 12285 + "autoplay": false, 12286 + "controls": true, 12287 + "loop": false, 12288 + "muted": false, 12289 + "playsinline": false 12290 + }, 12291 + "caption": "Rรฉglages possible sur la billetterie d'un รฉvรจnement", 12292 + "colors": { 12293 + "primary": "#F3F2F2", 12294 + "secondary": "#D9D9D9", 12295 + "tertiary": "#B5B5B5" 12296 + }, 12297 + "content": "", 12298 + "contentType": "image/png", 12299 + "dimensions": { 12300 + "aspectRatio": 1.69281, 12301 + "height": 612, 12302 + "width": 1036 12303 + }, 12304 + "distSource": "churros\\.ortfo\\ticketing-settings.png", 12305 + "duration": 0, 12306 + "hasSound": false, 12307 + "hash": "ESAaomH4XV2VL52Pg07KLQ==", 12308 + "id": "ByQrAR4JY0", 12309 + "index": 0, 12310 + "online": false, 12311 + "relativeSource": "./ticketing-settings.png", 12312 + "size": 200952, 12313 + "text": "", 12314 + "thumbnails": { 12315 + "100": "churros/ByQrAR4JY0@100.webp", 12316 + "1200": "churros/ByQrAR4JY0@1200.webp", 12317 + "400": "churros/ByQrAR4JY0@400.webp", 12318 + "600": "churros/ByQrAR4JY0@600.webp" 12319 + }, 12320 + "thumbnailsBuiltAt": "2025-12-03T20:15:43.4357869+01:00", 12321 + "title": "", 12322 + "type": "media", 12323 + "url": "" 12324 + }, 12325 + { 12326 + "alt": "", 12327 + "analyzed": false, 12328 + "anchor": "", 12329 + "attributes": { 12330 + "autoplay": false, 12331 + "controls": false, 12332 + "loop": false, 12333 + "muted": false, 12334 + "playsinline": false 12335 + }, 12336 + "caption": "", 12337 + "colors": { 12338 + "primary": "", 12339 + "secondary": "", 12340 + "tertiary": "" 12341 + }, 12342 + "content": "<p>Une fois rรฉservรฉs, les billets sont scannables par les <em>managers</em> via un QR code, que la personne prรฉsente ร  lโ€™entrรฉe de lโ€™รฉvรจnement</p>", 12343 + "contentType": "", 12344 + "dimensions": { 12345 + "aspectRatio": 0, 12346 + "height": 0, 12347 + "width": 0 12348 + }, 12349 + "distSource": "", 12350 + "duration": 0, 12351 + "hasSound": false, 12352 + "hash": "", 12353 + "id": "uPYEbd_C1u", 12354 + "index": 0, 12355 + "online": false, 12356 + "relativeSource": "", 12357 + "size": 0, 12358 + "text": "", 12359 + "thumbnails": null, 12360 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12361 + "title": "", 12362 + "type": "paragraph", 12363 + "url": "" 12364 + }, 12365 + { 12366 + "alt": "", 12367 + "analyzed": true, 12368 + "anchor": "booking-scan", 12369 + "attributes": { 12370 + "autoplay": false, 12371 + "controls": true, 12372 + "loop": false, 12373 + "muted": false, 12374 + "playsinline": false 12375 + }, 12376 + "caption": "", 12377 + "colors": { 12378 + "primary": "#535549", 12379 + "secondary": "#908F82", 12380 + "tertiary": "#C4C4B6" 12381 + }, 12382 + "content": "", 12383 + "contentType": "image/png", 12384 + "dimensions": { 12385 + "aspectRatio": 1.386667, 12386 + "height": 675, 12387 + "width": 936 12388 + }, 12389 + "distSource": "churros\\.ortfo\\booking-scan.png", 12390 + "duration": 0, 12391 + "hasSound": false, 12392 + "hash": "ClfvZlamwOmqz++VBgTRGw==", 12393 + "id": "TXwald6OF3", 12394 + "index": 0, 12395 + "online": false, 12396 + "relativeSource": "./booking-scan.png", 12397 + "size": 525637, 12398 + "text": "", 12399 + "thumbnails": { 12400 + "100": "churros/TXwald6OF3@100.webp", 12401 + "1200": "churros/TXwald6OF3@1200.webp", 12402 + "400": "churros/TXwald6OF3@400.webp", 12403 + "600": "churros/TXwald6OF3@600.webp" 12404 + }, 12405 + "thumbnailsBuiltAt": "2025-12-03T20:15:43.9858507+01:00", 12406 + "title": "", 12407 + "type": "media", 12408 + "url": "" 12409 + }, 12410 + { 12411 + "alt": "", 12412 + "analyzed": false, 12413 + "anchor": "", 12414 + "attributes": { 12415 + "autoplay": false, 12416 + "controls": false, 12417 + "loop": false, 12418 + "muted": false, 12419 + "playsinline": false 12420 + }, 12421 + "caption": "", 12422 + "colors": { 12423 + "primary": "", 12424 + "secondary": "", 12425 + "tertiary": "" 12426 + }, 12427 + "content": "<p>Les managers dโ€™un รฉvรจnement peuvent รชtre rajoutรฉs via un lien dโ€™invitation, on en ayant un certain rรดle (prรฉsidentยทe, etc) au sein du groupe (club ou association) qui organise lโ€™รฉvรจnement en question.</p>", 12428 + "contentType": "", 12429 + "dimensions": { 12430 + "aspectRatio": 0, 12431 + "height": 0, 12432 + "width": 0 12433 + }, 12434 + "distSource": "", 12435 + "duration": 0, 12436 + "hasSound": false, 12437 + "hash": "", 12438 + "id": "g94RsF_jRy", 12439 + "index": 0, 12440 + "online": false, 12441 + "relativeSource": "", 12442 + "size": 0, 12443 + "text": "", 12444 + "thumbnails": null, 12445 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12446 + "title": "", 12447 + "type": "paragraph", 12448 + "url": "" 12449 + }, 12450 + { 12451 + "alt": "", 12452 + "analyzed": true, 12453 + "anchor": "event-manager-invites", 12454 + "attributes": { 12455 + "autoplay": false, 12456 + "controls": true, 12457 + "loop": false, 12458 + "muted": false, 12459 + "playsinline": false 12460 + }, 12461 + "caption": "", 12462 + "colors": { 12463 + "primary": "#B0B6BF", 12464 + "secondary": "#9B9A9E", 12465 + "tertiary": "#4E4D4D" 12466 + }, 12467 + "content": "", 12468 + "contentType": "image/png", 12469 + "dimensions": { 12470 + "aspectRatio": 1.121464, 12471 + "height": 601, 12472 + "width": 674 12473 + }, 12474 + "distSource": "churros\\.ortfo\\event-manager-invites.png", 12475 + "duration": 0, 12476 + "hasSound": false, 12477 + "hash": "/hGD/lGo10bkuuS+ao/FHg==", 12478 + "id": "TPEsg5-EGf", 12479 + "index": 0, 12480 + "online": false, 12481 + "relativeSource": "./event-manager-invites.png", 12482 + "size": 48277, 12483 + "text": "", 12484 + "thumbnails": { 12485 + "100": "churros/TPEsg5-EGf@100.webp", 12486 + "1200": "churros/TPEsg5-EGf@1200.webp", 12487 + "400": "churros/TPEsg5-EGf@400.webp", 12488 + "600": "churros/TPEsg5-EGf@600.webp" 12489 + }, 12490 + "thumbnailsBuiltAt": "2025-12-03T20:15:44.5211934+01:00", 12491 + "title": "", 12492 + "type": "media", 12493 + "url": "" 12494 + }, 12495 + { 12496 + "alt": "", 12497 + "analyzed": false, 12498 + "anchor": "", 12499 + "attributes": { 12500 + "autoplay": false, 12501 + "controls": false, 12502 + "loop": false, 12503 + "muted": false, 12504 + "playsinline": false 12505 + }, 12506 + "caption": "", 12507 + "colors": { 12508 + "primary": "", 12509 + "secondary": "", 12510 + "tertiary": "" 12511 + }, 12512 + "content": "<p>Une communucation par Websockets permet ร  la page affichant le QR code de rรฉagir en temps rรฉel: dรจs que la place est scannรฉe, et dโ€™afficher une animation.</p>", 12513 + "contentType": "", 12514 + "dimensions": { 12515 + "aspectRatio": 0, 12516 + "height": 0, 12517 + "width": 0 12518 + }, 12519 + "distSource": "", 12520 + "duration": 0, 12521 + "hasSound": false, 12522 + "hash": "", 12523 + "id": "UU0q6BjVAn", 12524 + "index": 0, 12525 + "online": false, 12526 + "relativeSource": "", 12527 + "size": 0, 12528 + "text": "", 12529 + "thumbnails": null, 12530 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12531 + "title": "", 12532 + "type": "paragraph", 12533 + "url": "" 12534 + }, 12535 + { 12536 + "alt": "", 12537 + "analyzed": false, 12538 + "anchor": "", 12539 + "attributes": { 12540 + "autoplay": false, 12541 + "controls": false, 12542 + "loop": false, 12543 + "muted": false, 12544 + "playsinline": false 12545 + }, 12546 + "caption": "", 12547 + "colors": { 12548 + "primary": "", 12549 + "secondary": "", 12550 + "tertiary": "" 12551 + }, 12552 + "content": "<h3>Paiement</h3>", 12553 + "contentType": "", 12554 + "dimensions": { 12555 + "aspectRatio": 0, 12556 + "height": 0, 12557 + "width": 0 12558 + }, 12559 + "distSource": "", 12560 + "duration": 0, 12561 + "hasSound": false, 12562 + "hash": "", 12563 + "id": "G2atqhTysk", 12564 + "index": 0, 12565 + "online": false, 12566 + "relativeSource": "", 12567 + "size": 0, 12568 + "text": "", 12569 + "thumbnails": null, 12570 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12571 + "title": "", 12572 + "type": "paragraph", 12573 + "url": "" 12574 + }, 12575 + { 12576 + "alt": "", 12577 + "analyzed": false, 12578 + "anchor": "", 12579 + "attributes": { 12580 + "autoplay": false, 12581 + "controls": false, 12582 + "loop": false, 12583 + "muted": false, 12584 + "playsinline": false 12585 + }, 12586 + "caption": "", 12587 + "colors": { 12588 + "primary": "", 12589 + "secondary": "", 12590 + "tertiary": "" 12591 + }, 12592 + "content": "<p>Lโ€™AE est paternaire avec Sumeria (anciennement Lydia), et utilise donc leur solution pour recevoir lโ€™argent lors de lโ€™organisation dโ€™รฉvรจnement paiements.</p>", 12593 + "contentType": "", 12594 + "dimensions": { 12595 + "aspectRatio": 0, 12596 + "height": 0, 12597 + "width": 0 12598 + }, 12599 + "distSource": "", 12600 + "duration": 0, 12601 + "hasSound": false, 12602 + "hash": "", 12603 + "id": "xCbG8C1SS3", 12604 + "index": 0, 12605 + "online": false, 12606 + "relativeSource": "", 12607 + "size": 0, 12608 + "text": "", 12609 + "thumbnails": null, 12610 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12611 + "title": "", 12612 + "type": "paragraph", 12613 + "url": "" 12614 + }, 12615 + { 12616 + "alt": "", 12617 + "analyzed": false, 12618 + "anchor": "", 12619 + "attributes": { 12620 + "autoplay": false, 12621 + "controls": false, 12622 + "loop": false, 12623 + "muted": false, 12624 + "playsinline": false 12625 + }, 12626 + "caption": "", 12627 + "colors": { 12628 + "primary": "", 12629 + "secondary": "", 12630 + "tertiary": "" 12631 + }, 12632 + "content": "<p>Churros sโ€™intรจgre avec Sumeria pour permettre aux รฉtudiantยทes de payer leur place aux รฉvรจnements.</p>", 12633 + "contentType": "", 12634 + "dimensions": { 12635 + "aspectRatio": 0, 12636 + "height": 0, 12637 + "width": 0 12638 + }, 12639 + "distSource": "", 12640 + "duration": 0, 12641 + "hasSound": false, 12642 + "hash": "", 12643 + "id": "r6-JVmEtX-", 12644 + "index": 0, 12645 + "online": false, 12646 + "relativeSource": "", 12647 + "size": 0, 12648 + "text": "", 12649 + "thumbnails": null, 12650 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12651 + "title": "", 12652 + "type": "paragraph", 12653 + "url": "" 12654 + }, 12655 + { 12656 + "alt": "", 12657 + "analyzed": false, 12658 + "anchor": "", 12659 + "attributes": { 12660 + "autoplay": false, 12661 + "controls": false, 12662 + "loop": false, 12663 + "muted": false, 12664 + "playsinline": false 12665 + }, 12666 + "caption": "", 12667 + "colors": { 12668 + "primary": "", 12669 + "secondary": "", 12670 + "tertiary": "" 12671 + }, 12672 + "content": "<p>Pour cela, Churros expose ร  Sumeria un <em>webhook</em>, sur lequel Sumeria envoie une requรชte pour notifier de la terminaison dโ€™un paiement.</p>", 12673 + "contentType": "", 12674 + "dimensions": { 12675 + "aspectRatio": 0, 12676 + "height": 0, 12677 + "width": 0 12678 + }, 12679 + "distSource": "", 12680 + "duration": 0, 12681 + "hasSound": false, 12682 + "hash": "", 12683 + "id": "bla50vEGwP", 12684 + "index": 0, 12685 + "online": false, 12686 + "relativeSource": "", 12687 + "size": 0, 12688 + "text": "", 12689 + "thumbnails": null, 12690 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12691 + "title": "", 12692 + "type": "paragraph", 12693 + "url": "" 12694 + }, 12695 + { 12696 + "alt": "", 12697 + "analyzed": false, 12698 + "anchor": "", 12699 + "attributes": { 12700 + "autoplay": false, 12701 + "controls": false, 12702 + "loop": false, 12703 + "muted": false, 12704 + "playsinline": false 12705 + }, 12706 + "caption": "", 12707 + "colors": { 12708 + "primary": "", 12709 + "secondary": "", 12710 + "tertiary": "" 12711 + }, 12712 + "content": "<p>Par mesure de sรฉcuritรฉ, Churros vient vรฉrifier manuellement lโ€™รฉtat du paiement au moment de lโ€™accรจs au QR code.</p>", 12713 + "contentType": "", 12714 + "dimensions": { 12715 + "aspectRatio": 0, 12716 + "height": 0, 12717 + "width": 0 12718 + }, 12719 + "distSource": "", 12720 + "duration": 0, 12721 + "hasSound": false, 12722 + "hash": "", 12723 + "id": "doy11G_UR4", 12724 + "index": 0, 12725 + "online": false, 12726 + "relativeSource": "", 12727 + "size": 0, 12728 + "text": "", 12729 + "thumbnails": null, 12730 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12731 + "title": "", 12732 + "type": "paragraph", 12733 + "url": "" 12734 + }, 12735 + { 12736 + "alt": "", 12737 + "analyzed": false, 12738 + "anchor": "", 12739 + "attributes": { 12740 + "autoplay": false, 12741 + "controls": false, 12742 + "loop": false, 12743 + "muted": false, 12744 + "playsinline": false 12745 + }, 12746 + "caption": "", 12747 + "colors": { 12748 + "primary": "", 12749 + "secondary": "", 12750 + "tertiary": "" 12751 + }, 12752 + "content": "<h3>Un API polyvalent</h3>", 12753 + "contentType": "", 12754 + "dimensions": { 12755 + "aspectRatio": 0, 12756 + "height": 0, 12757 + "width": 0 12758 + }, 12759 + "distSource": "", 12760 + "duration": 0, 12761 + "hasSound": false, 12762 + "hash": "", 12763 + "id": "x0VA9qBXmg", 12764 + "index": 0, 12765 + "online": false, 12766 + "relativeSource": "", 12767 + "size": 0, 12768 + "text": "", 12769 + "thumbnails": null, 12770 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12771 + "title": "", 12772 + "type": "paragraph", 12773 + "url": "" 12774 + }, 12775 + { 12776 + "alt": "", 12777 + "analyzed": false, 12778 + "anchor": "", 12779 + "attributes": { 12780 + "autoplay": false, 12781 + "controls": false, 12782 + "loop": false, 12783 + "muted": false, 12784 + "playsinline": false 12785 + }, 12786 + "caption": "", 12787 + "colors": { 12788 + "primary": "", 12789 + "secondary": "", 12790 + "tertiary": "" 12791 + }, 12792 + "content": "<p>La vision dโ€™ensemble derriรจre Churros รฉtait que la plateforme serve dโ€™endroit unique de stockage de toutes les donnรฉes relatives ร  la vie รฉtudiante.</p>", 12793 + "contentType": "", 12794 + "dimensions": { 12795 + "aspectRatio": 0, 12796 + "height": 0, 12797 + "width": 0 12798 + }, 12799 + "distSource": "", 12800 + "duration": 0, 12801 + "hasSound": false, 12802 + "hash": "", 12803 + "id": "sB7aOuaaDu", 12804 + "index": 0, 12805 + "online": false, 12806 + "relativeSource": "", 12807 + "size": 0, 12808 + "text": "", 12809 + "thumbnails": null, 12810 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12811 + "title": "", 12812 + "type": "paragraph", 12813 + "url": "" 12814 + }, 12815 + { 12816 + "alt": "", 12817 + "analyzed": false, 12818 + "anchor": "", 12819 + "attributes": { 12820 + "autoplay": false, 12821 + "controls": false, 12822 + "loop": false, 12823 + "muted": false, 12824 + "playsinline": false 12825 + }, 12826 + "caption": "", 12827 + "colors": { 12828 + "primary": "", 12829 + "secondary": "", 12830 + "tertiary": "" 12831 + }, 12832 + "content": "<p>Ces donnรฉes sont ensuites rรฉutilistables de maniรจres trรจs diverses par dโ€™autres services.</p>", 12833 + "contentType": "", 12834 + "dimensions": { 12835 + "aspectRatio": 0, 12836 + "height": 0, 12837 + "width": 0 12838 + }, 12839 + "distSource": "", 12840 + "duration": 0, 12841 + "hasSound": false, 12842 + "hash": "", 12843 + "id": "Tift_2g3nt", 12844 + "index": 0, 12845 + "online": false, 12846 + "relativeSource": "", 12847 + "size": 0, 12848 + "text": "", 12849 + "thumbnails": null, 12850 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12851 + "title": "", 12852 + "type": "paragraph", 12853 + "url": "" 12854 + }, 12855 + { 12856 + "alt": "", 12857 + "analyzed": false, 12858 + "anchor": "", 12859 + "attributes": { 12860 + "autoplay": false, 12861 + "controls": false, 12862 + "loop": false, 12863 + "muted": false, 12864 + "playsinline": false 12865 + }, 12866 + "caption": "", 12867 + "colors": { 12868 + "primary": "", 12869 + "secondary": "", 12870 + "tertiary": "" 12871 + }, 12872 + "content": "<p>La technologie pour construire cette API nโ€™est donc pas REST, comme cโ€™est souvent le cas, mais GraphQL, une autre maniรจre dโ€™architecturer un API, qui permet <em>au client</em> dโ€™exprimer ses besoins en donnรฉes.</p>", 12873 + "contentType": "", 12874 + "dimensions": { 12875 + "aspectRatio": 0, 12876 + "height": 0, 12877 + "width": 0 12878 + }, 12879 + "distSource": "", 12880 + "duration": 0, 12881 + "hasSound": false, 12882 + "hash": "", 12883 + "id": "DYCBlavnRV", 12884 + "index": 0, 12885 + "online": false, 12886 + "relativeSource": "", 12887 + "size": 0, 12888 + "text": "", 12889 + "thumbnails": null, 12890 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12891 + "title": "", 12892 + "type": "paragraph", 12893 + "url": "" 12894 + }, 12895 + { 12896 + "alt": "", 12897 + "analyzed": false, 12898 + "anchor": "", 12899 + "attributes": { 12900 + "autoplay": false, 12901 + "controls": false, 12902 + "loop": false, 12903 + "muted": false, 12904 + "playsinline": false 12905 + }, 12906 + "caption": "", 12907 + "colors": { 12908 + "primary": "", 12909 + "secondary": "", 12910 + "tertiary": "" 12911 + }, 12912 + "content": "<p>Par exemple, si un service tiers ร  besoin des photos de profils de lโ€™ensemble des รฉtudiants dโ€™une promotion (pour faire un โ€œtrombinoscopeโ€, par exemple), avec un API REST, si lโ€™URL vers la photo nโ€™est pas incluse dans la rรฉponse dโ€™un endpoint โ€œlister les รฉlรจves dโ€™une promoโ€, il faut faire $n+1$ requรชtes, avec $n$ le nombre dโ€™รฉtudiants:</p>", 12913 + "contentType": "", 12914 + "dimensions": { 12915 + "aspectRatio": 0, 12916 + "height": 0, 12917 + "width": 0 12918 + }, 12919 + "distSource": "", 12920 + "duration": 0, 12921 + "hasSound": false, 12922 + "hash": "", 12923 + "id": "-eZ2VLLzMG", 12924 + "index": 0, 12925 + "online": false, 12926 + "relativeSource": "", 12927 + "size": 0, 12928 + "text": "", 12929 + "thumbnails": null, 12930 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12931 + "title": "", 12932 + "type": "paragraph", 12933 + "url": "" 12934 + }, 12935 + { 12936 + "alt": "", 12937 + "analyzed": false, 12938 + "anchor": "", 12939 + "attributes": { 12940 + "autoplay": false, 12941 + "controls": false, 12942 + "loop": false, 12943 + "muted": false, 12944 + "playsinline": false 12945 + }, 12946 + "caption": "", 12947 + "colors": { 12948 + "primary": "", 12949 + "secondary": "", 12950 + "tertiary": "" 12951 + }, 12952 + "content": "<pre><code>/students?promo=2025\n/students/1\n/students/2\n/students/3\n...\n</code></pre>", 12953 + "contentType": "", 12954 + "dimensions": { 12955 + "aspectRatio": 0, 12956 + "height": 0, 12957 + "width": 0 12958 + }, 12959 + "distSource": "", 12960 + "duration": 0, 12961 + "hasSound": false, 12962 + "hash": "", 12963 + "id": "yG4zPdM2CL", 12964 + "index": 0, 12965 + "online": false, 12966 + "relativeSource": "", 12967 + "size": 0, 12968 + "text": "", 12969 + "thumbnails": null, 12970 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 12971 + "title": "", 12972 + "type": "paragraph", 12973 + "url": "" 12974 + }, 12975 + { 12976 + "alt": "", 12977 + "analyzed": false, 12978 + "anchor": "", 12979 + "attributes": { 12980 + "autoplay": false, 12981 + "controls": false, 12982 + "loop": false, 12983 + "muted": false, 12984 + "playsinline": false 12985 + }, 12986 + "caption": "", 12987 + "colors": { 12988 + "primary": "", 12989 + "secondary": "", 12990 + "tertiary": "" 12991 + }, 12992 + "content": "<p>Avec GraphQL, il suffit dโ€™une requรชte: cโ€™est <em>le client</em> qui dรฉcide quels donnรฉes figurent dans la rรฉponse. Il nโ€™y a donc ni trop de donnรฉes, ni pas assez:</p>", 12993 + "contentType": "", 12994 + "dimensions": { 12995 + "aspectRatio": 0, 12996 + "height": 0, 12997 + "width": 0 12998 + }, 12999 + "distSource": "", 13000 + "duration": 0, 13001 + "hasSound": false, 13002 + "hash": "", 13003 + "id": "tdpAgA9z7F", 10729 13004 "index": 0, 10730 13005 "online": false, 10731 13006 "relativeSource": "", 10732 13007 "size": 0, 10733 - "text": "Application", 13008 + "text": "", 10734 13009 "thumbnails": null, 10735 13010 "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10736 13011 "title": "", 10737 - "type": "link", 10738 - "url": "https://churros.inpt.fr" 13012 + "type": "paragraph", 13013 + "url": "" 10739 13014 }, 10740 13015 { 10741 13016 "alt": "", 10742 13017 "analyzed": false, 10743 - "anchor": "api", 13018 + "anchor": "", 13019 + "attributes": { 13020 + "autoplay": false, 13021 + "controls": false, 13022 + "loop": false, 13023 + "muted": false, 13024 + "playsinline": false 13025 + }, 13026 + "caption": "", 13027 + "colors": { 13028 + "primary": "", 13029 + "secondary": "", 13030 + "tertiary": "" 13031 + }, 13032 + "content": "<pre tabindex=\"0\" style=\"background-color:#fff;\"><code><span style=\"display:flex;\"><span><span style=\"color:#000;font-weight:bold\">query</span><span style=\"color:#bbb\"> </span><span style=\"color:#458;font-weight:bold\">Trombinoscope</span><span style=\"color:#bbb\"> </span>{<span style=\"color:#bbb\">\n</span></span></span><span style=\"display:flex;\"><span><span style=\"color:#bbb\"> </span>users(graduationYear:<span style=\"color:#bbb\"> </span><span style=\"color:#099\">2025</span>)<span style=\"color:#bbb\"> </span>{<span style=\"color:#bbb\">\n</span></span></span><span style=\"display:flex;\"><span><span style=\"color:#bbb\"> </span><span style=\"color:#458;font-weight:bold\">profilePicture</span><span style=\"color:#bbb\">\n</span></span></span><span style=\"display:flex;\"><span><span style=\"color:#bbb\"> </span>}<span style=\"color:#bbb\">\n</span></span></span><span style=\"display:flex;\"><span><span style=\"color:#bbb\"></span>}<span style=\"color:#bbb\">\n</span></span></span></code></pre>", 13033 + "contentType": "", 13034 + "dimensions": { 13035 + "aspectRatio": 0, 13036 + "height": 0, 13037 + "width": 0 13038 + }, 13039 + "distSource": "", 13040 + "duration": 0, 13041 + "hasSound": false, 13042 + "hash": "", 13043 + "id": "nMsj35xg1L", 13044 + "index": 0, 13045 + "online": false, 13046 + "relativeSource": "", 13047 + "size": 0, 13048 + "text": "", 13049 + "thumbnails": null, 13050 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13051 + "title": "", 13052 + "type": "paragraph", 13053 + "url": "" 13054 + }, 13055 + { 13056 + "alt": "", 13057 + "analyzed": false, 13058 + "anchor": "", 13059 + "attributes": { 13060 + "autoplay": false, 13061 + "controls": false, 13062 + "loop": false, 13063 + "muted": false, 13064 + "playsinline": false 13065 + }, 13066 + "caption": "", 13067 + "colors": { 13068 + "primary": "", 13069 + "secondary": "", 13070 + "tertiary": "" 13071 + }, 13072 + "content": "<p>ร‰tant donnรฉ le projet de base de donnรฉe centrale quโ€™est Churros, il nous fallait un API dont les besoins en donnรฉes soient inconnus.</p>", 13073 + "contentType": "", 13074 + "dimensions": { 13075 + "aspectRatio": 0, 13076 + "height": 0, 13077 + "width": 0 13078 + }, 13079 + "distSource": "", 13080 + "duration": 0, 13081 + "hasSound": false, 13082 + "hash": "", 13083 + "id": "Aso8dVxNDj", 13084 + "index": 0, 13085 + "online": false, 13086 + "relativeSource": "", 13087 + "size": 0, 13088 + "text": "", 13089 + "thumbnails": null, 13090 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13091 + "title": "", 13092 + "type": "paragraph", 13093 + "url": "" 13094 + }, 13095 + { 13096 + "alt": "", 13097 + "analyzed": false, 13098 + "anchor": "", 13099 + "attributes": { 13100 + "autoplay": false, 13101 + "controls": false, 13102 + "loop": false, 13103 + "muted": false, 13104 + "playsinline": false 13105 + }, 13106 + "caption": "", 13107 + "colors": { 13108 + "primary": "", 13109 + "secondary": "", 13110 + "tertiary": "" 13111 + }, 13112 + "content": "<p>Lโ€™API est dรฉveloppรฉ avec les technologies suivantes:</p>", 13113 + "contentType": "", 13114 + "dimensions": { 13115 + "aspectRatio": 0, 13116 + "height": 0, 13117 + "width": 0 13118 + }, 13119 + "distSource": "", 13120 + "duration": 0, 13121 + "hasSound": false, 13122 + "hash": "", 13123 + "id": "DNTYqNwAJR", 13124 + "index": 0, 13125 + "online": false, 13126 + "relativeSource": "", 13127 + "size": 0, 13128 + "text": "", 13129 + "thumbnails": null, 13130 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13131 + "title": "", 13132 + "type": "paragraph", 13133 + "url": "" 13134 + }, 13135 + { 13136 + "alt": "", 13137 + "analyzed": false, 13138 + "anchor": "", 13139 + "attributes": { 13140 + "autoplay": false, 13141 + "controls": false, 13142 + "loop": false, 13143 + "muted": false, 13144 + "playsinline": false 13145 + }, 13146 + "caption": "", 13147 + "colors": { 13148 + "primary": "", 13149 + "secondary": "", 13150 + "tertiary": "" 13151 + }, 13152 + "content": "<ul>\n<li>Typescript: le langage de programmation. Cโ€™est un superset de Javascript, avec des types explicites.</li>\n<li>Express: un framework de dรฉveloppement dโ€™API, qui permet notamment de servir les routes de lโ€™API qui sont en dehors de GraphQL: les mรฉdias (photos de profils, documents de la frappe), un <em>webhook</em> pour Lydia (voir <a href=\"#paiements\">Paiements</a>), de quoi se connecter ร  Apple/Google Wallet, etc.</li>\n<li>Pothos: permet de faire un serveur GraphQL en dรฉfinissant les implรฉmentations des diffรฉrents champs de lโ€™API, appelรฉs <em>resolvers</em> en GraphQL.</li>\n<li>Prisma: permet dโ€™accรฉder ร  la base de donnรฉes et de gรฉrer lโ€™รฉvolution de sa structure, via des migrations.</li>\n<li>PostgreSQL: la base de donnรฉes relationnelle utilisรฉe. Intรฉrรฉssante notamment pour ses capacitรฉs de recherche texte approximative (appelรฉe โ€œfuzzy searchโ€), et tout simplement pour sa popularitรฉ.</li>\n</ul>", 13153 + "contentType": "", 13154 + "dimensions": { 13155 + "aspectRatio": 0, 13156 + "height": 0, 13157 + "width": 0 13158 + }, 13159 + "distSource": "", 13160 + "duration": 0, 13161 + "hasSound": false, 13162 + "hash": "", 13163 + "id": "nz90QMp2kB", 13164 + "index": 0, 13165 + "online": false, 13166 + "relativeSource": "", 13167 + "size": 0, 13168 + "text": "", 13169 + "thumbnails": null, 13170 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13171 + "title": "", 13172 + "type": "paragraph", 13173 + "url": "" 13174 + }, 13175 + { 13176 + "alt": "", 13177 + "analyzed": false, 13178 + "anchor": "", 13179 + "attributes": { 13180 + "autoplay": false, 13181 + "controls": false, 13182 + "loop": false, 13183 + "muted": false, 13184 + "playsinline": false 13185 + }, 13186 + "caption": "", 13187 + "colors": { 13188 + "primary": "", 13189 + "secondary": "", 13190 + "tertiary": "" 13191 + }, 13192 + "content": "<p>GraphQL รฉtant moins populaire, jโ€™ai dรฉveloppรฉ, parallรจlement ร  Churros, un systรจme de gรฉnรฉration de site de documentation interactif, <a href=\"/graphinx\">Graphinx</a>, qui a donc pu servir ร  documenter lโ€™API de Churros:</p>", 13193 + "contentType": "", 13194 + "dimensions": { 13195 + "aspectRatio": 0, 13196 + "height": 0, 13197 + "width": 0 13198 + }, 13199 + "distSource": "", 13200 + "duration": 0, 13201 + "hasSound": false, 13202 + "hash": "", 13203 + "id": "2PKvcGpkvf", 13204 + "index": 0, 13205 + "online": false, 13206 + "relativeSource": "", 13207 + "size": 0, 13208 + "text": "", 13209 + "thumbnails": null, 13210 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13211 + "title": "", 13212 + "type": "paragraph", 13213 + "url": "" 13214 + }, 13215 + { 13216 + "alt": "", 13217 + "analyzed": true, 13218 + "anchor": "api-docs-home", 13219 + "attributes": { 13220 + "autoplay": false, 13221 + "controls": true, 13222 + "loop": false, 13223 + "muted": false, 13224 + "playsinline": false 13225 + }, 13226 + "caption": "", 13227 + "colors": { 13228 + "primary": "#A1B0B9", 13229 + "secondary": "#B8C9D2", 13230 + "tertiary": "#D5E7EF" 13231 + }, 13232 + "content": "", 13233 + "contentType": "image/png", 13234 + "dimensions": { 13235 + "aspectRatio": 1.474895, 13236 + "height": 956, 13237 + "width": 1410 13238 + }, 13239 + "distSource": "churros\\.ortfo\\api-docs-home.png", 13240 + "duration": 0, 13241 + "hasSound": false, 13242 + "hash": "8GpnIuI9FydSANXBlClVZA==", 13243 + "id": "J6R4fpSJEw", 13244 + "index": 0, 13245 + "online": false, 13246 + "relativeSource": "./api-docs-home.png", 13247 + "size": 145124, 13248 + "text": "", 13249 + "thumbnails": { 13250 + "100": "churros/J6R4fpSJEw@100.webp", 13251 + "1200": "churros/J6R4fpSJEw@1200.webp", 13252 + "400": "churros/J6R4fpSJEw@400.webp", 13253 + "600": "churros/J6R4fpSJEw@600.webp" 13254 + }, 13255 + "thumbnailsBuiltAt": "2025-12-03T20:15:45.2512056+01:00", 13256 + "title": "", 13257 + "type": "media", 13258 + "url": "" 13259 + }, 13260 + { 13261 + "alt": "", 13262 + "analyzed": true, 13263 + "anchor": "api-docs-item", 13264 + "attributes": { 13265 + "autoplay": false, 13266 + "controls": true, 13267 + "loop": false, 13268 + "muted": false, 13269 + "playsinline": false 13270 + }, 13271 + "caption": "", 13272 + "colors": { 13273 + "primary": "#8E9CA6", 13274 + "secondary": "#A2B0B9", 13275 + "tertiary": "#B4C3CB" 13276 + }, 13277 + "content": "", 13278 + "contentType": "image/png", 13279 + "dimensions": { 13280 + "aspectRatio": 1.457265, 13281 + "height": 702, 13282 + "width": 1023 13283 + }, 13284 + "distSource": "churros\\.ortfo\\api-docs-item.png", 13285 + "duration": 0, 13286 + "hasSound": false, 13287 + "hash": "p96SydAHG+AxavXR+hjv0w==", 13288 + "id": "ehbEvu19yw", 13289 + "index": 0, 13290 + "online": false, 13291 + "relativeSource": "./api-docs-item.png", 13292 + "size": 97155, 13293 + "text": "", 13294 + "thumbnails": { 13295 + "100": "churros/ehbEvu19yw@100.webp", 13296 + "1200": "churros/ehbEvu19yw@1200.webp", 13297 + "400": "churros/ehbEvu19yw@400.webp", 13298 + "600": "churros/ehbEvu19yw@600.webp" 13299 + }, 13300 + "thumbnailsBuiltAt": "2025-12-03T20:15:45.7620075+01:00", 13301 + "title": "", 13302 + "type": "media", 13303 + "url": "" 13304 + }, 13305 + { 13306 + "alt": "", 13307 + "analyzed": true, 13308 + "anchor": "api-docs-item-test-it-live", 13309 + "attributes": { 13310 + "autoplay": false, 13311 + "controls": true, 13312 + "loop": false, 13313 + "muted": false, 13314 + "playsinline": false 13315 + }, 13316 + "caption": "", 13317 + "colors": { 13318 + "primary": "#9AD5BE", 13319 + "secondary": "#B3D3D5", 13320 + "tertiary": "#000000" 13321 + }, 13322 + "content": "", 13323 + "contentType": "image/png", 13324 + "dimensions": { 13325 + "aspectRatio": 1.242273, 13326 + "height": 1003, 13327 + "width": 1246 13328 + }, 13329 + "distSource": "churros\\.ortfo\\api-docs-item-test-it-live.png", 13330 + "duration": 0, 13331 + "hasSound": false, 13332 + "hash": "q/zese9oN+Prz/H3v8vNsA==", 13333 + "id": "wHCcIcy69M", 13334 + "index": 0, 13335 + "online": false, 13336 + "relativeSource": "./api-docs-item-test-it-live.png", 13337 + "size": 81273, 13338 + "text": "", 13339 + "thumbnails": { 13340 + "100": "churros/wHCcIcy69M@100.webp", 13341 + "1200": "churros/wHCcIcy69M@1200.webp", 13342 + "400": "churros/wHCcIcy69M@400.webp", 13343 + "600": "churros/wHCcIcy69M@600.webp" 13344 + }, 13345 + "thumbnailsBuiltAt": "2025-12-03T20:15:46.5014+01:00", 13346 + "title": "", 13347 + "type": "media", 13348 + "url": "" 13349 + }, 13350 + { 13351 + "alt": "", 13352 + "analyzed": false, 13353 + "anchor": "documentation-de-lapi", 10744 13354 "attributes": { 10745 13355 "autoplay": false, 10746 13356 "controls": false, ··· 10770 13380 "online": false, 10771 13381 "relativeSource": "", 10772 13382 "size": 0, 10773 - "text": "API", 13383 + "text": "Documentation de lโ€™API", 10774 13384 "thumbnails": null, 10775 13385 "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10776 13386 "title": "", ··· 10780 13390 { 10781 13391 "alt": "", 10782 13392 "analyzed": false, 10783 - "anchor": "code-source", 13393 + "anchor": "", 13394 + "attributes": { 13395 + "autoplay": false, 13396 + "controls": false, 13397 + "loop": false, 13398 + "muted": false, 13399 + "playsinline": false 13400 + }, 13401 + "caption": "", 13402 + "colors": { 13403 + "primary": "", 13404 + "secondary": "", 13405 + "tertiary": "" 13406 + }, 13407 + "content": "<h2>Rรฉagir aux bugs</h2>", 13408 + "contentType": "", 13409 + "dimensions": { 13410 + "aspectRatio": 0, 13411 + "height": 0, 13412 + "width": 0 13413 + }, 13414 + "distSource": "", 13415 + "duration": 0, 13416 + "hasSound": false, 13417 + "hash": "", 13418 + "id": "bmloLnRwkg", 13419 + "index": 0, 13420 + "online": false, 13421 + "relativeSource": "", 13422 + "size": 0, 13423 + "text": "", 13424 + "thumbnails": null, 13425 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13426 + "title": "", 13427 + "type": "paragraph", 13428 + "url": "" 13429 + }, 13430 + { 13431 + "alt": "", 13432 + "analyzed": false, 13433 + "anchor": "", 13434 + "attributes": { 13435 + "autoplay": false, 13436 + "controls": false, 13437 + "loop": false, 13438 + "muted": false, 13439 + "playsinline": false 13440 + }, 13441 + "caption": "", 13442 + "colors": { 13443 + "primary": "", 13444 + "secondary": "", 13445 + "tertiary": "" 13446 + }, 13447 + "content": "<p>Lโ€™application รฉtant jeune, on sโ€™attendait ร  avoir des bugs.</p>", 13448 + "contentType": "", 13449 + "dimensions": { 13450 + "aspectRatio": 0, 13451 + "height": 0, 13452 + "width": 0 13453 + }, 13454 + "distSource": "", 13455 + "duration": 0, 13456 + "hasSound": false, 13457 + "hash": "", 13458 + "id": "y2SPGWbUCC", 13459 + "index": 0, 13460 + "online": false, 13461 + "relativeSource": "", 13462 + "size": 0, 13463 + "text": "", 13464 + "thumbnails": null, 13465 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13466 + "title": "", 13467 + "type": "paragraph", 13468 + "url": "" 13469 + }, 13470 + { 13471 + "alt": "", 13472 + "analyzed": false, 13473 + "anchor": "", 13474 + "attributes": { 13475 + "autoplay": false, 13476 + "controls": false, 13477 + "loop": false, 13478 + "muted": false, 13479 + "playsinline": false 13480 + }, 13481 + "caption": "", 13482 + "colors": { 13483 + "primary": "", 13484 + "secondary": "", 13485 + "tertiary": "" 13486 + }, 13487 + "content": "<p>On a donc rendu le signalement de problรจmes le plus simple, en lโ€™intรฉgrant directement ร  lโ€™application</p>", 13488 + "contentType": "", 13489 + "dimensions": { 13490 + "aspectRatio": 0, 13491 + "height": 0, 13492 + "width": 0 13493 + }, 13494 + "distSource": "", 13495 + "duration": 0, 13496 + "hasSound": false, 13497 + "hash": "", 13498 + "id": "crOfbrPi4P", 13499 + "index": 0, 13500 + "online": false, 13501 + "relativeSource": "", 13502 + "size": 0, 13503 + "text": "", 13504 + "thumbnails": null, 13505 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13506 + "title": "", 13507 + "type": "paragraph", 13508 + "url": "" 13509 + }, 13510 + { 13511 + "alt": "", 13512 + "analyzed": true, 13513 + "anchor": "bug-report", 13514 + "attributes": { 13515 + "autoplay": false, 13516 + "controls": true, 13517 + "loop": false, 13518 + "muted": false, 13519 + "playsinline": false 13520 + }, 13521 + "caption": "", 13522 + "colors": { 13523 + "primary": "#2C4440", 13524 + "secondary": "#BDBDC3", 13525 + "tertiary": "#EDEBEC" 13526 + }, 13527 + "content": "", 13528 + "contentType": "image/png", 13529 + "dimensions": { 13530 + "aspectRatio": 1.165208, 13531 + "height": 914, 13532 + "width": 1065 13533 + }, 13534 + "distSource": "churros\\.ortfo\\bug-report.png", 13535 + "duration": 0, 13536 + "hasSound": false, 13537 + "hash": "osHyEXOUuLxUhvyT7petvQ==", 13538 + "id": "759rM3Uh_1", 13539 + "index": 0, 13540 + "online": false, 13541 + "relativeSource": "./bug-report.png", 13542 + "size": 77459, 13543 + "text": "", 13544 + "thumbnails": { 13545 + "100": "churros/759rM3Uh_1@100.webp", 13546 + "1200": "churros/759rM3Uh_1@1200.webp", 13547 + "400": "churros/759rM3Uh_1@400.webp", 13548 + "600": "churros/759rM3Uh_1@600.webp" 13549 + }, 13550 + "thumbnailsBuiltAt": "2025-12-03T20:15:47.0493926+01:00", 13551 + "title": "", 13552 + "type": "media", 13553 + "url": "" 13554 + }, 13555 + { 13556 + "alt": "", 13557 + "analyzed": false, 13558 + "anchor": "", 13559 + "attributes": { 13560 + "autoplay": false, 13561 + "controls": false, 13562 + "loop": false, 13563 + "muted": false, 13564 + "playsinline": false 13565 + }, 13566 + "caption": "", 13567 + "colors": { 13568 + "primary": "", 13569 + "secondary": "", 13570 + "tertiary": "" 13571 + }, 13572 + "content": "<p>Un signalement devient une <em>issue</em> sur Gitlab, lโ€™endroit oรน lโ€™on dรฉveloppe. Passer dโ€™une demande utilisateur au dรฉveloppement est donc naturel et sans efforts.</p>", 13573 + "contentType": "", 13574 + "dimensions": { 13575 + "aspectRatio": 0, 13576 + "height": 0, 13577 + "width": 0 13578 + }, 13579 + "distSource": "", 13580 + "duration": 0, 13581 + "hasSound": false, 13582 + "hash": "", 13583 + "id": "EW5qT2lSbj", 13584 + "index": 0, 13585 + "online": false, 13586 + "relativeSource": "", 13587 + "size": 0, 13588 + "text": "", 13589 + "thumbnails": null, 13590 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13591 + "title": "", 13592 + "type": "paragraph", 13593 + "url": "" 13594 + }, 13595 + { 13596 + "alt": "", 13597 + "analyzed": true, 13598 + "anchor": "bug-report-on-gitlab", 13599 + "attributes": { 13600 + "autoplay": false, 13601 + "controls": true, 13602 + "loop": false, 13603 + "muted": false, 13604 + "playsinline": false 13605 + }, 13606 + "caption": "", 13607 + "colors": { 13608 + "primary": "#ED8F63", 13609 + "secondary": "#B4BAC4", 13610 + "tertiary": "#EDEEF2" 13611 + }, 13612 + "content": "", 13613 + "contentType": "image/png", 13614 + "dimensions": { 13615 + "aspectRatio": 1.711069, 13616 + "height": 533, 13617 + "width": 912 13618 + }, 13619 + "distSource": "churros\\.ortfo\\bug-report-on-gitlab.png", 13620 + "duration": 0, 13621 + "hasSound": false, 13622 + "hash": "RM20gdkLTOArA5E31KBWkQ==", 13623 + "id": "gGdzkJdoyO", 13624 + "index": 0, 13625 + "online": false, 13626 + "relativeSource": "./bug-report-on-gitlab.png", 13627 + "size": 89030, 13628 + "text": "", 13629 + "thumbnails": { 13630 + "100": "churros/gGdzkJdoyO@100.webp", 13631 + "1200": "churros/gGdzkJdoyO@1200.webp", 13632 + "400": "churros/gGdzkJdoyO@400.webp", 13633 + "600": "churros/gGdzkJdoyO@600.webp" 13634 + }, 13635 + "thumbnailsBuiltAt": "2025-12-03T20:15:47.4914558+01:00", 13636 + "title": "", 13637 + "type": "media", 13638 + "url": "" 13639 + }, 13640 + { 13641 + "alt": "", 13642 + "analyzed": false, 13643 + "anchor": "", 13644 + "attributes": { 13645 + "autoplay": false, 13646 + "controls": false, 13647 + "loop": false, 13648 + "muted": false, 13649 + "playsinline": false 13650 + }, 13651 + "caption": "", 13652 + "colors": { 13653 + "primary": "", 13654 + "secondary": "", 13655 + "tertiary": "" 13656 + }, 13657 + "content": "<h2>Notella</h2>", 13658 + "contentType": "", 13659 + "dimensions": { 13660 + "aspectRatio": 0, 13661 + "height": 0, 13662 + "width": 0 13663 + }, 13664 + "distSource": "", 13665 + "duration": 0, 13666 + "hasSound": false, 13667 + "hash": "", 13668 + "id": "45eCA-qO62", 13669 + "index": 0, 13670 + "online": false, 13671 + "relativeSource": "", 13672 + "size": 0, 13673 + "text": "", 13674 + "thumbnails": null, 13675 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13676 + "title": "", 13677 + "type": "paragraph", 13678 + "url": "" 13679 + }, 13680 + { 13681 + "alt": "", 13682 + "analyzed": false, 13683 + "anchor": "", 13684 + "attributes": { 13685 + "autoplay": false, 13686 + "controls": false, 13687 + "loop": false, 13688 + "muted": false, 13689 + "playsinline": false 13690 + }, 13691 + "caption": "", 13692 + "colors": { 13693 + "primary": "", 13694 + "secondary": "", 13695 + "tertiary": "" 13696 + }, 13697 + "content": "<p>Afin de programmer les notifications et de les envoyer par la suite, un serveur sรฉparรฉ a รฉtรฉ dรฉveloppรฉ en Go, en utilisant NATS Jetstream pour communiquer en temps rรฉel avec Churros.</p>", 13698 + "contentType": "", 13699 + "dimensions": { 13700 + "aspectRatio": 0, 13701 + "height": 0, 13702 + "width": 0 13703 + }, 13704 + "distSource": "", 13705 + "duration": 0, 13706 + "hasSound": false, 13707 + "hash": "", 13708 + "id": "8qQmfk40N4", 13709 + "index": 0, 13710 + "online": false, 13711 + "relativeSource": "", 13712 + "size": 0, 13713 + "text": "", 13714 + "thumbnails": null, 13715 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13716 + "title": "", 13717 + "type": "paragraph", 13718 + "url": "" 13719 + }, 13720 + { 13721 + "alt": "", 13722 + "analyzed": true, 13723 + "anchor": "notella-logs-start", 13724 + "attributes": { 13725 + "autoplay": false, 13726 + "controls": true, 13727 + "loop": false, 13728 + "muted": false, 13729 + "playsinline": false 13730 + }, 13731 + "caption": "", 13732 + "colors": { 13733 + "primary": "#2C4453", 13734 + "secondary": "#314C5C", 13735 + "tertiary": "#000000" 13736 + }, 13737 + "content": "", 13738 + "contentType": "image/png", 13739 + "dimensions": { 13740 + "aspectRatio": 2.634043, 13741 + "height": 470, 13742 + "width": 1238 13743 + }, 13744 + "distSource": "churros\\.ortfo\\notella-logs-start.png", 13745 + "duration": 0, 13746 + "hasSound": false, 13747 + "hash": "ynJiic6khcJmF5dT4b6x9w==", 13748 + "id": "FdVYbhxwJG", 13749 + "index": 0, 13750 + "online": false, 13751 + "relativeSource": "./notella-logs-start.png", 13752 + "size": 43552, 13753 + "text": "", 13754 + "thumbnails": { 13755 + "100": "churros/FdVYbhxwJG@100.webp", 13756 + "1200": "churros/FdVYbhxwJG@1200.webp", 13757 + "400": "churros/FdVYbhxwJG@400.webp", 13758 + "600": "churros/FdVYbhxwJG@600.webp" 13759 + }, 13760 + "thumbnailsBuiltAt": "2025-12-03T20:15:47.9102675+01:00", 13761 + "title": "", 13762 + "type": "media", 13763 + "url": "" 13764 + }, 13765 + { 13766 + "alt": "", 13767 + "analyzed": false, 13768 + "anchor": "", 13769 + "attributes": { 13770 + "autoplay": false, 13771 + "controls": false, 13772 + "loop": false, 13773 + "muted": false, 13774 + "playsinline": false 13775 + }, 13776 + "caption": "", 13777 + "colors": { 13778 + "primary": "", 13779 + "secondary": "", 13780 + "tertiary": "" 13781 + }, 13782 + "content": "<p>Churros envoie un message Jetstream ร  Notella pour programmer une notification, et Notella la garde en mรฉmoire.</p>", 13783 + "contentType": "", 13784 + "dimensions": { 13785 + "aspectRatio": 0, 13786 + "height": 0, 13787 + "width": 0 13788 + }, 13789 + "distSource": "", 13790 + "duration": 0, 13791 + "hasSound": false, 13792 + "hash": "", 13793 + "id": "Fzajdp5Cqz", 13794 + "index": 0, 13795 + "online": false, 13796 + "relativeSource": "", 13797 + "size": 0, 13798 + "text": "", 13799 + "thumbnails": null, 13800 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13801 + "title": "", 13802 + "type": "paragraph", 13803 + "url": "" 13804 + }, 13805 + { 13806 + "alt": "", 13807 + "analyzed": false, 13808 + "anchor": "", 13809 + "attributes": { 13810 + "autoplay": false, 13811 + "controls": false, 13812 + "loop": false, 13813 + "muted": false, 13814 + "playsinline": false 13815 + }, 13816 + "caption": "", 13817 + "colors": { 13818 + "primary": "", 13819 + "secondary": "", 13820 + "tertiary": "" 13821 + }, 13822 + "content": "<p>Au moment dโ€™envoyer la notification, Notella rรฉcupรจre lโ€™ensemble des appareils qui ont activรฉ les notifications, dรฉtermine ร  qui envoyer la notification (par exemple, on nโ€™envoie pas une notification โ€œle shotgun se ferme bientรดtโ€ aux gens qui ont dรฉjร  rรฉservรฉ leur place), et lโ€™envoie via le service push associรฉ ร  lโ€™appareil (APNS pour Apple, Mozilla pour Firefox, Firebase pour Android, etc.)</p>", 13823 + "contentType": "", 13824 + "dimensions": { 13825 + "aspectRatio": 0, 13826 + "height": 0, 13827 + "width": 0 13828 + }, 13829 + "distSource": "", 13830 + "duration": 0, 13831 + "hasSound": false, 13832 + "hash": "", 13833 + "id": "CPR5mfx5vM", 13834 + "index": 0, 13835 + "online": false, 13836 + "relativeSource": "", 13837 + "size": 0, 13838 + "text": "", 13839 + "thumbnails": null, 13840 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13841 + "title": "", 13842 + "type": "paragraph", 13843 + "url": "" 13844 + }, 13845 + { 13846 + "alt": "", 13847 + "analyzed": true, 13848 + "anchor": "notella-logs-scheduling", 13849 + "attributes": { 13850 + "autoplay": false, 13851 + "controls": true, 13852 + "loop": false, 13853 + "muted": false, 13854 + "playsinline": false 13855 + }, 13856 + "caption": "", 13857 + "colors": { 13858 + "primary": "#080D11", 13859 + "secondary": "#1B2A33", 13860 + "tertiary": "#2A414F" 13861 + }, 13862 + "content": "", 13863 + "contentType": "image/png", 13864 + "dimensions": { 13865 + "aspectRatio": 6.666667, 13866 + "height": 120, 13867 + "width": 800 13868 + }, 13869 + "distSource": "churros\\.ortfo\\notella-logs-scheduling.png", 13870 + "duration": 0, 13871 + "hasSound": false, 13872 + "hash": "mlVdD15W9ar3aJUeyBLnTA==", 13873 + "id": "sFfxqzx-zn", 13874 + "index": 0, 13875 + "online": false, 13876 + "relativeSource": "./notella-logs-scheduling.png", 13877 + "size": 20108, 13878 + "text": "", 13879 + "thumbnails": { 13880 + "100": "churros/sFfxqzx-zn@100.webp", 13881 + "1200": "churros/sFfxqzx-zn@1200.webp", 13882 + "400": "churros/sFfxqzx-zn@400.webp", 13883 + "600": "churros/sFfxqzx-zn@600.webp" 13884 + }, 13885 + "thumbnailsBuiltAt": "2025-12-03T20:15:48.2263886+01:00", 13886 + "title": "", 13887 + "type": "media", 13888 + "url": "" 13889 + }, 13890 + { 13891 + "alt": "", 13892 + "analyzed": false, 13893 + "anchor": "", 10784 13894 "attributes": { 10785 13895 "autoplay": false, 10786 13896 "controls": false, ··· 10794 13904 "secondary": "", 10795 13905 "tertiary": "" 10796 13906 }, 13907 + "content": "<p>En cas de mise ร  jour ou de redรฉmarrage, Notella rรฉcupรจre les notifications programmรฉes depuis une instance Redis.</p>", 13908 + "contentType": "", 13909 + "dimensions": { 13910 + "aspectRatio": 0, 13911 + "height": 0, 13912 + "width": 0 13913 + }, 13914 + "distSource": "", 13915 + "duration": 0, 13916 + "hasSound": false, 13917 + "hash": "", 13918 + "id": "JfbkQXq4O5", 13919 + "index": 0, 13920 + "online": false, 13921 + "relativeSource": "", 13922 + "size": 0, 13923 + "text": "", 13924 + "thumbnails": null, 13925 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 13926 + "title": "", 13927 + "type": "paragraph", 13928 + "url": "" 13929 + }, 13930 + { 13931 + "alt": "", 13932 + "analyzed": true, 13933 + "anchor": "notella-logs-restoring", 13934 + "attributes": { 13935 + "autoplay": false, 13936 + "controls": true, 13937 + "loop": false, 13938 + "muted": false, 13939 + "playsinline": false 13940 + }, 13941 + "caption": "", 13942 + "colors": { 13943 + "primary": "#090F12", 13944 + "secondary": "#1B2A33", 13945 + "tertiary": "#2C4352" 13946 + }, 10797 13947 "content": "", 13948 + "contentType": "image/png", 13949 + "dimensions": { 13950 + "aspectRatio": 3.49807, 13951 + "height": 259, 13952 + "width": 906 13953 + }, 13954 + "distSource": "churros\\.ortfo\\notella-logs-restoring.png", 13955 + "duration": 0, 13956 + "hasSound": false, 13957 + "hash": "xqWRplcRYd1v4JTUdhqwuA==", 13958 + "id": "cjaiRo0iDH", 13959 + "index": 0, 13960 + "online": false, 13961 + "relativeSource": "./notella-logs-restoring.png", 13962 + "size": 33209, 13963 + "text": "", 13964 + "thumbnails": { 13965 + "100": "churros/cjaiRo0iDH@100.webp", 13966 + "1200": "churros/cjaiRo0iDH@1200.webp", 13967 + "400": "churros/cjaiRo0iDH@400.webp", 13968 + "600": "churros/cjaiRo0iDH@600.webp" 13969 + }, 13970 + "thumbnailsBuiltAt": "2025-12-03T20:15:48.6548561+01:00", 13971 + "title": "", 13972 + "type": "media", 13973 + "url": "" 13974 + }, 13975 + { 13976 + "alt": "", 13977 + "analyzed": false, 13978 + "anchor": "", 13979 + "attributes": { 13980 + "autoplay": false, 13981 + "controls": false, 13982 + "loop": false, 13983 + "muted": false, 13984 + "playsinline": false 13985 + }, 13986 + "caption": "", 13987 + "colors": { 13988 + "primary": "", 13989 + "secondary": "", 13990 + "tertiary": "" 13991 + }, 13992 + "content": "<h2>Capacitor</h2>", 10798 13993 "contentType": "", 10799 13994 "dimensions": { 10800 13995 "aspectRatio": 0, ··· 10805 14000 "duration": 0, 10806 14001 "hasSound": false, 10807 14002 "hash": "", 10808 - "id": "UCWFLEFMsb", 14003 + "id": "_Hf907tP1n", 14004 + "index": 0, 14005 + "online": false, 14006 + "relativeSource": "", 14007 + "size": 0, 14008 + "text": "", 14009 + "thumbnails": null, 14010 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14011 + "title": "", 14012 + "type": "paragraph", 14013 + "url": "" 14014 + }, 14015 + { 14016 + "alt": "", 14017 + "analyzed": false, 14018 + "anchor": "", 14019 + "attributes": { 14020 + "autoplay": false, 14021 + "controls": false, 14022 + "loop": false, 14023 + "muted": false, 14024 + "playsinline": false 14025 + }, 14026 + "caption": "", 14027 + "colors": { 14028 + "primary": "", 14029 + "secondary": "", 14030 + "tertiary": "" 14031 + }, 14032 + "content": "<p>Capacitor permet de packager une application web et de la mettre sur les stores iOS et Android.</p>", 14033 + "contentType": "", 14034 + "dimensions": { 14035 + "aspectRatio": 0, 14036 + "height": 0, 14037 + "width": 0 14038 + }, 14039 + "distSource": "", 14040 + "duration": 0, 14041 + "hasSound": false, 14042 + "hash": "", 14043 + "id": "ookBh6o-I4", 14044 + "index": 0, 14045 + "online": false, 14046 + "relativeSource": "", 14047 + "size": 0, 14048 + "text": "", 14049 + "thumbnails": null, 14050 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14051 + "title": "", 14052 + "type": "paragraph", 14053 + "url": "" 14054 + }, 14055 + { 14056 + "alt": "", 14057 + "analyzed": false, 14058 + "anchor": "", 14059 + "attributes": { 14060 + "autoplay": false, 14061 + "controls": false, 14062 + "loop": false, 14063 + "muted": false, 14064 + "playsinline": false 14065 + }, 14066 + "caption": "", 14067 + "colors": { 14068 + "primary": "", 14069 + "secondary": "", 14070 + "tertiary": "" 14071 + }, 14072 + "content": "<p>Bien que le dรฉveloppement ne soit pas terminรฉ par manque de resources, la <em>merge request</em> associรฉ ร  ceci est quasiment finie, et les dรฉmarches administratives pour pouvoir publier en tant quโ€™association sur lโ€™App Store sans payer ont รฉtรฉ rรฉalisรฉes.</p>", 14073 + "contentType": "", 14074 + "dimensions": { 14075 + "aspectRatio": 0, 14076 + "height": 0, 14077 + "width": 0 14078 + }, 14079 + "distSource": "", 14080 + "duration": 0, 14081 + "hasSound": false, 14082 + "hash": "", 14083 + "id": "RB_OiOW6UG", 14084 + "index": 0, 14085 + "online": false, 14086 + "relativeSource": "", 14087 + "size": 0, 14088 + "text": "", 14089 + "thumbnails": null, 14090 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14091 + "title": "", 14092 + "type": "paragraph", 14093 + "url": "" 14094 + }, 14095 + { 14096 + "alt": "", 14097 + "analyzed": false, 14098 + "anchor": "", 14099 + "attributes": { 14100 + "autoplay": false, 14101 + "controls": false, 14102 + "loop": false, 14103 + "muted": false, 14104 + "playsinline": false 14105 + }, 14106 + "caption": "", 14107 + "colors": { 14108 + "primary": "", 14109 + "secondary": "", 14110 + "tertiary": "" 14111 + }, 14112 + "content": "<h2>Dรฉploiement</h2>", 14113 + "contentType": "", 14114 + "dimensions": { 14115 + "aspectRatio": 0, 14116 + "height": 0, 14117 + "width": 0 14118 + }, 14119 + "distSource": "", 14120 + "duration": 0, 14121 + "hasSound": false, 14122 + "hash": "", 14123 + "id": "JwK3Z1gyvY", 14124 + "index": 0, 14125 + "online": false, 14126 + "relativeSource": "", 14127 + "size": 0, 14128 + "text": "", 14129 + "thumbnails": null, 14130 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14131 + "title": "", 14132 + "type": "paragraph", 14133 + "url": "" 14134 + }, 14135 + { 14136 + "alt": "", 14137 + "analyzed": false, 14138 + "anchor": "", 14139 + "attributes": { 14140 + "autoplay": false, 14141 + "controls": false, 14142 + "loop": false, 14143 + "muted": false, 14144 + "playsinline": false 14145 + }, 14146 + "caption": "", 14147 + "colors": { 14148 + "primary": "", 14149 + "secondary": "", 14150 + "tertiary": "" 14151 + }, 14152 + "content": "<p>Lโ€™application est packagรฉe sous forme de container Docker, et nรฉcรฉssite plusieurs services tierces: base de donnรฉes (PostgreSQL), serveur de cache et de messages pub/sub pour la communication en temps rรฉel (Redis), service de programmation de notifications (Notella), etc.</p>", 14153 + "contentType": "", 14154 + "dimensions": { 14155 + "aspectRatio": 0, 14156 + "height": 0, 14157 + "width": 0 14158 + }, 14159 + "distSource": "", 14160 + "duration": 0, 14161 + "hasSound": false, 14162 + "hash": "", 14163 + "id": "agZyWgOtVi", 14164 + "index": 0, 14165 + "online": false, 14166 + "relativeSource": "", 14167 + "size": 0, 14168 + "text": "", 14169 + "thumbnails": null, 14170 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14171 + "title": "", 14172 + "type": "paragraph", 14173 + "url": "" 14174 + }, 14175 + { 14176 + "alt": "", 14177 + "analyzed": false, 14178 + "anchor": "", 14179 + "attributes": { 14180 + "autoplay": false, 14181 + "controls": false, 14182 + "loop": false, 14183 + "muted": false, 14184 + "playsinline": false 14185 + }, 14186 + "caption": "", 14187 + "colors": { 14188 + "primary": "", 14189 + "secondary": "", 14190 + "tertiary": "" 14191 + }, 14192 + "content": "<p>Il est facile, via Docker, de lancer la plateforme ainsi que tout ses services, que ce soit:</p>", 14193 + "contentType": "", 14194 + "dimensions": { 14195 + "aspectRatio": 0, 14196 + "height": 0, 14197 + "width": 0 14198 + }, 14199 + "distSource": "", 14200 + "duration": 0, 14201 + "hasSound": false, 14202 + "hash": "", 14203 + "id": "_aixbfh6yh", 14204 + "index": 0, 14205 + "online": false, 14206 + "relativeSource": "", 14207 + "size": 0, 14208 + "text": "", 14209 + "thumbnails": null, 14210 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14211 + "title": "", 14212 + "type": "paragraph", 14213 + "url": "" 14214 + }, 14215 + { 14216 + "alt": "", 14217 + "analyzed": false, 14218 + "anchor": "", 14219 + "attributes": { 14220 + "autoplay": false, 14221 + "controls": false, 14222 + "loop": false, 14223 + "muted": false, 14224 + "playsinline": false 14225 + }, 14226 + "caption": "", 14227 + "colors": { 14228 + "primary": "", 14229 + "secondary": "", 14230 + "tertiary": "" 14231 + }, 14232 + "content": "<ul>\n<li>En dรฉveloppement: avec Docker Compose (il suffit de taper <code>docker compose up</code> pour lancer tout les services tierces)</li>\n<li>En production: avec Kubernetes.</li>\n</ul>", 14233 + "contentType": "", 14234 + "dimensions": { 14235 + "aspectRatio": 0, 14236 + "height": 0, 14237 + "width": 0 14238 + }, 14239 + "distSource": "", 14240 + "duration": 0, 14241 + "hasSound": false, 14242 + "hash": "", 14243 + "id": "skpbXToqC0", 14244 + "index": 0, 14245 + "online": false, 14246 + "relativeSource": "", 14247 + "size": 0, 14248 + "text": "", 14249 + "thumbnails": null, 14250 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14251 + "title": "", 14252 + "type": "paragraph", 14253 + "url": "" 14254 + }, 14255 + { 14256 + "alt": "", 14257 + "analyzed": true, 14258 + "anchor": "k8s-pods", 14259 + "attributes": { 14260 + "autoplay": false, 14261 + "controls": true, 14262 + "loop": false, 14263 + "muted": false, 14264 + "playsinline": false 14265 + }, 14266 + "caption": "Pods k8s de Churros en production", 14267 + "colors": { 14268 + "primary": "#18232A", 14269 + "secondary": "#0F1619", 14270 + "tertiary": "#050608" 14271 + }, 14272 + "content": "", 14273 + "contentType": "image/png", 14274 + "dimensions": { 14275 + "aspectRatio": 6.353147, 14276 + "height": 286, 14277 + "width": 1817 14278 + }, 14279 + "distSource": "churros\\.ortfo\\k8s-pods.png", 14280 + "duration": 0, 14281 + "hasSound": false, 14282 + "hash": "C0KIrQYw/KDL+6bZ/YvQ4g==", 14283 + "id": "kyIpBKEnu7", 14284 + "index": 0, 14285 + "online": false, 14286 + "relativeSource": "./k8s-pods.png", 14287 + "size": 61890, 14288 + "text": "", 14289 + "thumbnails": { 14290 + "100": "churros/kyIpBKEnu7@100.webp", 14291 + "1200": "churros/kyIpBKEnu7@1200.webp", 14292 + "400": "churros/kyIpBKEnu7@400.webp", 14293 + "600": "churros/kyIpBKEnu7@600.webp" 14294 + }, 14295 + "thumbnailsBuiltAt": "2025-12-03T20:15:49.0227083+01:00", 14296 + "title": "", 14297 + "type": "media", 14298 + "url": "" 14299 + }, 14300 + { 14301 + "alt": "", 14302 + "analyzed": false, 14303 + "anchor": "", 14304 + "attributes": { 14305 + "autoplay": false, 14306 + "controls": false, 14307 + "loop": false, 14308 + "muted": false, 14309 + "playsinline": false 14310 + }, 14311 + "caption": "", 14312 + "colors": { 14313 + "primary": "", 14314 + "secondary": "", 14315 + "tertiary": "" 14316 + }, 14317 + "content": "<p>Quand une fonctionnalitรฉ est finie, de nombreux processus tournent sur notre instance Gitlab pour vรฉrifier que le code fonctionne correctement (de la <em>CI/CD</em>)</p>", 14318 + "contentType": "", 14319 + "dimensions": { 14320 + "aspectRatio": 0, 14321 + "height": 0, 14322 + "width": 0 14323 + }, 14324 + "distSource": "", 14325 + "duration": 0, 14326 + "hasSound": false, 14327 + "hash": "", 14328 + "id": "Pl7FBGo7_1", 10809 14329 "index": 0, 10810 14330 "online": false, 10811 14331 "relativeSource": "", 10812 14332 "size": 0, 10813 - "text": "Code source", 14333 + "text": "", 10814 14334 "thumbnails": null, 10815 14335 "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10816 14336 "title": "", 10817 - "type": "link", 10818 - "url": "https://git.inpt.fr/churros/churros" 14337 + "type": "paragraph", 14338 + "url": "" 14339 + }, 14340 + { 14341 + "alt": "", 14342 + "analyzed": true, 14343 + "anchor": "gitlab-ci-schema-check", 14344 + "attributes": { 14345 + "autoplay": false, 14346 + "controls": true, 14347 + "loop": false, 14348 + "muted": false, 14349 + "playsinline": false 14350 + }, 14351 + "caption": "", 14352 + "colors": { 14353 + "primary": "#43A06D", 14354 + "secondary": "#74BA92", 14355 + "tertiary": "#BDBDBF" 14356 + }, 14357 + "content": "", 14358 + "contentType": "image/png", 14359 + "dimensions": { 14360 + "aspectRatio": 3.672176, 14361 + "height": 363, 14362 + "width": 1333 14363 + }, 14364 + "distSource": "churros\\.ortfo\\gitlab-ci-schema-check.png", 14365 + "duration": 0, 14366 + "hasSound": false, 14367 + "hash": "tXJ4cVr/SKvwVW+VqMKKCw==", 14368 + "id": "ZfsREVf5nh", 14369 + "index": 0, 14370 + "online": false, 14371 + "relativeSource": "./gitlab-ci-schema-check.png", 14372 + "size": 24582, 14373 + "text": "", 14374 + "thumbnails": { 14375 + "100": "churros/ZfsREVf5nh@100.webp", 14376 + "1200": "churros/ZfsREVf5nh@1200.webp", 14377 + "400": "churros/ZfsREVf5nh@400.webp", 14378 + "600": "churros/ZfsREVf5nh@600.webp" 14379 + }, 14380 + "thumbnailsBuiltAt": "2025-12-03T20:15:49.4581244+01:00", 14381 + "title": "", 14382 + "type": "media", 14383 + "url": "" 10819 14384 }, 10820 14385 { 10821 14386 "alt": "", 10822 14387 "analyzed": false, 10823 - "anchor": "sur-github", 14388 + "anchor": "", 10824 14389 "attributes": { 10825 14390 "autoplay": false, 10826 14391 "controls": false, ··· 10834 14399 "secondary": "", 10835 14400 "tertiary": "" 10836 14401 }, 14402 + "content": "<p>Ensuite, au moment de sortir une nouvelle version de lโ€™appli, les images Docker sont construites et publiรฉes, et, par exemple, si la structure de la base de donnรฉes ร  changer, elle est mise ร  jour dans le dรฉpรดt git de Notella</p>", 14403 + "contentType": "", 14404 + "dimensions": { 14405 + "aspectRatio": 0, 14406 + "height": 0, 14407 + "width": 0 14408 + }, 14409 + "distSource": "", 14410 + "duration": 0, 14411 + "hasSound": false, 14412 + "hash": "", 14413 + "id": "0w37zUUiFt", 14414 + "index": 0, 14415 + "online": false, 14416 + "relativeSource": "", 14417 + "size": 0, 14418 + "text": "", 14419 + "thumbnails": null, 14420 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14421 + "title": "", 14422 + "type": "paragraph", 14423 + "url": "" 14424 + }, 14425 + { 14426 + "alt": "", 14427 + "analyzed": true, 14428 + "anchor": "gitlab-ci-triggers-notella", 14429 + "attributes": { 14430 + "autoplay": false, 14431 + "controls": true, 14432 + "loop": false, 14433 + "muted": false, 14434 + "playsinline": false 14435 + }, 14436 + "caption": "", 14437 + "colors": { 14438 + "primary": "#6BB68C", 14439 + "secondary": "#B3CCE6", 14440 + "tertiary": "#000000" 14441 + }, 10837 14442 "content": "", 14443 + "contentType": "image/png", 14444 + "dimensions": { 14445 + "aspectRatio": 2.960251, 14446 + "height": 478, 14447 + "width": 1415 14448 + }, 14449 + "distSource": "churros\\.ortfo\\gitlab-ci-triggers-notella.png", 14450 + "duration": 0, 14451 + "hasSound": false, 14452 + "hash": "UpPdai+QesPVkMrEfazJRA==", 14453 + "id": "maTfUnqH3a", 14454 + "index": 0, 14455 + "online": false, 14456 + "relativeSource": "./gitlab-ci-triggers-notella.png", 14457 + "size": 44951, 14458 + "text": "", 14459 + "thumbnails": { 14460 + "100": "churros/maTfUnqH3a@100.webp", 14461 + "1200": "churros/maTfUnqH3a@1200.webp", 14462 + "400": "churros/maTfUnqH3a@400.webp", 14463 + "600": "churros/maTfUnqH3a@600.webp" 14464 + }, 14465 + "thumbnailsBuiltAt": "2025-12-03T20:15:49.887964+01:00", 14466 + "title": "", 14467 + "type": "media", 14468 + "url": "" 14469 + }, 14470 + { 14471 + "alt": "", 14472 + "analyzed": false, 14473 + "anchor": "", 14474 + "attributes": { 14475 + "autoplay": false, 14476 + "controls": false, 14477 + "loop": false, 14478 + "muted": false, 14479 + "playsinline": false 14480 + }, 14481 + "caption": "", 14482 + "colors": { 14483 + "primary": "", 14484 + "secondary": "", 14485 + "tertiary": "" 14486 + }, 14487 + "content": "<p>Enfin, quand la nouvelle version est prรชte ร  รชtre dรฉployรฉe sur lโ€™infrastructure de net7, <a href=\"https://docs.renovatebot.com/\">Renovate</a> propose de mettre ร  jour la version de Churros dans les fichiers de dรฉploiement Kubernetes centraux.</p>", 10838 14488 "contentType": "", 10839 14489 "dimensions": { 10840 14490 "aspectRatio": 0, ··· 10845 14495 "duration": 0, 10846 14496 "hasSound": false, 10847 14497 "hash": "", 10848 - "id": "b2xEuJplk2", 14498 + "id": "TdeLW23-Pw", 10849 14499 "index": 0, 10850 14500 "online": false, 10851 14501 "relativeSource": "", 10852 14502 "size": 0, 10853 - "text": "Sur Github", 14503 + "text": "", 10854 14504 "thumbnails": null, 10855 14505 "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 10856 14506 "title": "", 10857 - "type": "link", 10858 - "url": "https://github.com/inp-net/churros" 14507 + "type": "paragraph", 14508 + "url": "" 10859 14509 }, 10860 14510 { 10861 14511 "alt": "", ··· 10874 14524 "secondary": "", 10875 14525 "tertiary": "" 10876 14526 }, 10877 - "content": "<p>(page non terminรฉe)</p>", 14527 + "content": "<p>En effet, net7 utilise FluxCD pour implรฉmenter la pratique GitOps: le changement des fichiers Kubernetes dans le dรฉpรดt a pour consรฉquence leur modification dans les serveurs de production.</p>", 10878 14528 "contentType": "", 10879 14529 "dimensions": { 10880 14530 "aspectRatio": 0, ··· 10885 14535 "duration": 0, 10886 14536 "hasSound": false, 10887 14537 "hash": "", 10888 - "id": "UhEvsvwp1P", 14538 + "id": "r0A0z76lZY", 14539 + "index": 0, 14540 + "online": false, 14541 + "relativeSource": "", 14542 + "size": 0, 14543 + "text": "", 14544 + "thumbnails": null, 14545 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14546 + "title": "", 14547 + "type": "paragraph", 14548 + "url": "" 14549 + }, 14550 + { 14551 + "alt": "", 14552 + "analyzed": false, 14553 + "anchor": "", 14554 + "attributes": { 14555 + "autoplay": false, 14556 + "controls": false, 14557 + "loop": false, 14558 + "muted": false, 14559 + "playsinline": false 14560 + }, 14561 + "caption": "", 14562 + "colors": { 14563 + "primary": "", 14564 + "secondary": "", 14565 + "tertiary": "" 14566 + }, 14567 + "content": "<h2>Documentation</h2>", 14568 + "contentType": "", 14569 + "dimensions": { 14570 + "aspectRatio": 0, 14571 + "height": 0, 14572 + "width": 0 14573 + }, 14574 + "distSource": "", 14575 + "duration": 0, 14576 + "hasSound": false, 14577 + "hash": "", 14578 + "id": "iLyT6jjZnM", 14579 + "index": 0, 14580 + "online": false, 14581 + "relativeSource": "", 14582 + "size": 0, 14583 + "text": "", 14584 + "thumbnails": null, 14585 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14586 + "title": "", 14587 + "type": "paragraph", 14588 + "url": "" 14589 + }, 14590 + { 14591 + "alt": "", 14592 + "analyzed": false, 14593 + "anchor": "", 14594 + "attributes": { 14595 + "autoplay": false, 14596 + "controls": false, 14597 + "loop": false, 14598 + "muted": false, 14599 + "playsinline": false 14600 + }, 14601 + "caption": "", 14602 + "colors": { 14603 + "primary": "", 14604 + "secondary": "", 14605 + "tertiary": "" 14606 + }, 14607 + "content": "<p>ร‰tant donnรฉ lโ€™รฉvolution rapide de lโ€™รฉquipe de dรฉveloppement, qui est une consรฉquence de la nature รฉtudiante de lโ€™association, il est essentiel de garder lโ€™application maintenable, mรชme aprรจs ma propre diplomation en 2025.</p>", 14608 + "contentType": "", 14609 + "dimensions": { 14610 + "aspectRatio": 0, 14611 + "height": 0, 14612 + "width": 0 14613 + }, 14614 + "distSource": "", 14615 + "duration": 0, 14616 + "hasSound": false, 14617 + "hash": "", 14618 + "id": "bx32XBaUyi", 14619 + "index": 0, 14620 + "online": false, 14621 + "relativeSource": "", 14622 + "size": 0, 14623 + "text": "", 14624 + "thumbnails": null, 14625 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14626 + "title": "", 14627 + "type": "paragraph", 14628 + "url": "" 14629 + }, 14630 + { 14631 + "alt": "", 14632 + "analyzed": false, 14633 + "anchor": "", 14634 + "attributes": { 14635 + "autoplay": false, 14636 + "controls": false, 14637 + "loop": false, 14638 + "muted": false, 14639 + "playsinline": false 14640 + }, 14641 + "caption": "", 14642 + "colors": { 14643 + "primary": "", 14644 + "secondary": "", 14645 + "tertiary": "" 14646 + }, 14647 + "content": "<p>Un <a href=\"https://git.inpt.fr/churros/wiki\">wiki pour dรฉveloppeurs</a> documente lโ€™architecture du code et le dรฉveloppement de lโ€™application. Un fichier CONTRIBUTING.md explique comment contribuer au code.</p>", 14648 + "contentType": "", 14649 + "dimensions": { 14650 + "aspectRatio": 0, 14651 + "height": 0, 14652 + "width": 0 14653 + }, 14654 + "distSource": "", 14655 + "duration": 0, 14656 + "hasSound": false, 14657 + "hash": "", 14658 + "id": "y9nmb5HSlL", 14659 + "index": 0, 14660 + "online": false, 14661 + "relativeSource": "", 14662 + "size": 0, 14663 + "text": "", 14664 + "thumbnails": null, 14665 + "thumbnailsBuiltAt": "0001-01-01T00:00:00Z", 14666 + "title": "", 14667 + "type": "paragraph", 14668 + "url": "" 14669 + }, 14670 + { 14671 + "alt": "", 14672 + "analyzed": false, 14673 + "anchor": "", 14674 + "attributes": { 14675 + "autoplay": false, 14676 + "controls": false, 14677 + "loop": false, 14678 + "muted": false, 14679 + "playsinline": false 14680 + }, 14681 + "caption": "", 14682 + "colors": { 14683 + "primary": "", 14684 + "secondary": "", 14685 + "tertiary": "" 14686 + }, 14687 + "content": "<p>Le prototype de lโ€™application, expliquant son design, est disponible sur Penpot, une alternative open-source ร  Figma (net7 pensait ร  รฉventuellement hรฉberger sa propre instance de Penpot)</p>", 14688 + "contentType": "", 14689 + "dimensions": { 14690 + "aspectRatio": 0, 14691 + "height": 0, 14692 + "width": 0 14693 + }, 14694 + "distSource": "", 14695 + "duration": 0, 14696 + "hasSound": false, 14697 + "hash": "", 14698 + "id": "6iZCn0c7Xz", 10889 14699 "index": 0, 10890 14700 "online": false, 10891 14701 "relativeSource": "", ··· 10900 14710 ], 10901 14711 "footnotes": {}, 10902 14712 "layout": [ 10903 - ["bKt3xEgWER", "YYAgMHnXLp", "YYAgMHnXLp"], 10904 - ["bKt3xEgWER", "9sNAmXk-oL", "oM865TcIi2"], 10905 - ["empty", "UCWFLEFMsb", "b2xEuJplk2"], 10906 - ["UhEvsvwp1P", "UhEvsvwp1P", "UhEvsvwp1P"] 14713 + ["x3a7eYA1oT"], 14714 + ["zN7q5zCYdj"], 14715 + ["9sNAmXk-oL"], 14716 + ["UCWFLEFMsb"], 14717 + ["b2xEuJplk2"], 14718 + ["MMSn22lsjd"], 14719 + ["URji-G5AHN"], 14720 + ["nxGlj_zrne"], 14721 + ["1OC2TW1w_-"], 14722 + ["8OzVijx48p"], 14723 + ["mKMjIPmVgo"], 14724 + ["vuGPxHbh1Y"], 14725 + ["o9OtHoxYhZ"], 14726 + ["6g9de2FcQO"], 14727 + ["XsCzP1qJa1"], 14728 + ["U828kgW8Tg"], 14729 + ["SSSbjzGQSq"], 14730 + ["WSnDuMdBth"], 14731 + ["jpdqhnxDfd"], 14732 + ["X6OgZjWcTa"], 14733 + ["mXx2DFBYIv"], 14734 + ["fF-B3c0rR0"], 14735 + ["ChAAezNEll"], 14736 + ["SNse4wqyxE"], 14737 + ["bExbpejqqn"], 14738 + ["2ej02y6e0W"], 14739 + ["9egTO5MCu9"], 14740 + ["RQ__7rPO3H"], 14741 + ["C5sWD_AGAa"], 14742 + ["GNr9VhiEGs"], 14743 + ["i_MjiJXdYd"], 14744 + ["i2hXfLIXGs"], 14745 + ["6m1-yt8Q3R"], 14746 + ["qNAyLbO2_X"], 14747 + ["0py22-bfYD"], 14748 + ["y0hv_y5-1i"], 14749 + ["6wDmiucCUy"], 14750 + ["_v176K9-ER"], 14751 + ["pydYCQsK0K"], 14752 + ["ULFx3Sn6Pf"], 14753 + ["ByQrAR4JY0"], 14754 + ["uPYEbd_C1u"], 14755 + ["TXwald6OF3"], 14756 + ["g94RsF_jRy"], 14757 + ["TPEsg5-EGf"], 14758 + ["UU0q6BjVAn"], 14759 + ["G2atqhTysk"], 14760 + ["xCbG8C1SS3"], 14761 + ["r6-JVmEtX-"], 14762 + ["bla50vEGwP"], 14763 + ["doy11G_UR4"], 14764 + ["x0VA9qBXmg"], 14765 + ["sB7aOuaaDu"], 14766 + ["Tift_2g3nt"], 14767 + ["DYCBlavnRV"], 14768 + ["-eZ2VLLzMG"], 14769 + ["yG4zPdM2CL"], 14770 + ["tdpAgA9z7F"], 14771 + ["nMsj35xg1L"], 14772 + ["Aso8dVxNDj"], 14773 + ["DNTYqNwAJR"], 14774 + ["nz90QMp2kB"], 14775 + ["2PKvcGpkvf"], 14776 + ["J6R4fpSJEw"], 14777 + ["ehbEvu19yw"], 14778 + ["wHCcIcy69M"], 14779 + ["oM865TcIi2"], 14780 + ["bmloLnRwkg"], 14781 + ["y2SPGWbUCC"], 14782 + ["crOfbrPi4P"], 14783 + ["759rM3Uh_1"], 14784 + ["EW5qT2lSbj"], 14785 + ["gGdzkJdoyO"], 14786 + ["45eCA-qO62"], 14787 + ["8qQmfk40N4"], 14788 + ["FdVYbhxwJG"], 14789 + ["Fzajdp5Cqz"], 14790 + ["CPR5mfx5vM"], 14791 + ["sFfxqzx-zn"], 14792 + ["JfbkQXq4O5"], 14793 + ["cjaiRo0iDH"], 14794 + ["_Hf907tP1n"], 14795 + ["ookBh6o-I4"], 14796 + ["RB_OiOW6UG"], 14797 + ["JwK3Z1gyvY"], 14798 + ["agZyWgOtVi"], 14799 + ["_aixbfh6yh"], 14800 + ["skpbXToqC0"], 14801 + ["kyIpBKEnu7"], 14802 + ["Pl7FBGo7_1"], 14803 + ["ZfsREVf5nh"], 14804 + ["0w37zUUiFt"], 14805 + ["maTfUnqH3a"], 14806 + ["TdeLW23-Pw"], 14807 + ["r0A0z76lZY"], 14808 + ["iLyT6jjZnM"], 14809 + ["bx32XBaUyi"], 14810 + ["y9nmb5HSlL"], 14811 + ["6iZCn0c7Xz"] 10907 14812 ], 10908 14813 "title": "Churros" 10909 14814 } 10910 14815 }, 10911 - "descriptionHash": "VNWXrs0Ts/YsWpMBRstcDw==", 14816 + "descriptionHash": "zuoNYxwmOXiYK13Two8GeQ==", 10912 14817 "id": "churros", 10913 14818 "metadata": { 10914 14819 "additionalMetadata": { 10915 - "layout": [ 10916 - ["m1", "p1", "p1"], 10917 - ["m1", "l1", "l2"], 10918 - [null, "l3", "l4"], 10919 - ["p2"] 10920 - ], 10921 14820 "made_with": [ 10922 14821 "penpot", 10923 14822 "figma", ··· 10933 14832 "prisma", 10934 14833 "postgresql", 10935 14834 "redis", 14835 + "go", 10936 14836 "nats", 10937 14837 "gitlab-ci", 10938 14838 "docker", ··· 10948 14848 "centraverse", 10949 14849 { 10950 14850 "notella": "https://wakatime.com/@gwennlbh/projects/waxaqoyplq" 10951 - }, 10952 - "churros-notella", 10953 - "churros-wiki", 10954 - "churros-mobile" 14851 + } 10955 14852 ] 10956 14853 }, 10957 14854 "aliases": null,