Sol.College

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 directorySource files
app170
atmos_mobile39
lib26
atmos_backend24
claudeatmos18
api6
programs4
atmos_solana2

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.

suchit1010/Atmos · 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,        });
  1. 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.
  2. Line 158 token::mint_to(fee_cpi_ctx, fee_amount)?;: Mints new tokens. The mint authority must sign.
  3. Line 163 .checked_add(mint_amount): Uses checked arithmetic so overflow fails instead of wrapping.
  4. Line 167 msg!(: Logs to the program log, which is visible in explorers and the test output.
  5. Line 174 emit!(CarbonCreditsMinted {: Emits an Anchor event that clients can parse from the logs.
suchit1010/Atmos · 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 {
  1. Line 135 let fee_cpi_accounts = MintTo {: Mints new tokens. The mint authority must sign.
  2. 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.
  3. Line 146 .checked_add(mint_amount): Uses checked arithmetic so overflow fails instead of wrapping.
  4. Line 149 msg!(: Logs to the program log, which is visible in explorers and the test output.
  5. Line 156 emit!(CarbonCreditsMinted {: Emits an Anchor event that clients can parse from the logs.
suchit1010/Atmos · 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);
  1. Line 29 emit!(ProjectRegistered { project: project_key, owner: project.owner });: Emits an Anchor event that clients can parse from the logs.
  2. 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.

DirectoryCommandRuns
.npm run buildpnpm run typecheck && pnpm -r --if-present run build
app/greenstride-webnpm run devnext dev
app/greenstride-webnpm run startnext start
app/greenstride-webnpm run buildnext build
app/greenstride-webnpm run linteslint
app/mobilenpm run devpnpm exec expo start --localhost --port 8081
app/mobilenpm run buildnode scripts/build.js
app/mockup-sandboxnpm run devvite dev
app/mockup-sandboxnpm run buildvite build
app/api-servernpm run devpnpm run build && pnpm run start
app/api-servernpm run startnode --enable-source-maps ./dist/index.mjs
app/api-servernpm run buildnode ./build.mjs
app/api-servernpm run testvitest run
atmos_backendnpm run devnodemon --exec ts-node src/server.ts
atmos_backendnpm run startnode dist/server.js
atmos_backendnpm run buildtsc

What you could build from it

Used in lessons