Full lesson
Atmos
Transform real-world carbon reductions into instantly verifiable digital assets (carbon tokens) with privacy and trust. We build a climate MRV (Measurement, Reporting, Verification) stack using satellite imagery, AI, zero-knowledge proofs, and blockchain settlement.
What it does
From the project README:
Atmos is a **climate finance infrastructure platform** built on Solana. It transforms verified carbon reductions from physical projects into tradable digital assets. The system combines mobile data capture, satellite and AI verification, zero-knowledge proofs, Solana settlement, and modern payments rails for global checkout.
- Original
- suchit1010/Atmos
- SuperStack fork
- Blockchains/Atmos @
862d0b8 - Stars
- 0
- Last push (original)
- 2026-10-13
- Languages
- HTML, JavaScript, TypeScript, Rust, PLpgSQL, Python
- Detected stack
- AnchorNext.jsweb3.js
- Categories
- AI & AgentsNFTs & Digital Assets
- Licence
- MIT
- Homepage
- https://atmoscarboncrediit.vercel.app/
Architecture
293 source files. By extension: .tsx ×136, .ts ×135, .js ×14, .rs ×6, .py ×2.
| Top-level directory | Source files |
|---|---|
app | 170 |
atmos_mobile | 39 |
lib | 26 |
atmos_backend | 24 |
claudeatmos | 18 |
api | 6 |
programs | 4 |
atmos_solana | 2 |
On-chain programs: atmos_solana/programs/atmos_protocol, programs/atmos-carbon-encrypt
Dapp: devnet deploy pending
⏳ Devnet deploy pending — goes live when the devnet wallet is topped up. This fork's own dapp is not deployed yet, so there is no program address or transaction to show. It is queued in dapp-queue.txt; once devnet SOL is available it is deployed, exercised with real devnet transactions, and this section switches to the live dapp at /dapps/atmos/. Until then, the lesson and step-by-step guide below are complete, and you can run it locally with the commands below.
Key code, explained
Excerpts chosen automatically where the code uses the most Solana concepts, pinned to the fork's commit.
atmos_solana/programs/atmos_protocol/src/lib.rs L157–180 @ 862d0b8 · MIT · original let fee_cpi_ctx = CpiContext::new(ctx.accounts.token_program.to_account_info(), fee_cpi_accounts); token::mint_to(fee_cpi_ctx, fee_amount)?; } // Update config totals and serialize back config_data.total_minted = config_data.total_minted .checked_add(mint_amount) .ok_or(AtmosError::Overflow)?; config_data.try_serialize(&mut &mut ctx.accounts.config.data.borrow_mut()[..])?; msg!( "✓ Minted {} ATMOS (fee: {}) for project: {}", mint_amount, fee_amount, verification_record.project_id ); emit!(CarbonCreditsMinted { project_id: verification_record.project_id.clone(), amount: mint_amount, fee: fee_amount, recipient: verification_record.recipient, timestamp: verification_record.minted_at, });- Line 157
let fee_cpi_ctx = CpiContext::new(ctx.accounts.token_program.to_account_info(), fee_cpi_ac: Makes a cross-program invocation into another program. - Line 158
token::mint_to(fee_cpi_ctx, fee_amount)?;: Mints new tokens. The mint authority must sign. - Line 163
.checked_add(mint_amount): Uses checked arithmetic so overflow fails instead of wrapping. - Line 167
msg!(: Logs to the program log, which is visible in explorers and the test output. - Line 174
emit!(CarbonCreditsMinted {: Emits an Anchor event that clients can parse from the logs.
atmos_solana/programs/atmos_protocol/src/lib.production.rs L133–156 @ 862d0b8 · MIT · original // Mint fee to protocol wallet if fee_amount > 0 { let fee_cpi_accounts = MintTo { mint: ctx.accounts.mint.to_account_info(), to: ctx.accounts.fee_recipient_account.to_account_info(), authority: ctx.accounts.payer.to_account_info(), }; let fee_cpi_ctx = CpiContext::new(ctx.accounts.token_program.to_account_info(), fee_cpi_accounts); token::mint_to(fee_cpi_ctx, fee_amount)?; } // Update config totals ctx.accounts.config.total_minted = ctx.accounts.config.total_minted .checked_add(mint_amount) .ok_or(AtmosError::Overflow)?; msg!( "✓ Minted {} ATMOS (fee: {}) for project: {}", mint_amount, fee_amount, verification_record.project_id ); emit!(CarbonCreditsMinted {- Line 135
let fee_cpi_accounts = MintTo {: Mints new tokens. The mint authority must sign. - Line 140
let fee_cpi_ctx = CpiContext::new(ctx.accounts.token_program.to_account_info(), fee_cpi_ac: Makes a cross-program invocation into another program. - Line 146
.checked_add(mint_amount): Uses checked arithmetic so overflow fails instead of wrapping. - Line 149
msg!(: Logs to the program log, which is visible in explorers and the test output. - Line 156
emit!(CarbonCreditsMinted {: Emits an Anchor event that clients can parse from the logs.
programs/atmos-carbon-encrypt/src/lib.rs L13–35 @ 862d0b8 · MIT · original// instruction wiring and stubs for the three encrypt graphs described in the// integration guide. Replace stubs with actual `encrypt_fn` graphs and calls. declare_id!("11111111111111111111111111111111"); #[program]pub mod atmos_carbon_encrypt { use super::*; pub fn register_project(ctx: Context<RegisterProject>, params: RegisterParams) -> Result<()> { let project_key = ctx.accounts.project.key(); let project = &mut ctx.accounts.project; project.owner = *ctx.accounts.owner.to_account_info().key; // Store the provided ciphertext account pubkey as reference project.co2_ciphertext = *ctx.accounts.co2_ciphertext_account.to_account_info().key; project.status = ProjectStatus::Registered; emit!(ProjectRegistered { project: project_key, owner: project.owner }); Ok(()) } pub fn execute_threshold_check(ctx: Context<ExecuteCheck>) -> Result<()> { // Only allow the project's owner (or designated executor) to run threshold checks require!(ctx.accounts.executor.key() == ctx.accounts.project.owner, AtmosError::Unauthorized);- Line 29
emit!(ProjectRegistered { project: project_key, owner: project.owner });: Emits an Anchor event that clients can parse from the logs. - Line 35
require!(ctx.accounts.executor.key() == ctx.accounts.project.owner, AtmosError::Unauthoriz: An explicit validation that aborts the instruction with an error.
How to run, build and test
These commands come from the repo's own manifests (package.json scripts, Anchor.toml, Cargo, go.mod, Makefile). Check the README for prerequisites and environment variables.
| Directory | Command | Runs |
|---|---|---|
. | npm run build | pnpm run typecheck && pnpm -r --if-present run build |
app/greenstride-web | npm run dev | next dev |
app/greenstride-web | npm run start | next start |
app/greenstride-web | npm run build | next build |
app/greenstride-web | npm run lint | eslint |
app/mobile | npm run dev | pnpm exec expo start --localhost --port 8081 |
app/mobile | npm run build | node scripts/build.js |
app/mockup-sandbox | npm run dev | vite dev |
app/mockup-sandbox | npm run build | vite build |
app/api-server | npm run dev | pnpm run build && pnpm run start |
app/api-server | npm run start | node --enable-source-maps ./dist/index.mjs |
app/api-server | npm run build | node ./build.mjs |
app/api-server | npm run test | vitest run |
atmos_backend | npm run dev | nodemon --exec ts-node src/server.ts |
atmos_backend | npm run start | node dist/server.js |
atmos_backend | npm run build | tsc |
What you could build from it
- Fork the SuperStack copy and extend it within the AI & Agents gaps listed on the idea page.
- Learn the pattern first: Building and sending transactions from a client