PageSourceSearch

https://tiangolo.com/projects/

html tiangolo.com collected 2026-09-24 06:56:20 UTC 35,798 bytes, 1,307 lines download raw bytes

1
2<!doctype html>
3<html lang="en" class="no-js">
4  <head>
5    
6      <meta charset="utf-8">
7      <meta name="viewport" content="width=device-width,initial-scale=1">
8      
9        <meta name="description" content="Stuff by tiangolo">
10      
11      
12      
13        <link rel="canonical" href="https://tiangolo.com/projects/">
14      
15      
16        <link rel="prev" href="../open-source/">
17      
18      
19        <link rel="next" href="../open-source/help/">
20      
21      
22        
23      
24      
25      <link rel="icon" href="../img/favicon.png">
26      <meta name="generator" content="zensical-0.0.51">
27    
28    
29      
30        <title>Projects - tiangolo's boring personal website</title>
31      
32    
33    
34      
35        
36      
37      <link rel="stylesheet" href="../assets/stylesheets/classic/main.f62f0af6.min.css">
38      
39        
40          
41        
42        <link rel="stylesheet" href="../assets/stylesheets/classic/palette.7dc9a0ad.min.css">
43      
44      
45
46
47    
48    
49      
50    
51    
52      
53        
54        
55        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
56        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i,700,700i%7CRoboto+Mono:400,400i,700,700i&amp;display=fallback">
57        <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
58      
59    
60    
61      <link rel="stylesheet" href="../css/termynal.css">
62    
63      <link rel="stylesheet" href="../css/custom.css">
64    
65    
65<script>__md_scope=new URL("..",location),__md_scope.pathname.endsWith("/")||(__md_scope=new URL(__md_scope.pathname+"/",location)),__md_hash=e=>[...e].reduce(((e,t)=>(e<<5)-e+t.charCodeAt(0)),0),__md_get=(e,t=localStorage,_=__md_scope)=>JSON.parse(t.getItem(_.pathname+"."+e)),__md_set=(e,t,_=localStorage,a=__md_scope)=>{try{_.setItem(a.pathname+"."+e,JSON.stringify(t))}catch(e){}},document.documentElement.setAttribute("data-platform",navigator.platform)</script>
65
66    
67      
68
69    
70    
71  </head>
72  
73  
74    
75    
76      
77    
78    
79    
80    
81    <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
82  
83    
84    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
85    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
86    <label class="md-overlay" for="__drawer" aria-label="Navigation"></label>
87    <div data-md-component="skip">
88      
89        
90        <a href="#projects" class="md-skip">
91          Skip to content
92        </a>
93      
94    </div>
95    <div data-md-component="announce">
96      
97    </div>
98    
99    
100      
101
102  
103
104<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
105  <nav class="md-header__inner md-grid" aria-label="Header">
106    <a href="./.." title="tiangolo&#x27;s boring personal website" class="md-header__button md-logo" aria-label="tiangolo's boring personal website" data-md-component="logo">
107      
108  <img src="../img/favicon.png" alt="tiangolo's boring personal website">
109
110    </a>
111    <label class="md-header__button md-icon" for="__drawer" aria-label="Navigation">
112      
113      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
114    </label>
115    <div class="md-header__title" data-md-component="header-title">
116      <div class="md-header__ellipsis">
117        <div class="md-header__topic">
118          <span class="md-ellipsis">
119            tiangolo's boring personal website
120          </span>
121        </div>
122        <div class="md-header__topic" data-md-component="header-topic">
123          <span class="md-ellipsis">
124            
125              Projects
126            
127          </span>
128        </div>
129      </div>
130    </div>
131    
132      
133        <form class="md-header__option" data-md-component="palette">
134  
135    
136    
137    
138    <input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo"  aria-label="Switch to light mode"  type="radio" name="__palette" id="__palette_0">
139    
140      <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
141        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9 2C5.13 2 2 5.13 2 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.87-3.13-7-7-7M6 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H6zm13-8h-2l-3.2 9h1.9l.7-2h3.2l.7 2h1.9zm-2.15 5.65L18 15l1.15 3.65z"/></svg>
142      </label>
143    
144  
145    
146    
147    
148    <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue-grey" data-md-color-accent="teal"  aria-label="Switch to dark mode"  type="radio" name="__palette" id="__palette_1">
149    
150      <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
151        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 0-7 7c0 2.38 1.19 4.47 3 5.74V17a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-2.26c1.81-1.27 3-3.36 3-5.74a7 7 0 0 0-7-7M9 21a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-1H9z"/></svg>
152      </label>
153    
154  
155    
156    
157    
158    <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="blue-grey" data-md-color-accent="teal"  aria-label="Switch to system preference"  type="radio" name="__palette" id="__palette_2">
159    
160      <label class="md-header__button md-icon" title="Switch to system preference" for="__palette_0" hidden>
161        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 1 7 7c0 2.38-1.19 4.47-3 5.74V17a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-2.26C6.19 13.47 5 11.38 5 9a7 7 0 0 1 7-7M9 21v-1h6v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1m3-17a5 5 0 0 0-5 5c0 2.05 1.23 3.81 3 4.58V16h4v-2.42c1.77-.77 3-2.53 3-4.58a5 5 0 0 0-5-5"/></svg>
162      </label>
163    
164  
165</form>
166      
167    
168    
169      
169<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
169
170    
171    
172    
173      
174      
175        <label class="md-header__button md-icon" for="__search" aria-label="Search">
176          
177          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
178        </label>
179        <div class="md-search" data-md-component="search" role="dialog" aria-label="Search">
180  <button type="button" class="md-search__button">
181    Search
182  </button>
183</div>
184      
185    
186    <div class="md-header__source">
187      
188        <a href="https://github.com/tiangolo/tiangolo.com" title="Go to repository" class="md-source" data-md-component="source">
189  <div class="md-source__icon md-icon">
190    
191    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"/></svg>
192  </div>
193  <div class="md-source__repository">
194    tiangolo/tiangolo.com
195  </div>
196</a>
197      
198    </div>
199  </nav>
200  
201    
202      
203<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
204  <div class="md-grid">
205    <ul class="md-tabs__list">
206      
207        
208  
209  
210  
211  
212    <li class="md-tabs__item">
213      <a href="./.." class="md-tabs__link">
214        
215  
216  Home
217
218      </a>
219    </li>
220  
221
222      
223        
224  
225  
226  
227    
228  
229  
230    
231      
232      
233        
234          
235        
236      
237        
238      
239        
240      
241        
242      
243        
244      
245        
246      
247    
248    
249    
250    
251      <li class="md-tabs__item md-tabs__item--active">
252        <a href="../open-source/" class="md-tabs__link">
253          
254  
255  Open Source
256
257        </a>
258      </li>
259    
260  
261
262      
263        
264  
265  
266  
267  
268    
269      
270      
271        
272          
273        
274      
275        
276      
277    
278    
279    
280    
281      <li class="md-tabs__item">
282        <a href="../ideas/" class="md-tabs__link">
283          
284  
285  Ideas
286
287        </a>
288      </li>
289    
290  
291
292      
293        
294  
295  
296  
297  
298    
299      
300      
301        
302          
303        
304      
305        
306      
307        
308      
309    
310    
311    
312    
313      <li class="md-tabs__item">
314        <a href="../guides/" class="md-tabs__link">
315          
316  
317  Guides
318
319        </a>
320      </li>
321    
322  
323
324      
325    </ul>
326  </div>
327</nav>
328    
329  
330</header>
331    
332    <div class="md-container" data-md-component="container">
333      
334      
335        
336      
337      <main class="md-main" data-md-component="main">
338        <div class="md-main__inner md-grid">
339          
340            
341              
342              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
343                <div class="md-sidebar__scrollwrap">
344                  <div class="md-sidebar__inner">
345                    
346
347
348  
349
350
351<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
352  <label class="md-nav__title" for="__drawer">
353    <a href="./.." title="tiangolo&#x27;s boring personal website" class="md-nav__button md-logo" aria-label="tiangolo's boring personal website" data-md-component="logo">
354      
355  <img src="../img/favicon.png" alt="tiangolo's boring personal website">
356
357    </a>
358    tiangolo's boring personal website
359  </label>
360  
361    <div class="md-nav__source">
362      <a href="https://github.com/tiangolo/tiangolo.com" title="Go to repository" class="md-source" data-md-component="source">
363  <div class="md-source__icon md-icon">
364    
365    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
365<path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"/></svg>
366  </div>
367  <div class="md-source__repository">
368    tiangolo/tiangolo.com
369  </div>
370</a>
371    </div>
372  
373  <ul class="md-nav__list" data-md-scrollfix>
374    
375      
376      
377  
378  
379  
380  
381    <li class="md-nav__item">
382      <a href="./.." class="md-nav__link">
383        
384  
385  
386  <span class="md-ellipsis">
387    
388  
389  Home
390
391    
392  </span>
393  
394  
395
396      </a>
397    </li>
398  
399
400    
401      
402      
403  
404  
405    
406  
407  
408  
409    
410    
411      
412        
413          
414        
415      
416        
417      
418        
419      
420        
421      
422        
423      
424        
425      
426    
427    
428    
429      
430        
431        
432      
433      
434    
435    
436    <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
437      
438        
439        
440        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
441        
442          
443          <div class="md-nav__link md-nav__container">
444            <a href="../open-source/" class="md-nav__link ">
445              
446  
447  
448  <span class="md-ellipsis">
449    
450  
451  Open Source
452
453    
454  </span>
455  
456  
457
458            </a>
459            
460              
461              <label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
462                <span class="md-nav__icon md-icon"></span>
463              </label>
464            
465          </div>
466        
467        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
468          <label class="md-nav__title" for="__nav_2">
469            <span class="md-nav__icon md-icon"></span>
470            
471  
472  
473
474          </label>
475          <ul class="md-nav__list" data-md-scrollfix>
476            
477              
478            
479              
480                
481  
482  
483    
484  
485  
486  
487    <li class="md-nav__item md-nav__item--active">
488      
489      
490        <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
491      
492      
493      
494        
495      
496      
497        <label class="md-nav__link md-nav__link--active" for="__toc">
498          
499  
500  
501  <span class="md-ellipsis">
502    
503  
504  Projects
505
506    
507  </span>
508  
509  
510
511          <span class="md-nav__icon md-icon"></span>
512        </label>
513      
514      <a href="././" class="md-nav__link md-nav__link--active">
515        
516  
517  
518  <span class="md-ellipsis">
519    
520  
521  Projects
522
523    
524  </span>
525  
526  
527
528      </a>
529      
530        
531
532
533<nav class="md-nav md-nav--secondary" aria-label="On this page">
534  
535  
536  
537    
538  
539  
540    <label class="md-nav__title" for="__toc">
541      <span class="md-nav__icon md-icon"></span>
542      On this page
543    </label>
544    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
545      
546        <li class="md-nav__item">
547  <a href="#fastapi-github" class="md-nav__link">
548    <span class="md-ellipsis">
549      <span class="md-typeset">
550        FastAPI GitHub
551      </span>
552    </span>
553  </a>
554  
555</li>
556      
557        <li class="md-nav__item">
558  <a href="#tiangolos-github" class="md-nav__link">
559    <span class="md-ellipsis">
560      <span class="md-typeset">
561        tiangolo's GitHub
562      </span>
563    </span>
564  </a>
565  
566</li>
567      
568    </ul>
569  
570</nav>
571      
572    </li>
573  
574
575              
576            
577              
578                
579  
580  
581  
582  
583    <li class="md-nav__item">
584      <a href="../open-source/help/" class="md-nav__link">
585        
586  
587  
588  <span class="md-ellipsis">
589    
590  
591  Help
592
593    
594  </span>
595  
596  
597
598      </a>
599    </li>
600  
601
602              
603            
604              
605                
606  
607  
608  
609  
610    <li class="md-nav__item">
611      <a href="../open-source/contributing/" class="md-nav__link">
612        
613  
614  
615  <span class="md-ellipsis">
616    
617  
618  Contributing
619
620    
621  </span>
622  
623  
624
625      </a>
626    </li>
627  
628
629              
630            
631              
632                
633  
634  
635  
636  
637    <li class="md-nav__item">
638      <a href="../github-fastapi/" class="md-nav__link">
639        
640  
641  
642  <span class="md-ellipsis">
643    
644  
645  GitHub FastAPI
646
647    
648  </span>
649  
650  
651
652      </a>
653    </li>
654  
655
656              
657            
658              
659                
660  
661  
662  
663  
664    <li class="md-nav__item">
665      <a href="../open-source/management-tasks/" class="md-nav__link">
666        
667  
668  
669  <span class="md-ellipsis">
670    
671  
672  Management Tasks
673
674    
675  </span>
676  
677  
678
679      </a>
680    </li>
681  
682
683              
684            
685          </ul>
686        </nav>
687      
688    </li>
689  
690
691    
692      
693      
694  
695  
696  
697  
698    
699    
700      
701        
702          
703        
704      
705        
706      
707    
708    
709    
710      
711      
712    
713    
714    <li class="md-nav__item md-nav__item--nested">
715      
716        
717        
718        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
719        
720          
721          <div class="md-nav__link md-nav__container">
722            <a href="../ideas/" class="md-nav__link ">
723              
724  
725  
726  <span class="md-ellipsis">
727    
728  
729  Ideas
730
731    
732  </span>
733  
734  
735
736            </a>
737            
738              
739              <label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="0">
740                <span class="md-nav__icon md-icon"></span>
741              </label>
742            
743          </div>
744        
745        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
746          <label class="md-nav__title" for="__nav_3">
747            <span class="md-nav__icon md-icon"></span>
748            
749  
750  
751
752          </label>
753          <ul class="md-nav__list" data-md-scrollfix>
754            
755              
756            
757              
758                
759  
760  
761  
762  
763    <li class="md-nav__item">
764      <a href="../ideas/library-agent-skills/" class="md-nav__link">
765        
766  
767  
768  <span class="md-ellipsis">
769    
770  
771  Library Agent Skills
772
773    
774  </span>
775  
776  
777
778      </a>
779    </li>
780  
781
782              
783            
784          </ul>
785        </nav>
786      
787    </li>
788  
789
790    
791      
792      
793  
794  
795  
796  
797    
798    
799      
800        
801          
802        
803      
804        
805      
806        
807      
808    
809    
810    
811      
812      
813    
814    
815    <li class="md-nav__item md-nav__item--nested">
816      
817        
818        
819        <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
820        
821          
822          <div class="md-nav__link md-nav__container">
823            <a href="../guides/" class="md-nav__link ">
824              
825  
826  
827  <span class="md-ellipsis">
828    
829  
830  Guides
831
832    
833  </span>
834  
835  
836
837            </a>
838            
839              
840              <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
841                <span class="md-nav__icon md-icon"></span>
842              </label>
843            
844          </div>
845        
846        <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
847          <label class="md-nav__title" for="__nav_4">
848            <span class="md-nav__icon md-icon"></span>
849            
850  
851  
852
853          </label>
854          <ul class="md-nav__list" data-md-scrollfix>
855            
856              
857            
858              
859                
860  
861  
862  
863  
864    <li class="md-nav__item">
865      <a href="../guides/environment-variables/" class="md-nav__link">
866        
867  
868  
869  <span class="md-ellipsis">
870    
871  
872  Environment Variables
873
874    
875  </span>
876  
877  
878
879      </a>
880    </li>
881  
882
883              
884            
885              
886                
887  
888  
889  
890  
891    <li class="md-nav__item">
892      <a href="../guides/virtual-environments/" class="md-nav__link">
893        
894  
895  
896  <span class="md-ellipsis">
897    
898  
899  Virtual Environments
900
901    
902  </span>
903  
904  
905
906      </a>
907    </li>
908  
909
910              
911            
912          </ul>
913        </nav>
914      
915    </li>
916  
917
918    
919  </ul>
920</nav>
921                  </div>
922                </div>
923              </div>
924            
925            
926              
927              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
928                <div class="md-sidebar__scrollwrap">
929                  
930                  <div class="md-sidebar__inner">
931                    
932
933
934<nav class="md-nav md-nav--secondary" aria-label="On this page">
935  
936  
937  
938    
939  
940  
941    <label class="md-nav__title" for="__toc">
942      <span class="md-nav__icon md-icon"></span>
943      On this page
944    </label>
945    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
946      
947        <li class="md-nav__item">
948  <a href="#fastapi-github" class="md-nav__link">
949    <span class="md-ellipsis">
950      <span class="md-typeset">
951        FastAPI GitHub
952      </span>
953    </span>
954  </a>
955  
956</li>
957      
958        <li class="md-nav__item">
959  <a href="#tiangolos-github" class="md-nav__link">
960    <span class="md-ellipsis">
961      <span class="md-typeset">
962        tiangolo's GitHub
963      </span>
964    </span>
965  </a>
966  
967</li>
968      
969    </ul>
970  
971</nav>
972                  </div>
973                </div>
974              </div>
975            
976          
977          
978            <div class="md-content" data-md-component="content">
979              
980                
981
982
983
984  
985
986
987  <nav class="md-path" aria-label="Navigation" >
988    <ol class="md-path__list">
989      
990        
991  
992  
993    <li class="md-path__item">
994      <a href="./.." class="md-path__link">
995        
996  
997  <span class="md-ellipsis">
998    Home
999  </span>
1000
1001      </a>
1002    </li>
1003  
1004
1005      
1006      
1007        
1008  
1009  
1010    
1011    
1012      
1013        
1014          
1015        
1016      
1017        
1018      
1019        
1020      
1021        
1022      
1023        
1024      
1025        
1026      
1027    
1028    
1029    
1030    
1031      <li class="md-path__item">
1032        <a href="../open-source/" class="md-path__link">
1033          
1034  
1035  <span class="md-ellipsis">
1036    Open Source
1037  </span>
1038
1039        </a>
1040      </li>
1041    
1042  
1043
1044      
1045    </ol>
1046  </nav>
1047
1048              
1049              <article class="md-content__inner md-typeset">
1050                
1051                  
1052  
1053  
1054
1055
1056<h1 id="projects">Projects<a class="headerlink" href="#projects" title="Permanent link">&para;</a></h1>
1057<p>I've created a few open source projects. ✨</p>
1058<h2 id="fastapi-github">FastAPI GitHub<a class="headerlink" href="#fastapi-github" title="Permanent link">&para;</a></h2>
1059<p>Projects in the <a href="https://github.com/fastapi">FastAPI GitHub organization</a>.</p>
1060<ul>
1061<li>
1062<p><small>⭐️ 87900</small> <a href="https://github.com/fastapi/fastapi">fastapi</a> - FastAPI framework, high performance, easy to learn, fast to code, ready for production</p>
1063</li>
1064<li>
1065<p><small>⭐️ 35005</small> <a href="https://github.com/fastapi/full-stack-fastapi-template">full-stack-fastapi-template</a> - Full stack, modern web application template. Using FastAPI, React, SQLModel, PostgreSQL, Docker, GitHub Actions, automatic HTTPS and more.</p>
1066</li>
1067<li>
1068<p><small>⭐️ 17582</small> <a href="https://github.com/fastapi/typer">typer</a> - Typer, build great CLIs. Easy to code. Based on Python type hints.</p>
1069</li>
1070<li>
1071<p><small>⭐️ 16470</small> <a href="https://github.com/fastapi/sqlmodel">sqlmodel</a> - SQL databases in Python, designed for simplicity, compatibility, and robustness.</p>
1072</li>
1073<li>
1074<p><small>⭐️ 2027</small> <a href="https://github.com/fastapi/asyncer">asyncer</a> - Asyncer, async and await, focused on developer experience.</p>
1075</li>
1076<li>
1077<p><small>⭐️ 481</small> <a href="https://github.com/fastapi/fastapi-cli">fastapi-cli</a> - Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀</p>
1078</li>
1079</ul>
1080<h2 id="tiangolos-github">tiangolo's GitHub<a class="headerlink" href="#tiangolos-github" title="Permanent link">&para;</a></h2>
1081<p>Projects in my <a href="https://github.com/tiangolo">
1081personal GitHub profile: @tiangolo</a>.</p>
1082<ul>
1083<li>
1084<p><small>⭐️ 3008</small> <a href="https://github.com/tiangolo/uwsgi-nginx-flask-docker">uwsgi-nginx-flask-docker</a> - Docker image with uWSGI and Nginx for Flask applications in Python running in a single container.</p>
1085</li>
1086<li>
1087<p><small>⭐️ 2789</small> <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker">uvicorn-gunicorn-fastapi-docker</a> - Docker image with Uvicorn managed by Gunicorn for high-performance FastAPI web applications in Python with performance auto-tuning.</p>
1088</li>
1089<li>
1090<p><small>⭐️ 1284</small> <a href="https://github.com/tiangolo/pydantic-sqlalchemy">pydantic-sqlalchemy</a> - Tools to convert SQLAlchemy models to Pydantic models</p>
1091</li>
1092<li>
1093<p><small>⭐️ 1272</small> <a href="https://github.com/tiangolo/nginx-rtmp-docker">nginx-rtmp-docker</a> - Docker image with Nginx using the nginx-rtmp-module module for live multimedia (video) streaming.</p>
1094</li>
1095<li>
1096<p><small>⭐️ 1136</small> <a href="https://github.com/tiangolo/dockerswarm.rocks">dockerswarm.rocks</a> - Docker Swarm mode rocks! Ideas, tools and recipes. Get a production-ready, distributed, HTTPS served, cluster in minutes, not weeks.</p>
1097</li>
1098<li>
1099<p><small>⭐️ 658</small> <a href="https://github.com/tiangolo/uwsgi-nginx-docker">uwsgi-nginx-docker</a> - Docker image with uWSGI and Nginx for applications in Python (as Flask) in a single container.</p>
1100</li>
1101<li>
1102<p><small>⭐️ 641</small> <a href="https://github.com/tiangolo/uvicorn-gunicorn-docker">uvicorn-gunicorn-docker</a> - Docker image with Uvicorn managed by Gunicorn for high-performance web applications in Python with performance auto-tuning.</p>
1103</li>
1104<li>
1105<p><small>⭐️ 482</small> <a href="https://github.com/tiangolo/meinheld-gunicorn-flask-docker">meinheld-gunicorn-flask-docker</a> - Docker image with Meinheld and Gunicorn for Flask applications in Python.</p>
1106</li>
1107<li>
1108<p><small>⭐️ 273</small> <a href="https://github.com/tiangolo/blog-posts">blog-posts</a> - Blog posts and related code by Sebastián Ramírez (@tiangolo)</p>
1109</li>
1110<li>
1111<p><small>⭐️ 194</small> <a href="https://github.com/tiangolo/uvicorn-gunicorn-starlette-docker">uvicorn-gunicorn-starlette-docker</a> - Docker image with Uvicorn managed by Gunicorn for high-performance Starlette web applications in Python with performance auto-tuning.</p>
1112</li>
1113<li>
1114<p><small>⭐️ 186</small> <a href="https://github.com/tiangolo/latest-changes">latest-changes</a> - A GitHub Action to add latest changes after each PR merged automatically</p>
1115</li>
1116<li>
1117<p><small>⭐️ 166</small> <a href="https://github.com/tiangolo/meinheld-gunicorn-docker">meinheld-gunicorn-docker</a> - Docker image with Meinheld managed by Gunicorn for high-performance WSGI (Flask, Django, etc) web applications in Python with performance auto-tuning.</p>
1118</li>
1119<li>
1120<p><small>⭐️ 64</small> <a href="https://github.com/tiangolo/issue-manager">issue-manager</a> - Automatically close issues that have a label, after a custom delay, if no one replies back.</p>
1121</li>
1122<li>
1123<p><small>⭐️ 42</small> <a href="https://github.com/tiangolo/tiangolo.com">tiangolo.com</a> </p>
1124</li>
1125<li>
1126<p><small>⭐️ 17</small> <a href="https://github.com/tiangolo/github-actions-sandbox">github-actions-sandbox</a> - Not useful for you. It's just a sandbox GitHub repo for me to try out stuff and develop GitHub Actions.
1126</p>
1127</li>
1128<li>
1129<p><small>⭐️ 16</small> <a href="https://github.com/tiangolo/tiangolo">tiangolo</a> </p>
1130</li>
1131<li>
1132<p><small>⭐️ 12</small> <a href="https://github.com/tiangolo/markdown-include-variants">markdown-include-variants</a> - Markdown extension to expand directives to include source example files to also include their variants. Only useful to tiangolo's projets. Don't use it. 😅</p>
1133</li>
1134</ul>
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144  
1145  
1146
1147
1148
1149
1150
1151
1152                
1153              </article>
1154            </div>
1155          
1156          
1157  
1157<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
1157
1158
1159<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
1159
1160        </div>
1161        
1162          <button type="button" class="md-top md-icon" data-md-component="top" hidden>
1163  
1164  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
1165  Back to top
1166</button>
1167        
1168      </main>
1169      
1170        <footer class="md-footer">
1171  
1172    
1173      
1174      <nav class="md-footer__inner md-grid" aria-label="Footer" >
1175        
1176          
1177          <a href="../open-source/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Open Source">
1178            <div class="md-footer__button md-icon">
1179              
1180              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
1181            </div>
1182            <div class="md-footer__title">
1183              <span class="md-footer__direction">
1184                Previous
1185              </span>
1186              <div class="md-ellipsis">
1187                Open Source
1188              </div>
1189            </div>
1190          </a>
1191        
1192        
1193          
1194          <a href="../open-source/help/" class="md-footer__link md-footer__link--next" aria-label="Next: Help">
1195            <div class="md-footer__title">
1196              <span class="md-footer__direction">
1197                Next
1198              </span>
1199              <div class="md-ellipsis">
1200                Help
1201              </div>
1202            </div>
1203            <div class="md-footer__button md-icon">
1204              
1205              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
1206            </div>
1207          </a>
1208        
1209      </nav>
1210    
1211  
1212  <div class="md-footer-meta md-typeset">
1213    <div class="md-footer-meta__inner md-grid">
1214      <div class="md-copyright">
1215  
1216  
1217    Made with
1218    <a href="https://zensical.org/" target="_blank" rel="noopener">
1219      Zensical
1220    </a>
1221  
1222</div>
1223      
1224        
1225<div class="md-social">
1226  
1227    
1228    
1229    
1230    
1231      
1232      
1233    
1234    <a href="https://github.com/tiangolo" target="_blank" rel="noopener" title="github.com" class="md-social__link">
1235      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"/></svg>
1236    </a>
1237  
1238    
1239    
1240    
1241    
1242      
1243      
1244    
1245    <a href="https://x.com/tiangolo" target="_blank" rel="noopener" title="x.com" class="md-social__link">
1246      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M357.2 48h70.6L273.6 224.2 455 464H313L201.7 318.6 74.5 464H3.8l164.9-188.5L-5.2 48h145.6l100.5 132.9zm-24.8 373.8h39.1L119.1 88h-42z"/></svg>
1247    </a>
1248  
1249    
1250    
1251    
1252    
1253      
1254      
1255    
1256    <a href="https://bsky.app/profile/tiangolo.com" target="_blank" rel="noopener" title="bsky.app" class="md-social__link">
1257      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.-->
1257<path fill="currentColor" d="M407.8 294.7c-3.3-.4-6.7-.8-10-1.3 3.4.4 6.7.9 10 1.3M288 227.1c-26.1-50.7-97.1-145.2-163.1-191.8C61.6-9.4 37.5-1.7 21.6 5.5 3.3 13.8 0 41.9 0 58.4S9.1 194 15 213.9c19.5 65.7 89.1 87.9 153.2 80.7 3.3-.5 6.6-.9 10-1.4-3.3.5-6.6 1-10 1.4-93.9 14-177.3 48.2-67.9 169.9C220.6 589.1 265.1 437.8 288 361.1c22.9 76.7 49.2 222.5 185.6 103.4 102.4-103.4 28.1-156-65.8-169.9-3.3-.4-6.7-.8-10-1.3 3.4.4 6.7.9 10 1.3 64.1 7.1 133.6-15.1 153.2-80.7C566.9 194 576 75 576 58.4s-3.3-44.7-21.6-52.9c-15.8-7.1-40-14.9-103.2 29.8C385.1 81.9 314.1 176.4 288 227.1"/></svg>
1258    </a>
1259  
1260    
1261    
1262    
1263    
1264      
1265      
1266    
1267    <a href="https://www.linkedin.com/in/tiangolo" target="_blank" rel="noopener" title="www.linkedin.com" class="md-social__link">
1268      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zM102.2 96a38.5 38.5 0 1 1 0 77 38.5 38.5 0 1 1 0-77m282.1 320h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9z"/></svg>
1269    </a>
1270  
1271    
1272    
1273    
1274    
1275    <a href="/cdn-cgi/l/email-protection#0b7f626a656c6467644b6c666a626725686466" target="_blank" rel="noopener" title="" class="md-social__link">
1276      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4l208 156a48 48 0 0 0 57.6 0l208-156c12.1-9.1 19.2-23.3 19.2-38.4 0-26.5-21.5-48-48-48zM0 196v188c0 35.3 28.7 64 64 64h384c35.3 0 64-28.7 64-64V196L313.6 344.8c-34.1 25.6-81.1 25.6-115.2 0z"/></svg>
1277    </a>
1278  
1279</div>
1280      
1281    </div>
1282  </div>
1283</footer>
1284      
1285    </div>
1286    <div class="md-dialog" data-md-component="dialog">
1287      <div class="md-dialog__inner md-typeset"></div>
1288    </div>
1289    
1290      <div class="md-progress" data-md-component="progress" role="progressbar"></div>
vendor: 144 bytes, lines 1290-1296
1290
1291    
1292    
1293    
1294      
1295      
1296      <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1296<script id="__config" type="application/json">{"annotate":null,"base":"..","features":["content.code.annotate","content.code.copy","content.footnote.tooltips","navigation.tabs","content.tabs.link","navigation.tabs.sticky","content.tooltips","navigation.footer","navigation.indexes","navigation.instant","navigation.instant.prefetch","navigation.instant.progress","navigation.path","navigation.top","navigation.tracking","search.highlight","search.share","search.suggest","toc.follow"],"search":"../assets/javascripts/workers/search.b6b7e04f.min.js","tags":null,"translations":{"clipboard.copied":"Copied to clipboard","clipboard.copy":"Copy to clipboard","search.result.more.one":"1 more on this page","search.result.more.other":"# more on this page","search.result.none":"No matching documents","search.result.one":"1 matching document","search.result.other":"# matching documents","search.result.placeholder":"Type to start searching","search.result.term.missing":"Missing","select.version":"Select version"},"version":null}</script>
1296
1297    
1298    
1299      
1299<script src="../assets/javascripts/bundle.d7f30b55.min.js"></script>
1299
1300      
1301        
1301<script src="../js/termynal.js"></script>
1301
1302      
1303        
1303<script src="../js/custom.js"></script>
1303
1304      
1305    
1306  <!-- Cloudflare Pages Analytics -->
vendor: 99 bytes, line 1306
1306<script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "
1306f07bf92e34044a6a8363f73f2db938cb
vendor: 13 bytes, line 1306
1306"}'></script>
1306<!-- Cloudflare Pages Analytics --></body>
1307</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.