Dekada wpływu: jak nasze pakiety npm osiągnęły 1 miliard pobrań i ukształtowały JavaScript
W JavaScript oraz Node.js na świecie niektóre pakiety są niezbędne — pobierane miliony razy dziennie i napędzające aplikacje na całym świecie. Za tymi narzędziami stoją programiści skupieni na jakości open source. Dzisiaj pokazujemy, jak nasz zespół pomaga budować i utrzymywać pakiety npm, które stały się kluczowymi częściami ekosystemu JavaScript.
Pionierzy, którzy nam zaufali: Isaac Z. Schlueter i Forward Email
Jesteśmy dumni, że mamy Isaac Z. Schlüter (GitHub: isaacs) jako użytkownik. Isaac stworzył np i pomógł zbudować Node.js. Jego zaufanie do Forward Email pokazuje, że skupiamy się na jakości i bezpieczeństwie. Isaac używa Forward Email dla kilku domen, w tym izs.me.
Wpływ Isaaca na JavaScript jest ogromny. W 2009 r. był jednym z pierwszych, którzy dostrzegli potencjał Node.js, pracując z Ryan Dahl, który stworzył platformę. Jak powiedział Isaac w wywiad dla magazynu Increment: „Wśród tej bardzo małej społeczności składającej się z grupy ludzi próbujących dowiedzieć się, jak sprawić, by JS po stronie serwera się wydarzył, Ryan Dahl wyszedł z Node, co było po prostu bardzo wyraźnie właściwym podejściem. Wrzuciłem tam swoje żetony i bardzo się zaangażowałem mniej więcej w połowie 2009 roku”.
[!NOTE] Dla zainteresowanych historią Node.js dostępne są doskonałe dokumenty, które opisują jego rozwój, w tym Historia Node.js oraz 10 rzeczy, których żałuję w Node.js - Ryan Dahl. Ryana Dahla osobista strona internetowa zawiera również cenne spostrzeżenia na temat jego pracy.
Od powstania npm do przywództwa Node.js
Isaac stworzył npm we wrześniu 2009 r., a pierwsza użyteczna wersja została wydana na początku 2010 r. Ten menedżer pakietów wypełnił kluczową potrzebę Node.js, umożliwiając programistom łatwe udostępnianie i ponowne wykorzystywanie kodu. Zgodnie z Strona Wikipedii o Node.js„W styczniu 2010 r. wprowadzono menedżera pakietów dla środowiska Node.js o nazwie npm. Menedżer pakietów umożliwia programistom publikowanie i udostępnianie pakietów Node.js wraz z towarzyszącym im kodem źródłowym i ma na celu uproszczenie instalacji, aktualizacji i odinstalowywania pakietów”.
Kiedy Ryan Dahl odszedł z Node.js w styczniu 2012 r., Isaac przejął rolę lidera projektu. Jak zauważono na jego podsumowanie, „Kierował rozwojem kilku podstawowych interfejsów API Node.js, w tym systemu modułów CommonJS, interfejsów API systemu plików i strumieni” oraz „Przez 2 lata pełnił funkcję BDFL (Benevolent Dictator For Life) projektu, zapewniając stale rosnącą jakość i niezawodny proces kompilacji dla wersji Node.js od v0.6 do v0.10”.
Isaac poprowadził Node.js przez kluczowy okres wzrostu, ustanawiając standardy, które nadal kształtują platformę. Później, w 2014 r., założył npm, Inc., aby wspierać rejestr npm, który wcześniej prowadził samodzielnie.
Dziękujemy Isaacowi za jego ogromny wkład w JavaScript i nadal korzystamy z wielu pakietów, które stworzył. Jego praca zmieniła sposób, w jaki tworzymy oprogramowanie i sposób, w jaki miliony programistów na całym świecie dzielą się kodem.
Architekt za kodem: podróż Nicka Baugha
Sercem naszego sukcesu open source jest Nick Baugh, założyciel i właściciel Forward Email. Jego praca w JavaScript obejmuje prawie 20 lat i ukształtowała sposób, w jaki niezliczeni programiści tworzą aplikacje. Jego podróż open source pokazuje zarówno umiejętności techniczne, jak i przywództwo społeczności.
Ekspresowy Komitet Techniczny i Główne Wkłady
Ekspertyza Nicka w zakresie frameworków internetowych zapewniła mu miejsce na liście Ekspresowy Komitet Techniczny, gdzie pomagał przy jednym z najczęściej używanych frameworków Node.js. Nick jest teraz wymieniony jako nieaktywny członek na Strona społeczności Express.
[!WAŻNE] Express został pierwotnie stworzony przez TJ Holowaychuka, płodnego współtwórcę open source, który ukształtował znaczną część ekosystemu Node.js. Jesteśmy wdzięczni za fundamentalną pracę TJ i szanujemy jego decyzja o zrobieniu sobie przerwy z jego bogatego wkładu w projekty typu open source.
Jako członek Ekspresowy Komitet TechnicznyNick wykazał się dużą dbałością o szczegóły w kwestiach takich jak wyjaśnianie req.originalUrl
dokumentowanie i rozwiązywanie problemów z obsługą formularzy wieloczęściowych.
Wkłady do Koa Framework
Praca Nicka z Struktura Koa—nowoczesna, lżejsza alternatywa dla Express, również stworzona przez TJ Holowaychuka — dodatkowo pokazuje jego zaangażowanie w lepsze narzędzia do tworzenia stron internetowych. Jego wkład w Koa obejmuje zarówno problemy, jak i kod za pośrednictwem żądań ściągnięcia, zajmując się obsługą błędów, zarządzaniem typami treści i ulepszeniami dokumentacji.
Jego praca w Express i Koa zapewnia mu wyjątkowy wgląd w rozwój stron internetowych w Node.js, pomagając naszemu zespołowi tworzyć pakiety, które dobrze współpracują z wieloma ekosystemami frameworków.
Od indywidualnego współpracownika do lidera organizacji
To, co zaczęło się jako pomoc w istniejących projektach, przerodziło się w tworzenie i utrzymywanie całych ekosystemów pakietów. Nick założył wiele organizacji GitHub — w tym Kabina, Skaner spamu, Prześlij dalej e-mail, Pozwolić, oraz Bree—każdy z nich rozwiązuje konkretne potrzeby społeczności JavaScript.
Ta zmiana z roli współpracownika na lidera pokazuje wizję Nicka dotyczącą dobrze zaprojektowanego oprogramowania, które rozwiązuje prawdziwe problemy. Organizując powiązane pakiety w ramach ukierunkowanych organizacji GitHub, zbudował ekosystemy narzędzi, które współpracują ze sobą, pozostając jednocześnie modułowymi i elastycznymi dla szerszej społeczności programistów.
Nasze organizacje GitHub: ekosystemy innowacji
Organizujemy naszą pracę open source wokół skoncentrowanych organizacji GitHub, z których każda rozwiązuje konkretne potrzeby w JavaScript. Ta struktura tworzy spójne rodziny pakietów, które dobrze ze sobą współpracują, pozostając jednocześnie modułowe.
Cabin: Ustrukturyzowane rejestrowanie dla nowoczesnych aplikacji
Ten Organizacja kabiny to nasze podejście do prostego, wydajnego rejestrowania aplikacji. Główne cabin
pakiet ma prawie 900 gwiazdek GitHub i ponad 100 000 pobrań tygodniowo[^1]. Cabin zapewnia strukturalne rejestrowanie, które współpracuje z popularnymi usługami, takimi jak Sentry, LogDNA i Papertrail.
To, co czyni Cabin wyjątkowym, to przemyślany system API i wtyczek. Wspieranie pakietów takich jak axe
dla oprogramowania pośredniczącego Express i parse-request
dotyczące analizy żądań HTTP pokazują nasze zaangażowanie w tworzenie kompleksowych rozwiązań, a nie izolowanych narzędzi.
Ten bson-objectid
pakiet zasługuje na szczególną wzmiankę, z ponad 1,7 milionami pobrań w ciągu zaledwie dwóch miesięcy[^2]. Ta lekka implementacja MongoDB ObjectID stała się rozwiązaniem dla deweloperów potrzebujących identyfikatorów bez pełnych zależności MongoDB.
Skaner spamu: walka z nadużyciami poczty e-mail
Ten Organizacja Spam Scanner pokazuje nasze zaangażowanie w rozwiązywanie rzeczywistych problemów. Główne spamscanner
Pakiet zapewnia zaawansowaną detekcję spamu w wiadomościach e-mail, ale to jest url-regex-safe
pakiet, który cieszy się niesamowitym zainteresowaniem.
Ponad 1,2 miliona pobrań w ciągu dwóch miesięcy[^3] url-regex-safe
naprawia krytyczne problemy bezpieczeństwa w innych wyrażeniach regularnych wykrywania adresów URL. Ten pakiet pokazuje nasze podejście do open source: znalezienie wspólnego problemu (w tym przypadku Ponowne wykonanie luk w zabezpieczeniach walidacji adresów URL), tworząc solidne rozwiązanie i starannie je utrzymując.
Bree: Nowoczesne planowanie zadań z wątkami roboczymi
Ten Organizacja Bree jest naszą odpowiedzią na powszechne wyzwanie Node.js: niezawodne planowanie zadań. Główne bree
Pakiet, mający ponad 3100 gwiazdek w serwisie GitHub, oferuje nowoczesny harmonogram zadań wykorzystujący wątki robocze Node.js w celu zapewnienia lepszej wydajności i niezawodności.
[!UWAGA] Bree została stworzona po tym, jak pomogliśmy utrzymać Porządek obrad, stosując wyciągnięte wnioski, aby zbudować lepszy harmonogram zadań. Nasze wkłady w Agendę pomogły nam znaleźć sposoby na ulepszenie harmonogramu zadań.
Czym Bree różni się od innych harmonogramów typu Agenda:
- Brak zewnętrznych zależności:W przeciwieństwie do Agenda, która potrzebuje MongoDB, Bree nie potrzebuje Redis ani MongoDB do zarządzania stanem zadania.
- Wątki robocze:Bree wykorzystuje wątki robocze Node.js do procesów piaskownicy, co zapewnia lepszą izolację i wydajność.
- Proste API:Bree oferuje szczegółową kontrolę w połączeniu z prostotą, co ułatwia wdrażanie złożonych potrzeb w zakresie harmonogramowania.
- Wbudowane wsparcie:Domyślnie uwzględnione są takie elementy, jak łagodne przeładowywanie, zadania cron, daty i godziny przyjazne dla człowieka.
Bree jest kluczową częścią forwardemail.net, obsługując krytyczne zadania w tle, takie jak przetwarzanie wiadomości e-mail, czyszczenie i planowana konserwacja. Używanie Bree w Forward Email pokazuje nasze zaangażowanie w używanie własnych narzędzi w produkcji, zapewniając, że spełniają one wysokie standardy niezawodności.
Używamy i cenimy również inne świetne pakiety wątków roboczych, takie jak basen i klientów HTTP, takich jak jedenaście. Piscina, podobnie jak Bree, używa wątków roboczych Node.js do wydajnego przetwarzania zadań. Dziękujemy Mateusz Wzgórze, który utrzymuje undici i piscina, za jego znaczący wkład w Node.js. Matteo zasiada w Komitecie Sterującym Technicznym Node.js i znacznie poprawił możliwości klienta HTTP w Node.js.
Przekaż dalej e-mail: Infrastruktura poczty e-mail typu open source
Naszym najbardziej ambitnym projektem jest Prześlij dalej e-mail, usługa poczty e-mail z otwartym kodem źródłowym, która zapewnia przekazywanie wiadomości e-mail, przechowywanie ich i usługi API. Główne repozytorium ma ponad 1100 gwiazdek GitHub[^4], co pokazuje uznanie społeczności dla tej alternatywy dla zastrzeżonych usług poczty e-mail.
Ten preview-email
pakiet tej organizacji, z ponad 2,5 milionami pobrań w ciągu dwóch miesięcy[^5], stał się niezbędnym narzędziem dla programistów pracujących z szablonami wiadomości e-mail. Zapewniając prosty sposób podglądu wiadomości e-mail podczas opracowywania, rozwiązuje powszechny problem w budowaniu aplikacji obsługujących pocztę e-mail.
Lad: Niezbędne narzędzia i narzędzia Koa
Ten Organizacja chłopaków zapewnia zbiór niezbędnych narzędzi i narzędzi, które są przede wszystkim ukierunkowane na udoskonalenie ekosystemu Koa Framework. Te pakiety rozwiązują typowe problemy w rozwoju stron internetowych i są zaprojektowane tak, aby bezproblemowo ze sobą współpracować, pozostając jednocześnie użytecznymi niezależnie.
koa-better-error-handler: Ulepszona obsługa błędów dla Koa
koa-better-error-handler
oferuje lepsze rozwiązanie obsługi błędów dla aplikacji Koa. Z ponad 50 gwiazdkami GitHub, ten pakiet sprawia, że ctx.throw
generować przyjazne dla użytkownika komunikaty o błędach, jednocześnie usuwając kilka ograniczeń wbudowanego programu do obsługi błędów Koa:
- Wykrywa i prawidłowo obsługuje błędy DNS Node.js, błędy Mongoose i błędy Redis
- Zastosowania Wysięgnik do tworzenia spójnych, dobrze sformatowanych odpowiedzi na błędy
- Zachowuje nagłówki (w przeciwieństwie do wbudowanego modułu obsługi Koa)
- Utrzymuje odpowiednie kody statusu zamiast domyślnego ustawienia 500
- Obsługuje wiadomości flash i zachowywanie sesji
- Zawiera listy błędów HTML dla błędów walidacji
- Obsługuje wiele typów odpowiedzi (HTML, JSON i zwykły tekst)
Ten pakiet jest szczególnie cenny, gdy jest używany razem z koa-404-handler
do kompleksowego zarządzania błędami w aplikacjach Koa.
paszport: uwierzytelnienie dla Lad
@ladjs/passport
rozszerza popularne oprogramowanie pośredniczące uwierzytelniania Passport.js o konkretne ulepszenia dla nowoczesnych aplikacji internetowych. Ten pakiet obsługuje wiele strategii uwierzytelniania od razu po wyjęciu z pudełka:
- Lokalna autoryzacja za pomocą poczty e-mail
- Zaloguj się za pomocą Apple
- Uwierzytelnianie GitHub
- Uwierzytelnianie Google
- Uwierzytelnianie za pomocą jednorazowego hasła (OTP)
Pakiet jest wysoce konfigurowalny, co pozwala deweloperom dostosowywać nazwy pól i frazy do wymagań aplikacji. Został zaprojektowany tak, aby bezproblemowo integrować się z Mongoose w celu zarządzania użytkownikami, co czyni go idealnym rozwiązaniem dla aplikacji opartych na Koa, które wymagają solidnego uwierzytelniania.
graceful: Eleganckie zamykanie aplikacji
@ladjs/graceful
rozwiązuje krytyczne wyzwanie łagodnego zamykania aplikacji Node.js. Ten pakiet z ponad 70 gwiazdkami GitHub zapewnia, że Twoja aplikacja może zakończyć się czysto, bez utraty danych lub zawieszania połączeń. Kluczowe funkcje obejmują:
- Obsługa łagodnego zamykania serwerów HTTP (Express/Koa/Fastify)
- Czyste zamknięcie połączeń z bazą danych (MongoDB/Mongoose)
- Prawidłowe zamykanie klientów Redis
- Obsługa harmonogramów zadań Bree
- Obsługa niestandardowych programów obsługi zamykania
- Konfigurowalne ustawienia limitu czasu
- Integracja z systemami rejestrowania
Ten pakiet jest niezbędny dla aplikacji produkcyjnych, w których nieoczekiwane wyłączenia mogą prowadzić do utraty lub uszkodzenia danych. Poprzez wdrożenie odpowiednich procedur wyłączania, @ladjs/graceful
pomaga zapewnić niezawodność i stabilność Twojej aplikacji.
Upptime: Monitorowanie czasu pracy oprogramowania Open Source
Ten Organizacja czasu sprawności reprezentuje nasze zaangażowanie w transparentne, otwarte monitorowanie. Główne upptime
repozytorium ma ponad 13 000 gwiazdek GitHub, co czyni je jednym z najpopularniejszych projektów, do których się przyczyniamy. Upptime zapewnia monitor czasu pracy zasilany przez GitHub i stronę statusu, która działa całkowicie bez serwera.
Używamy Upptime do naszej własnej strony statusu https://status.forwardemail.net z kodem źródłowym dostępnym pod adresem https://github.com/forwardemail/status.forwardemail.net.
Cechą wyróżniającą Upptime jest jego architektura:
- 100% Open Source:Każdy komponent jest w pełni otwarty i konfigurowalny.
- Obsługiwane przez GitHub:Wykorzystuje działania, problemy i strony GitHub do tworzenia rozwiązania do monitorowania bezserwerowego.
- Serwer nie jest wymagany:W przeciwieństwie do tradycyjnych narzędzi monitorujących, Upptime nie wymaga uruchamiania ani konserwacji serwera.
- Automatyczna strona statusu:Generuje piękną stronę statusu, którą można umieścić na stronach GitHub.
- Potężne powiadomienia:Integracja z różnymi kanałami powiadomień, w tym pocztą e-mail, SMS-ami i Slackiem.
Aby ulepszyć doświadczenia naszych użytkowników, zintegrowaliśmy @octokit/core do bazy kodu forwardemail.net, aby renderować aktualizacje statusu w czasie rzeczywistym i incydenty bezpośrednio na naszej stronie internetowej. Ta integracja zapewnia przejrzystość dla naszych użytkowników w przypadku jakichkolwiek problemów w całym naszym stosie (Strona internetowa, API, MongoDB, Redis, SQLite, SMTP, POP3, IMAP, Bree itp.) z natychmiastowymi powiadomieniami typu toast, zmianami ikon odznak, kolorami ostrzegawczymi i nie tylko.
Biblioteka @octokit/core pozwala nam pobierać dane w czasie rzeczywistym z naszego repozytorium Upptime GitHub, przetwarzać je i wyświetlać w sposób przyjazny dla użytkownika. Gdy jakakolwiek usługa ma przerwę lub obniżoną wydajność, użytkownicy są natychmiast powiadamiani za pomocą wskaźników wizualnych bez konieczności opuszczania głównej aplikacji. Ta płynna integracja zapewnia, że nasi użytkownicy zawsze mają aktualne informacje o stanie naszego systemu, zwiększając przejrzystość i zaufanie.
Upptime zostało przyjęte przez setki organizacji poszukujących przejrzystego, niezawodnego sposobu monitorowania swoich usług i komunikowania statusu użytkownikom. Sukces projektu pokazuje siłę budowania narzędzi, które wykorzystują istniejącą infrastrukturę (w tym przypadku GitHub), aby rozwiązywać typowe problemy na nowe sposoby.
Nasz wkład w ekosystem poczty e-mail Forward
Chociaż nasze pakiety open source są używane przez deweloperów na całym świecie, stanowią one również podstawę naszej własnej usługi Forward Email. Ta podwójna rola — zarówno twórców, jak i użytkowników tych narzędzi — daje nam unikalną perspektywę ich rzeczywistego zastosowania i napędza ciągłe doskonalenie.
Od opakowań do produkcji
Podróż od pojedynczych pakietów do spójnego systemu produkcyjnego wymaga starannej integracji i rozszerzenia. W przypadku Forward Email proces ten obejmuje:
- Rozszerzenia niestandardowe:Budowanie rozszerzeń naszych pakietów open source dotyczących poczty e-mail, które spełniają nasze wyjątkowe wymagania.
- Wzorce integracji:Opracowanie wzorców interakcji tych pakietów w środowisku produkcyjnym.
- Optymalizacje wydajności:Identyfikacja i usuwanie wąskich gardeł wydajnościowych, które ujawniają się dopiero w dużej skali.
- Wzmocnienie bezpieczeństwa:Dodawanie dodatkowych warstw zabezpieczeń związanych z obsługą poczty e-mail i ochroną danych użytkowników.
Praca ta to tysiące godzin pracy nad rozwojem wykraczającym poza same podstawowe pakiety. Rezultatem jest niezawodna i bezpieczna usługa poczty e-mail wykorzystująca najlepsze elementy naszych rozwiązań typu open source.
Pętla sprzężenia zwrotnego
Być może najcenniejszym aspektem korzystania z naszych własnych pakietów w produkcji jest pętla sprzężenia zwrotnego, którą ona tworzy. Gdy napotykamy ograniczenia lub skrajne przypadki w Forward Email, nie tylko je łatamy lokalnie — ulepszamy podstawowe pakiety, co przynosi korzyści zarówno naszej usłudze, jak i szerszej społeczności.
Takie podejście doprowadziło do licznych udoskonaleń:
- Łaskawe zakończenie Bree:Konieczność wdrożenia rozwiązania Forward Email bez przestojów doprowadziła do udoskonalenia funkcji łagodnego zamykania systemu w Bree.
- Rozpoznawanie wzorców przez skaner spamu: Algorytmy wykrywania spamu przez Spam Scannera zostały poinformowane o rzeczywistych wzorcach spamu napotkanych w wiadomościach e-mail przekazywanych dalej.
- Optymalizacja wydajności kabiny:Duża liczba rejestrowanych danych w środowisku produkcyjnym ujawniła możliwości optymalizacji w Cabin, z których korzystają wszyscy użytkownicy.
Dzięki pielęgnowaniu tego pozytywnego cyklu między naszą pracą w modelu open source a usługą produkcyjną mamy pewność, że nasze pakiety pozostają praktycznymi, sprawdzonymi w boju rozwiązaniami, a nie teoretycznymi implementacjami.
Podstawowe zasady Forward Email: Podstawa doskonałości
Forward Email jest zaprojektowany zgodnie z zestawem podstawowych zasad, którymi kierują się wszystkie nasze decyzje dotyczące rozwoju. Zasady te, szczegółowo opisane na naszej stronie strona internetowa, dbamy o to, aby nasza usługa była przyjazna dla deweloperów, bezpieczna i dbała o prywatność użytkowników.
Zawsze przyjazne dla programistów, skoncentrowane na bezpieczeństwie i przejrzyste
Naszą pierwszą i najważniejszą zasadą jest tworzenie oprogramowania przyjaznego dla deweloperów, przy jednoczesnym zachowaniu najwyższych standardów bezpieczeństwa i prywatności. Wierzymy, że doskonałość techniczna nigdy nie powinna odbywać się kosztem użyteczności, a przejrzystość buduje zaufanie w naszej społeczności.
Zasada ta przejawia się w naszej szczegółowej dokumentacji, jasnych komunikatach o błędach i otwartej komunikacji zarówno o sukcesach, jak i wyzwaniach. Udostępniając cały nasz kod źródłowy jako open source, zachęcamy do kontroli i współpracy, wzmacniając zarówno nasze oprogramowanie, jak i szerszy ekosystem.
Przestrzeganie sprawdzonych zasad tworzenia oprogramowania
Kierujemy się kilkoma sprawdzonymi zasadami tworzenia oprogramowania, których wartość została potwierdzona przez dziesięciolecia:
- MVC:Rozdzielenie obaw poprzez wzorzec Model-Widok-Kontroler
- Filozofia Uniksa:Tworzenie modułowych komponentów, które dobrze wykonują jedną czynność
- KISS:Prostota i przejrzystość
- DRY:Nie powtarzaj się, promując ponowne wykorzystanie kodu
- YAGNI: Nie będziesz tego potrzebować, unikając przedwczesnej optymalizacji
- Dwanaście czynników:Postępowanie zgodnie z najlepszymi praktykami tworzenia nowoczesnych, skalowalnych aplikacji
- Brzytwa Ockhama:Wybór najprostszego rozwiązania spełniającego wymagania
- Testowanie psów:Szeroko wykorzystujemy własne produkty
Te zasady nie są tylko teoretycznymi koncepcjami — są osadzone w naszych codziennych praktykach programistycznych. Na przykład nasze przywiązanie do filozofii Unix jest widoczne w sposobie, w jaki ustrukturyzowaliśmy nasze pakiety npm: małe, skoncentrowane moduły, które można ze sobą łączyć, aby rozwiązywać złożone problemy.
Celowanie w Scrappy, Bootstrapped Developera
Skupiamy się szczególnie na osobach ambitnych, początkujących i ramen-dochodowy developer. Ta koncentracja kształtuje wszystko, od naszego modelu cenowego po nasze decyzje techniczne. Rozumiemy wyzwania związane z tworzeniem produktów przy ograniczonych zasobach, ponieważ sami tam byliśmy.
Ta zasada jest szczególnie ważna w naszym podejściu do open source. Tworzymy i utrzymujemy pakiety, które rozwiązują rzeczywiste problemy programistów bez budżetów korporacyjnych, udostępniając potężne narzędzia każdemu, niezależnie od zasobów.
Zasady w praktyce: baza kodów Forward Email
Zasady te są wyraźnie widoczne w bazie kodu Forward Email. Nasz plik package.json ujawnia przemyślany wybór zależności, z których każda została wybrana tak, aby odpowiadała naszym podstawowym wartościom:
- Pakiety skoncentrowane na bezpieczeństwie, takie jak
mailauth
do uwierzytelniania poczty e-mail - Przyjazne dla programistów narzędzia, takie jak
preview-email
dla łatwiejszego debugowania - Komponenty modułowe, takie jak różne
p-*
narzędzia od Sindre Sorhus
Dzięki konsekwentnemu przestrzeganiu tych zasad udało nam się stworzyć usługę, której programiści mogą zaufać w kwestii infrastruktury poczty e-mail — jest ona bezpieczna, niezawodna i zgodna z wartościami społeczności open source.
Prywatność w fazie projektowania
Prywatność nie jest kwestią drugorzędną ani cechą marketingową usługi Forward Email — to podstawowa zasada projektowania, która wpływa na każdy aspekt naszej usługi i kodu:
- Szyfrowanie z zerowym dostępem:Wdrożyliśmy systemy, które technicznie uniemożliwiają nam odczytywanie wiadomości e-mail użytkowników.
- Minimalne gromadzenie danych:Gromadzimy wyłącznie dane niezbędne do świadczenia naszych usług i nic więcej.
- Przejrzyste zasady:Nasza polityka prywatności została napisana jasnym, zrozumiałym językiem, bez prawniczego żargonu.
- Weryfikacja Open Source:Nasza baza kodu źródłowego o otwartym kodzie źródłowym pozwala badaczom ds. bezpieczeństwa weryfikować nasze oświadczenia dotyczące prywatności.
To zobowiązanie dotyczy również naszych pakietów open source, które od podstaw projektujemy z uwzględnieniem najlepszych praktyk bezpieczeństwa i prywatności.
Zrównoważony Open Source
Wierzymy, że oprogramowanie open source potrzebuje zrównoważonych modeli, aby rozwijać się długoterminowo. Nasze podejście obejmuje:
- Wsparcie komercyjne:Oferujemy najwyższej jakości wsparcie i usługi związane z naszymi narzędziami typu open source.
- Zrównoważone licencjonowanie:Korzystanie z licencji, które chronią zarówno wolności użytkowników, jak i trwałość projektu.
- Zaangażowanie społeczności:Aktywna współpraca z współpracownikami w celu zbudowania wspierającej społeczności.
- Przejrzyste mapy drogowe:Udostępniamy nasze plany rozwoju, aby umożliwić użytkownikom odpowiednie planowanie.
Koncentrując się na zrównoważonym rozwoju, dbamy o to, aby nasze projekty typu open source mogły się z czasem rozwijać i udoskonalać, zamiast popadać w zaniedbanie.
Liczby nie kłamią: nasze oszałamiające statystyki pobierania npm
Kiedy mówimy o wpływie oprogramowania open source, statystyki pobierania dostarczają namacalnego pomiaru adopcji i zaufania. Wiele pakietów, które pomagamy utrzymywać, osiągnęło skalę, jaką osiąga niewiele projektów open source, a łączna liczba pobrań wynosi miliardy.
[!WAŻNE] Chociaż jesteśmy dumni, że możemy pomóc w utrzymaniu wielu często pobieranych pakietów w ekosystemie JavaScript, chcemy przyznać, że wiele z tych pakietów zostało pierwotnie stworzonych przez innych utalentowanych programistów. Pakiety takie jak superagent i supertest zostały pierwotnie stworzone przez TJ Holowaychuka, którego znaczący wkład w open source odegrał kluczową rolę w kształtowaniu ekosystemu Node.js.
Nasz wpływ z lotu ptaka
Tylko w ciągu dwóch miesięcy od lutego do marca 2025 r. nasze najlepsze pakiety, do których się przyczyniamy i które pomagają utrzymać, osiągnęły imponujące liczby pobrań:
- superagent: 84 575 829 pobrań[^7] (oryginalnie stworzone przez TJ Holowaychuk)
- super test: 76 432 591 pobrań[^8] (oryginalnie stworzone przez TJ Holowaychuk)
- Również: 28 539 295 pobrań[^34] (oryginalnie stworzone przez TJ Holowaychuk)
- @koa/router: 11 007 327 pobrań[^35]
- router koa: 3 498 918 pobrań[^36]
- wyrażenie regularne url: 2 819 520 pobrań[^37]
- podgląd-e-maila: 2 500 000 pobrań[^9]
- kabina: 1 800 000 pobrań[^10]
- @breejs/później: 1 709 938 pobrań[^38]
- Szablony wiadomości: 1 128 139 pobrań[^39]
- ścieżki pobierania: 1 124 686 pobrań[^40]
- bezpieczny dla wyrażeń regularnych url: 1 200 000 pobrań[^11]
- dotenv-parse-zmienne: 894 666 pobrań[^41]
- @koa/multer: 839 585 pobrań[^42]
- skaner spamu: 145 000 pobrań[^12]
- wiatr: 24 270 pobrań[^30]
[!UWAGA] Kilka innych pakietów, które pomagamy utrzymywać, ale których nie stworzyliśmy, ma jeszcze większą liczbę pobrań, w tym
form-data
(ponad 738 mln pobrań),toidentifier
(ponad 309 mln pobrań),stackframe
(ponad 116 mln pobrań) ierror-stack-parser
(113 mln pobrań). Jesteśmy zaszczyceni, że możemy przyczynić się do tych pakietów, szanując jednocześnie pracę ich oryginalnych autorów.
To nie są tylko imponujące liczby — to prawdziwe liczby przedstawiające prawdziwych programistów rozwiązujących prawdziwe problemy za pomocą kodu, który pomagamy utrzymywać. Każde pobranie to przypadek, w którym te pakiety pomogły komuś zbudować coś znaczącego, od projektów hobbystycznych po aplikacje korporacyjne używane przez miliony.
Codzienny wpływ na skalę
Codzienne wzorce pobierania ujawniają stałe, wysokie wykorzystanie, ze szczytami sięgającymi milionów pobrań dziennie[^13]. Ta spójność świadczy o stabilności i niezawodności tych pakietów — programiści nie tylko je wypróbowują; integrują je ze swoimi podstawowymi przepływami pracy i polegają na nich dzień po dniu.
Tygodniowe wzorce pobierania pokazują jeszcze bardziej imponujące liczby, stale oscylując wokół dziesiątek milionów pobrań tygodniowo[^14]. Stanowi to ogromny ślad w ekosystemie JavaScript, a te pakiety działają w środowiskach produkcyjnych na całym świecie.
Poza surowymi liczbami
Choć statystyki pobierania same w sobie są imponujące, opowiadają głębszą historię o zaufaniu, jakim społeczność darzy te pakiety. Utrzymywanie pakietów na taką skalę wymaga niezachwianego zaangażowania w:
- Wsteczna kompatybilnośćZmiany muszą być starannie przemyślane, aby nie naruszyć istniejących rozwiązań.
- Bezpieczeństwo:Biorąc pod uwagę, że od tych pakietów zależą miliony aplikacji, luki w zabezpieczeniach mogą mieć daleko idące konsekwencje.
- Wydajność:W tej skali nawet niewielkie usprawnienia wydajności mogą przynieść znaczące korzyści łączne.
- Dokumentacja:Przejrzysta, wyczerpująca dokumentacja jest niezbędna w przypadku pakietów używanych przez programistów na każdym poziomie doświadczenia.
Stały wzrost liczby pobrań na przestrzeni lat odzwierciedla sukces w dotrzymywaniu tych zobowiązań i budowaniu zaufania wśród społeczności programistów poprzez niezawodne, dobrze utrzymywane pakiety.
Wspieranie ekosystemu: nasze sponsorowanie oprogramowania typu open source
[!TIP] Zrównoważony rozwój oprogramowania typu open source nie polega tylko na dostarczaniu kodu — chodzi również o wspieranie programistów, którzy utrzymują krytyczną infrastrukturę.
Oprócz naszego bezpośredniego wkładu w ekosystem JavaScript, jesteśmy dumni, że możemy sponsorować wybitnych współpracowników Node.js, których praca stanowi podstawę wielu nowoczesnych aplikacji. Nasze sponsoringi obejmują:
Andris Reinman: Pionier infrastruktury poczty e-mail
Andris Reinman jest twórcą Nodemailer, najpopularniejsza biblioteka do wysyłania wiadomości e-mail dla Node.js z ponad 14 milionami pobrań tygodniowo[^15]. Jego praca obejmuje również inne krytyczne komponenty infrastruktury poczty e-mail, takie jak Serwer SMTP, Parser poczty, oraz Dzika kaczka.
Nasze wsparcie finansowe pozwala nam zapewnić ciągłą konserwację i rozwój tych niezbędnych narzędzi, które wspomagają komunikację e-mailową w niezliczonych aplikacjach Node.js, w tym w naszej własnej usłudze Forward Email.
Sindre Sorhus: Twórca pakietu narzędziowego
Sindre Sorhus jest jednym z najbardziej produktywnych twórców oprogramowania open source w ekosystemie JavaScript, ma na swoim koncie ponad 1000 pakietów npm. Jego narzędzia, takie jak p-map, p-ponów, oraz jest-strumieniem są podstawowymi blokami konstrukcyjnymi używanymi w całym ekosystemie Node.js.
Sponsorując pracę Sindre, przyczyniamy się do utrzymania rozwoju tych ważnych narzędzi, które sprawiają, że tworzenie kodu JavaScript jest bardziej wydajne i niezawodne.
Te sponsorowania odzwierciedlają nasze zaangażowanie w szerszy ekosystem open source. Zdajemy sobie sprawę, że nasz własny sukces opiera się na fundamencie położonym przez tych i innych współpracowników, i jesteśmy oddani zapewnieniu trwałości całego ekosystemu.
Odkrywanie luk w zabezpieczeniach ekosystemu JavaScript
Nasze zaangażowanie w open source wykracza poza rozwój funkcji, obejmując identyfikację i usuwanie luk w zabezpieczeniach, które mogą mieć wpływ na miliony programistów. Kilka z naszych najważniejszych wkładów w ekosystem JavaScript dotyczyło kwestii bezpieczeństwa.
Ratunek Koa-Router
W lutym 2019 r. Nick zidentyfikował krytyczny problem związany z konserwacją popularnego pakietu koa-router. Jak powiedział poinformowano w Hacker News, pakiet został porzucony przez swojego pierwotnego opiekuna, w wyniku czego luki w zabezpieczeniach nie zostały naprawione, a społeczność nie otrzymała aktualizacji.
[!WARNING] Porzucone pakiety z lukami w zabezpieczeniach stanowią poważne ryzyko dla całego ekosystemu, zwłaszcza gdy są pobierane miliony razy w tygodniu.
W odpowiedzi Nick stworzył @koa/router i pomógł powiadomić społeczność o sytuacji. Od tamtej pory utrzymuje ten krytyczny pakiet, zapewniając użytkownikom Koa bezpieczne, dobrze utrzymane rozwiązanie do routingu.
Rozwiązywanie problemów z lukami w zabezpieczeniach ReDoS
W 2020 roku Nick zidentyfikował i zajął się krytycznym problemem Atak typu „odmowa usługi” za pomocą wyrażeń regularnych (ReDoS) podatność na powszechnie stosowane url-regex
pakiet. Ta podatność (SNYK-JS-URLREGEX-569472) może umożliwić atakującym spowodowanie odmowy usługi poprzez dostarczenie specjalnie spreparowanych danych wejściowych, które powodują katastrofalne cofanie się w wyrażeniu regularnym.
Zamiast po prostu załatać istniejący pakiet, Nick stworzył url-regex-safe
, całkowicie przepisaną implementację, która rozwiązuje problem podatności, zachowując jednocześnie zgodność z oryginalnym API. Opublikował również kompleksowy wpis na blogu wyjaśniając istotę podatności i sposoby jej minimalizacji.
Niniejsza praca przedstawia nasze podejście do kwestii bezpieczeństwa: nie tylko rozwiązywanie problemów, ale także edukowanie społeczności i oferowanie solidnych alternatyw, które zapobiegną podobnym problemom w przyszłości.
Wspieranie bezpieczeństwa Node.js i Chromium
Nick aktywnie działał również na rzecz poprawy bezpieczeństwa w szerszym ekosystemie. W sierpniu 2020 r. zidentyfikował istotny problem bezpieczeństwa w Node.js związany z obsługą nagłówków HTTP, o którym zgłoszono w Rejestr.
Ten problem, który wynikał z poprawki w Chromium, potencjalnie mógł pozwolić atakującym na ominięcie środków bezpieczeństwa. Orędownictwo Nicka pomogło zapewnić, że problem został rozwiązany szybko, chroniąc miliony aplikacji Node.js przed potencjalnym wykorzystaniem.
Zabezpieczanie infrastruktury npm
Później tego samego miesiąca Nick zidentyfikował kolejny krytyczny problem bezpieczeństwa, tym razem w infrastrukturze poczty e-mail npm. Jak doniesiono w Rejestrnpm nieprawidłowo implementował protokoły uwierzytelniania poczty e-mail DMARC, SPF i DKIM, co potencjalnie umożliwiało atakującym wysyłanie wiadomości phishingowych, które wyglądały na pochodzące z npm.
Raport Nicka doprowadził do udoskonalenia zabezpieczeń poczty e-mail w npm, chroniąc miliony programistów, którzy polegają na npm w zakresie zarządzania pakietami, przed potencjalnymi atakami phishingowymi.
Nasz wkład w ekosystem poczty e-mail Forward
Forward Email jest zbudowany na kilku ważnych projektach open source, w tym Nodemailer, WildDuck i mailauth. Nasz zespół wniósł znaczący wkład w te projekty, pomagając identyfikować i naprawiać głębokie problemy, które wpływają na dostarczanie wiadomości e-mail i bezpieczeństwo.
Ulepszanie podstawowej funkcjonalności Nodemailer
Nodemailer stanowi podstawę wysyłania wiadomości e-mail w Node.js, a nasz wkład pomógł uczynić go bardziej niezawodnym:
- Ulepszenia serwera SMTP:Naprawiliśmy błędy parsowania, problemy z obsługą strumieni i problemy z konfiguracją TLS w komponencie serwera SMTP[^16][^17].
- Ulepszenia parsera poczty:Rozwiązaliśmy problemy z dekodowaniem sekwencji znaków i rozwiązaliśmy problemy z parserem, które mogły powodować błędy przetwarzania wiadomości e-mail[^18][^19].
Dzięki temu wkładowi Nodemailer pozostaje niezawodną podstawą do przetwarzania wiadomości e-mail w aplikacjach Node.js, w tym Forward Email.
Udoskonalanie uwierzytelniania poczty e-mail za pomocą Mailauth
Poczta zapewnia krytyczną funkcjonalność uwierzytelniania poczty e-mail, a nasz wkład znacząco poprawił jej możliwości:
- Ulepszenia weryfikacji DKIM:Odkryliśmy i zgłosiliśmy, że X/Twitter ma problemy z pamięcią podręczną DNS, co powoduje błąd DKIM w przypadku wiadomości wychodzących, informując o tym na Hacker One[^20].
- Ulepszenia DMARC i ARC:Naprawiliśmy problemy z weryfikacją DMARC i ARC, które mogły prowadzić do nieprawidłowych wyników uwierzytelniania[^21][^22].
- Optymalizacje wydajności:Wprowadziliśmy optymalizacje, które poprawiają wydajność procesów uwierzytelniania poczty e-mail[^23][^24][^25][^26].
Dzięki tym usprawnieniom uwierzytelnianie poczty e-mail jest dokładne i niezawodne, co chroni użytkowników przed atakami typu phishing i spoofing.
Kluczowe ulepszenia czasu sprawności
Nasz wkład w Upptime obejmuje:
- Monitorowanie certyfikatu SSL:Dodaliśmy funkcjonalność monitorowania wygasania certyfikatu SSL, zapobiegając nieoczekiwanym przestojom spowodowanym wygaśnięciem certyfikatu[^27].
- Obsługa wielu numerów SMS:Wprowadziliśmy obsługę powiadamiania wielu członków zespołu za pośrednictwem wiadomości SMS w przypadku wystąpienia incydentów, co skróciło czas reakcji[^28].
- Poprawki sprawdzania IPv6:Rozwiązaliśmy problemy ze sprawdzaniem łączności IPv6, zapewniając dokładniejszy monitoring w nowoczesnych środowiskach sieciowych[^29].
- Obsługa trybu ciemnego/jasnego:Dodaliśmy obsługę motywów w celu poprawy wrażeń użytkownika na stronach statusu[^31].
- Lepsze wsparcie TCP-Ping:Ulepszyliśmy funkcjonalność pingowania TCP, aby zapewnić bardziej niezawodne testowanie połączenia[^32].
Udoskonalenia te nie tylko przynoszą korzyści w zakresie monitorowania statusu usługi Forward Email, ale są dostępne dla całej społeczności użytkowników Upptime, co pokazuje nasze zaangażowanie w udoskonalanie narzędzi, od których jesteśmy zależni.
Spoiwo, które trzyma wszystko w całości: niestandardowy kod na dużą skalę
Chociaż nasze pakiety npm i wkład w istniejące projekty są znaczące, to niestandardowy kod, który integruje te komponenty, naprawdę pokazuje naszą wiedzę techniczną. Baza kodu Forward Email reprezentuje dekadę wysiłków rozwojowych, sięgającą 2017 r., kiedy projekt rozpoczął się jako bezpłatne przekazywanie poczty elektronicznej przed scaleniem w monorepozytorium.
Ogromny wysiłek rozwojowy
Skala tego niestandardowego kodu integracyjnego jest imponująca:
- Łączne składki:Ponad 3217 zatwierdzeń
- Rozmiar bazy kodu:Ponad 421 545 wierszy kodu w plikach JavaScript, Pug, CSS i JSON[^33]
To tysiące godzin pracy rozwojowej, sesji debugowania i optymalizacji wydajności. To „tajny sos”, który przekształca poszczególne pakiety w spójną, niezawodną usługę, z której codziennie korzystają tysiące klientów.
Integracja podstawowych zależności
Baza kodów Forward Email integruje liczne zależności w jedną, spójną całość:
- Przetwarzanie poczty elektronicznej:Integruje Nodemailer do wysyłania, serwer SMTP do odbierania i Mailparser do analizowania
- Poświadczenie:Używa Mailauth do weryfikacji DKIM, SPF, DMARC i ARC
- Rozdzielczość DNS:Wykorzystuje Tangerine do DNS-over-HTTPS z globalnym buforowaniem
- Połączenie MX:Wykorzystuje integrację mx-connect z Tangerine w celu zapewnienia niezawodnych połączeń z serwerem pocztowym
- Harmonogramowanie zadań:Zatrudnia Bree do niezawodnego przetwarzania zadań w tle za pomocą wątków roboczych
- Szablonowanie:Wykorzystuje szablony wiadomości e-mail do ponownego wykorzystania arkuszy stylów ze strony internetowej w komunikacji z klientami
- Przechowywanie poczty e-mail:Implementuje indywidualnie szyfrowane skrzynki pocztowe SQLite przy użyciu lepszych szyfrów sqlite3-multiple-ciphers z szyfrowaniem ChaCha20-Poly1305, zapewniając prywatność bezpieczną na poziomie kwantowym, gwarantując całkowitą izolację użytkowników i to, że tylko użytkownik ma dostęp do swojej skrzynki pocztowej
Każda z tych integracji wymaga starannego rozważenia przypadków skrajnych, implikacji wydajnościowych i kwestii bezpieczeństwa. Rezultatem jest solidny system, który niezawodnie obsługuje miliony transakcji e-mail. Nasza implementacja SQLite wykorzystuje również msgpackr do wydajnej serializacji binarnej i WebSockets (za pośrednictwem ws) do aktualizacji statusu w czasie rzeczywistym w całej naszej infrastrukturze.
Infrastruktura DNS z Tangerine i mx-connect
Kluczowym elementem infrastruktury Forward Email jest nasz system rozpoznawania nazw domen (DNS), zbudowany wokół dwóch kluczowych pakietów:
-
Mandarynka:Nasza implementacja Node.js DNS-over-HTTPS stanowi natychmiastowe zastąpienie standardowego resolvera DNS, z wbudowanymi ponawianiem prób, limitami czasu, inteligentną rotacją serwerów i obsługą buforowania.
-
połączenie mx:Ten pakiet nawiązuje połączenia TCP z serwerami MX, przyjmując domenę docelową lub adres e-mail, rozwiązując odpowiednie serwery MX i łącząc się z nimi w kolejności priorytetowej.
Zintegrowaliśmy Tangerine z mx-connect za pośrednictwem żądanie ściągnięcia nr 4, zapewniając DNS warstwy aplikacji przez żądania HTTP w całym Forward Email. Zapewnia to globalne buforowanie dla DNS na skalę ze spójnością 1:1 w dowolnym regionie, aplikacji lub procesie — co jest krytyczne dla niezawodnego dostarczania wiadomości e-mail w rozproszonym systemie.
Wpływ na przedsiębiorstwo: od rozwiązań Open Source do rozwiązań o znaczeniu krytycznym
Ukoronowaniem naszej dziesięcioletniej przygody z tworzeniem oprogramowania typu open source było umożliwienie firmie Forward Email obsługi nie tylko indywidualnych programistów, ale także dużych przedsiębiorstw i placówek edukacyjnych, które stanowią trzon samego ruchu open source.
Studia przypadków dotyczące infrastruktury poczty e-mail o znaczeniu krytycznym
Nasze zaangażowanie na rzecz niezawodności, prywatności i zasad otwartego oprogramowania sprawiło, że Forward Email stał się zaufanym wyborem dla organizacji o wysokich wymaganiach dotyczących poczty e-mail:
-
Placówki edukacyjne:Jak szczegółowo opisano w naszym studium przypadku przekazywania poczty elektronicznej absolwentów, duże uniwersytety polegają na naszej infrastrukturze, aby utrzymywać długotrwałe kontakty z setkami tysięcy absolwentów za pośrednictwem niezawodnych usług przekazywania poczty elektronicznej.
-
Rozwiązania Enterprise Linux:Ten Canonical Ubuntu email enterprise case study pokazuje, w jaki sposób nasze podejście oparte na otwartym kodzie źródłowym doskonale wpisuje się w potrzeby korporacyjnych dostawców systemu Linux, oferując im niezbędną przejrzystość i kontrolę.
-
Fundacje Open Source:Być może najbardziej potwierdzające jest nasze partnerstwo z Fundacją Linux, udokumentowane w Studium przypadku przedsiębiorstwa poczty e-mail Linux Foundation, gdzie nasza usługa umożliwia komunikację organizacji, która nadzoruje rozwój Linuksa.
Istnieje piękna symetria w tym, jak nasze pakiety open source, starannie utrzymywane przez wiele lat, pozwoliły nam zbudować usługę poczty e-mail, która obecnie obsługuje te same społeczności i organizacje, które promują oprogramowanie open source. Ta pełna podróż w kółko — od dostarczania indywidualnych pakietów do zasilania infrastruktury poczty e-mail klasy korporacyjnej dla liderów open source — stanowi ostateczne potwierdzenie naszego podejścia do rozwoju oprogramowania.
Dekada Open Source: Spojrzenie w przyszłość
Gdy spoglądamy wstecz na dekadę naszych działań w ramach open source i myślimy o kolejnych dziesięciu latach, jesteśmy pełni wdzięczności dla społeczności, która wspierała naszą pracę, i podekscytowani tym, co przyniesie przyszłość.
Nasza podróż od indywidualnych współpracowników pakietów do opiekunów kompleksowej infrastruktury poczty e-mail używanej przez duże przedsiębiorstwa i fundacje open source była niezwykła. To dowód mocy rozwoju open source i wpływu, jaki przemyślane, dobrze utrzymane oprogramowanie może mieć na szerszy ekosystem.
W nadchodzących latach zobowiązujemy się do:
- Kontynuujemy utrzymanie i ulepszanie naszych istniejących pakietów, co zapewnia, że pozostają one niezawodnymi narzędziami dla programistów na całym świecie.
- Rozszerzamy nasze zaangażowanie w projekty infrastruktury krytycznej, szczególnie w zakresie poczty elektronicznej i bezpieczeństwa.
- Ulepszanie możliwości funkcji Forward Email jednocześnie dbając o zachowanie prywatności, bezpieczeństwa i przejrzystości.
- Wspieranie nowego pokolenia współpracowników zajmujących się oprogramowaniem typu open source poprzez mentoring, sponsoring i zaangażowanie społeczności.
Wierzymy, że przyszłość rozwoju oprogramowania jest otwarta, oparta na współpracy i oparta na zaufaniu. Kontynuując dostarczanie wysokiej jakości pakietów skoncentrowanych na bezpieczeństwie do ekosystemu JavaScript, mamy nadzieję odegrać niewielką rolę w budowaniu tej przyszłości.
Dziękujemy wszystkim, którzy korzystali z naszych pakietów, przyczynili się do naszych projektów, zgłaszali problemy lub po prostu rozpowszechniali informacje o naszej pracy. Twoje wsparcie umożliwiło tę dekadę wpływu i jesteśmy podekscytowani, widząc, co możemy wspólnie osiągnąć w ciągu następnych dziesięciu lat.
[^1]: statystyki pobierania npm dla cabin, kwiecień 2025 [^2]: statystyki pobierania npm dla bson-objectid, luty-marzec 2025 [^3]: statystyki pobierania npm dla url-regex-safe, kwiecień 2025 [^4]: liczba gwiazdek GitHub dla forwardemail/forwardemail.net w kwietniu 2025 [^5]: statystyki pobierania npm dla preview-email, kwiecień 2025 [^7]: statystyki pobierania npm dla superagent, luty-marzec 2025 [^8]: statystyki pobierania npm dla supertest, luty-marzec 2025 [^9]: statystyki pobierania npm dla preview-email, luty-marzec 2025 [^10]: statystyki pobierania npm dla cabin, luty-marzec 2025 [^11]: statystyki pobierania npm dla url-regex-safe, Luty-marzec 2025 [^12]: statystyki pobierania npm dla spamscanner, luty-marzec 2025 [^13]: codzienne wzorce pobierania ze statystyk npm, kwiecień 2025 [^14]: tygodniowe wzorce pobierania ze statystyk npm, kwiecień 2025 [^15]: statystyki pobierania npm dla nodemailer, kwiecień 2025 [^16]: https://github.com/nodemailer/smtp-server/issues/155 [^17]: https://github.com/nodemailer/smtp-server/issues/node-v12-requires-tls-min [^18]: https://github.com/nodemailer/mailparser/issues/261 [^19]: https://github.com/nodemailer/nodemailer/issues/1102 [^20]: https://github.com/postalsys/mailauth/issues/30 [^21]: https://github.com/postalsys/mailauth/issues/58 [^22]: https://github.com/postalsys/mailauth/issues/48 [^23]: https://github.com/postalsys/mailauth/issues/74 [^24]: https://github.com/postalsys/mailauth/issues/75 [^25]: https://github.com/postalsys/mailauth/issues/60 [^26]: https://github.com/postalsys/mailauth/issues/73 [^27]: Na podstawie problemów z GitHub w repozytorium Upptime [^28]: Na podstawie problemów z GitHub w repozytorium Upptime [^29]: Na podstawie problemów z GitHub w repozytorium Upptime [^30]: Statystyki pobierania npm dla bree, luty-marzec 2025 [^31]: Na podstawie żądań ściągnięcia z GitHub do Upptime [^32]: Na podstawie żądań ściągnięcia z GitHub do Upptime [^34]: Statystyki pobierania npm dla koa, luty-marzec 2025 [^35]: Statystyki pobierania npm dla @koa/router, luty-marzec 2025 [^36]: Statystyki pobierania npm dla koa-router, luty-marzec 2025 [^37]: Statystyki pobierania npm dla url-regex, luty-marzec 2025 [^38]: Statystyki pobierania npm dla @breejs/later, luty-marzec 2025 [^39]: statystyki pobierania npm dla szablonów e-mail, luty-marzec 2025 [^40]: statystyki pobierania npm dla ścieżek pobierania, luty-marzec 2025 [^41]: statystyki pobierania npm dla zmiennych parsowania dotenv, luty-marzec 2025 [^42]: statystyki pobierania npm dla @koa/multer, luty-marzec 2025