diff --git a/components/ApplyButton.tsx b/components/ApplyButton.tsx new file mode 100644 index 000000000..e78a30970 --- /dev/null +++ b/components/ApplyButton.tsx @@ -0,0 +1,57 @@ +import CustomLink from './Link' + +const APPLY_PATHS = { + grant: '/apply/grant', + lts: '/apply/lts', +} as const + +type ApplyTrack = keyof typeof APPLY_PATHS + +type ApplyButtonProps = { + prelude?: string + cta?: string + preTagline?: string + tagline?: string + track?: ApplyTrack + href?: string +} + +export default function ApplyButton({ + prelude = 'Click here to', + cta = '>_ apply', + preTagline = 'Apply for an', + tagline = 'OpenSats grant', + track = 'grant', + href, +}: ApplyButtonProps) { + const target = href ?? APPLY_PATHS[track] + + return ( + + + {prelude}{' '} + {cta} + + + + {preTagline} {tagline} + + + Apply + + for a grant + + + + + + ) +} diff --git a/components/MDXComponents.tsx b/components/MDXComponents.tsx index 022b2c474..d7d624f52 100644 --- a/components/MDXComponents.tsx +++ b/components/MDXComponents.tsx @@ -13,6 +13,7 @@ import DonateToGeneralFundButton from './DonateToGeneralFundButton' import DonateToNostrFundButton from './DonateToNostrFundButton' import DonateToOperationsButton from './DonateToOperationsButton' import DonateRecurringButton from './DonateRecurringButton' +import ApplyButton from './ApplyButton' import DesignTeam from './DesignTeam' import Credits from './Supporters' import YouTubeEmbed from './YouTubeEmbed' @@ -41,6 +42,7 @@ export const MDXComponents: ComponentMap = { DonateToNostrFundButton, DonateToOperationsButton, DonateRecurringButton, + ApplyButton, DesignTeam, YouTubeEmbed, Credits, diff --git a/data/blog/call-for-applications-spring-2026.mdx b/data/blog/call-for-applications-spring-2026.mdx new file mode 100644 index 000000000..247a8e822 --- /dev/null +++ b/data/blog/call-for-applications-spring-2026.mdx @@ -0,0 +1,111 @@ +--- +title: "Call for Applications" +date: '2026-04-29' +tags: ['OpenSats', 'bitcoin', 'grants', 'applications'] +authors: ['default', 'arvin', 'tuma', 'btcschellingpt'] +images: ['/static/images/blog/107-call-for-applications-spring-2026.jpg'] +draft: false +summary: "OpenSats is seeking grant proposals for projects advancing Layer 1 Bitcoin privacy." +--- + +Developers and contributors working on Bitcoin, nostr, and adjacent freedom tech +can [apply for a grant] at any time, and our board reviews proposals on a +rolling basis. + +Twice a year, in the spring and fall, we plan to highlight a focus area where we +would like to see strong proposals. This spring, the focus is on privacy at +Bitcoin's base layer. + + + +Privacy on Bitcoin matters for the same reasons it matters anywhere else. People +accepting bitcoin for their work, running a small business, donating to causes, +or saving for the future reasonably expect the same kind of day-to-day financial +privacy they would get from traditional banking tools. As [Greg Maxwell] put it +back in 2013: + +>Traditional banking provides a fair amount of privacy by default. Your inlaws +don't see that you're buying birth control that deprives them of grandchildren, +your employer doesn't learn about the non-profits you support with money from +your paycheck, and thieves don't see your latest purchases or how wealthy you +are to help them target and scam you. Poor privacy in Bitcoin can be a major +practical disadvantage for both individuals and businesses. + +There are real privacy gaps on-chain today. Much of that sits in wallet behavior +and transaction construction, which makes it a great area for open-source +development to improve the experience for users. + +A lot of privacy work supported by OpenSats has already happened at higher +layers of the bitcoin stack. For example, on Layer 2, grantees have advanced +[BOLT12 offers] and receiver-side privacy for Lightning payments, and on Layer +3, grantees building [Cashu, Nutshell, Minibits, Fedimint, and related projects] +have turned Chaumian ecash from research into production infrastructure. That +work will continue. + +Base-layer work is where privacy improvements carry the furthest. For instance, +every on-chain transaction that uses [Silent Payments] instead of reusing +addresses, uses [collaborative transaction] methods such as [Payjoin], or opens +Lightning channels, raises the baseline privacy of everyday users with minimal +change, if any, to how they already transact. We would like to fund more of this +type of work. + +There are several Layer 1 privacy-centric projects that already receive OpenSats +support, including [Payjoin Dev Kit] and [Async Payjoin], [Silent +Payments][sp-grant], [Coinswap], [JoinMarket NG], [Floresta], [ASmap], and +Bitcoin Core [P2P privacy and node-fingerprinting research]. Foundational +libraries like [rust-bitcoin] and [BDK] are the basis of much of this privacy +work, alongside the [Kyoto light client] project, which implements [BIP 157] and +[BIP 158] compact-block filters that Silent Payments and other privacy tools +rely on. + +This spring, we would especially welcome proposals that extend and improve Layer +1 work mentioned above, as well as new projects taking fresh approaches to +on-chain privacy. That includes deeper integration of existing techniques into +widely used wallets, research and tooling that strengthen the surrounding +ecosystem, and ideas we have not yet considered. + +Strong applications are clear about the problem being addressed, the users being +served, and a concrete plan for getting there. If your project improves +base-layer privacy in Bitcoin and is free and open source, please consider +submitting a grant application. + + + +Applications go through our [standard process]: a concise proposal reviewed by +our board on technical merit, potential impact, and ability to execute. Our +[Application FAQ] covers review timelines, budget guidance, reference letters, +and other common questions. + +Grants awarded to Bitcoin Layer 1 privacy projects will be sourced from our +[General Fund]. If you would like to help us fund more privacy work on the base +layer, please [consider making a recurring donation]. + +[apply for a grant]: /apply +[Greg Maxwell]: https://bitcointalk.org/index.php?topic=279249.0 +[BOLT12 offers]: /blog/advancements-in-lightning-infrastructure +[Cashu, Nutshell, Minibits, Fedimint, and related projects]: /blog/advancements-in-ecash +[Silent Payments]: /topics/silent-payments +[collaborative transaction]: https://jamdocs.org/glossary/#collaborative-transaction +[Payjoin]: /topics/payjoin +[Payjoin Dev Kit]: /blog/bitcoin-grants-july-2023#payjoin-dev-kit +[Async Payjoin]: /blog/developing-advancements-in-onchain-privacy#async-payjoin +[sp-grant]: /blog/developing-advancements-in-onchain-privacy#silent-payments +[Coinswap]: /blog/developing-advancements-in-onchain-privacy#coinswap +[JoinMarket NG]: /blog/seventeenth-wave-of-bitcoin-grants#joinmarket-ng +[Floresta]: /blog/bitcoin-grants-september-2024-7th-wave#floresta +[ASmap]: /blog/bitcoin-grants-september-2024-7th-wave#asmap +[P2P privacy and node-fingerprinting research]: /blog/five-grants-to-strengthen-bitcoin-development#naiyoma +[rust-bitcoin]: /blog/ninth-wave-of-bitcoin-grants +[BDK]: /blog/bitcoin-grants-july-2024 +[Kyoto light client]: /blog/bitcoin-grants-september-2024-7th-wave +[BIP 157]: https://github.com/bitcoin/bips/blob/master/bip-0157.mediawiki +[BIP 158]: https://github.com/bitcoin/bips/blob/master/bip-0158.mediawiki +[standard process]: /apply/grant +[Application FAQ]: /faq/application +[General Fund]: /funds/general +[consider making a recurring donation]: /donate diff --git a/public/static/images/blog/107-call-for-applications-spring-2026.jpg b/public/static/images/blog/107-call-for-applications-spring-2026.jpg new file mode 100644 index 000000000..8e7d13db7 Binary files /dev/null and b/public/static/images/blog/107-call-for-applications-spring-2026.jpg differ diff --git a/styles/globals.css b/styles/globals.css index ffa55f8dd..c43eefdef 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -58,3 +58,208 @@ body { left: -9999px; top: -9999px; } + +.apply-banner-v2 { + position: relative; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + max-width: 480px; + min-height: 120px; + margin: 4rem auto; + border-radius: 6px; + background-color: #f4f4f5; /* neutral-100 */ + background-image: linear-gradient(to right, #ffedd5, #f4f4f5); + box-shadow: 4px 4px 24px rgba(0, 0, 0, 0.15); + color: white; + text-decoration: none !important; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); + overflow: hidden; + transition: transform 0.3s ease-in-out; + font-size: 1.1rem; + line-height: 1.1; +} + +.apply-banner-v2::after { + content: ''; + position: absolute; + top: -210px; + left: -240px; + height: 420px; + width: 420px; + background-color: #ea580c; /* orange-600 */ + background-image: linear-gradient(#f97316, #c2410c); /* orange-500 -> orange-700 */ + transform: rotate(36deg); + transition: transform 0.3s ease-in-out; + z-index: 0; +} + +.apply-banner-v2__left, +.apply-banner-v2__right { + position: relative; + flex: 1; + padding: 1rem 1.25rem; + transition: opacity 0.5s ease-in-out, transform 0.5s ease-in-out; + z-index: 2; +} + +.apply-banner-v2__left { + color: white; +} + +.apply-banner-v2__left strong { + display: block; + font-size: 1.7rem; + font-weight: 700; + color: white; +} + +.apply-banner-v2__right { + text-align: right; + color: #9a3412; /* orange-800 */ + text-shadow: 0 0 4px #f4f4f5, 0 1px 1px #f4f4f5; +} + +.apply-banner-v2__right strong { + display: block; + font-size: 1.3rem; + font-weight: 600; + color: #9a3412; +} + +.apply-banner-v2__icons { + position: absolute; + inset-block-end: 0.5rem; + inset-inline-end: 0.75rem; + display: none; + align-items: end; + gap: 4px; + z-index: 1; + pointer-events: none; +} + +.apply-banner-v2__icons > span { + display: inline-flex; + opacity: 0; + font-size: 1.75rem; + line-height: 1; +} + +.apply-banner-v2__icons > span:nth-child(2) { + font-size: 2.5rem; + transform: translateY(-6px); +} + +.apply-banner-v2:hover { + transform: scale(1.05); +} + +.apply-banner-v2:hover::after { + transform: scale(3); +} + +.apply-banner-v2:hover .apply-banner-v2__right { + opacity: 0; +} + +.apply-banner-v2:hover .apply-banner-v2__left { + transform: translate(20px, 4px); +} + +.apply-banner-v2:hover .apply-banner-v2__icons { + display: flex; +} + +.apply-banner-v2:hover .apply-banner-v2__icons > span { + animation: apply-banner-v2-icon-fade 1s forwards ease-in-out; +} + +.apply-banner-v2:hover .apply-banner-v2__icons > span:nth-child(1) { + animation-delay: 0.1s; +} + +.apply-banner-v2:hover .apply-banner-v2__icons > span:nth-child(3) { + animation-delay: 0.2s; +} + +@keyframes apply-banner-v2-icon-fade { + from { + opacity: 0; + transform: translateY(12px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.apply-banner-v2:hover .apply-banner-v2__icons > span:nth-child(2) { + animation: apply-banner-v2-icon-fade-mid 1s forwards ease-in-out; +} + +@keyframes apply-banner-v2-icon-fade-mid { + from { + opacity: 0; + transform: translateY(12px); + } + to { + opacity: 1; + transform: translateY(-6px); + } +} + +@media (prefers-reduced-motion: reduce) { + .apply-banner-v2, + .apply-banner-v2::after, + .apply-banner-v2__left, + .apply-banner-v2__right, + .apply-banner-v2__icons > span { + transition: none !important; + animation: none !important; + } +} + +.dark .apply-banner-v2 { + background-color: #27272a; /* neutral-800 */ + background-image: linear-gradient(to right, #431407, #27272a); /* orange-950 -> neutral-800 */ + box-shadow: 4px 4px 24px rgba(0, 0, 0, 0.4); +} + +.dark .apply-banner-v2__right, +.dark .apply-banner-v2__right strong { + color: #fdba74; /* orange-300 */ + text-shadow: 0 0 4px #1c1917, 0 1px 1px #1c1917; +} + +.apply-banner-v2__tagline-mobile { + display: none; +} + +@media (max-width: 480px) { + .apply-banner-v2__prelude { + display: none; + } + + .apply-banner-v2__left strong { + white-space: nowrap; + } + + .apply-banner-v2__tagline { + display: none; + } + + .apply-banner-v2__tagline-mobile { + display: inline; + } + + .apply-banner-v2__right strong { + font-size: 1.2rem; + } + + .apply-banner-v2__tagline-mobile-sub { + display: block; + white-space: nowrap; + font-size: 0.95rem; + } +}