const web = new Website()
function build(config) {
const site = render(config)
return site.deploy()
}
const [data, setData] = useState(null)
useEffect(() => {
fetchData('/api/projects')
}, [])
async function load(url) {
const res = await fetch(url)
if (!res.ok) throw new Error()
return res.json()
}
npm run build
git push origin main
NODE_ENV=production
const router = useRouter()
router.push('/grazie') interface Project {
id: string
client: string
type: 'website' | 'app' | 'mobile'
status: boolean
launched: Date
}
export type Config = {
theme: string
locale: 'it' | 'en' | 'de'
apiKey: string
maxItems: number
}
const stan: Developer = {
name: 'Carol Stan',
city: 'Trieste',
stack: ['React', 'Astro', 'Node']
}
type ServiceType = 'vetrina'
| 'webapp' | 'mobile'
| 'seo' | 'ai' .hero {
display: grid;
grid-template-columns: 52% 1fr;
gap: 4rem;
align-items: center;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px) }
to { opacity: 1; transform: translateY(0) }
}
:root {
--color-accent: #519872;
--font-mono: 'JetBrains Mono';
--radius-full: 9999px;
}
.btn-primary {
border-radius: var(--radius-full);
background: linear-gradient(
135deg, #519872, #233329
);
font-family: var(--font-mono);
} import express from 'express'
const app = express()
app.use(express.json())
app.get('/api/projects', async (req, res) => {
const data = await db.findAll()
res.json({ success: true, data })
})
app.post('/api/contact', async (req, res) => {
const { name, email, msg } = req.body
await sendMail({ name, email, msg })
res.json({ sent: true })
})
app.listen(3000, () => {
console.log('stancarol API online')
})
module.exports = { app } SELECT clients.name,
projects.title,
projects.status,
projects.launched_at
FROM clients
JOIN projects ON
clients.id = projects.client_id
WHERE projects.active = true
AND clients.city = 'Trieste'
ORDER BY launched_at DESC
LIMIT 20;
CREATE TABLE projects (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
client_id UUID REFERENCES clients(id),
title VARCHAR(255) NOT NULL,
status BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW()
); export default function Page() {
return (
<main className="site">
<Hero />
<Services />
<Portfolio />
<FAQ />
<CTA />
</main>
)
}
const { data, error, isLoading } = useSWR(
'/api/projects',
fetcher,
{ revalidateOnFocus: false }
)
export async function getStaticProps() {
const projects = await fetchProjects()
return {
props: { projects },
revalidate: 3600
}
} git init
git add .
git commit -m "feat: initial site"
git push -u origin main
vercel --prod
# deployment complete ✓
# stancarol.it live
const env = process.env
const SITE = env.NEXT_PUBLIC_URL
const KEY = env.API_SECRET_KEY
// build config
export default defineConfig({
site: 'https://stancarol.it',
integrations: [react(), tailwind()],
output: 'static'
}) @keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-12px);
}
}
@keyframes glow-pulse {
0%, 100% {
box-shadow: 0 0 20px rgba(81,152,114,0.2);
}
50% {
box-shadow: 0 0 40px rgba(81,152,114,0.4);
}
}
.portrait-circle {
border-radius: 50%;
animation: float 6s ease-in-out infinite;
}
@media (max-width: 768px) {
.hero-layout {
grid-template-columns: 1fr;
}
} const gsap = require('gsap')
const ScrollTrigger = require('gsap/ScrollTrigger')
gsap.registerPlugin(ScrollTrigger)
gsap.from('.hero-headline', {
y: 60,
opacity: 0,
duration: 1.2,
ease: 'power4.out'
})
ScrollTrigger.create({
trigger: '.services',
start: 'top 80%',
onEnter: () => {
gsap.from('.service-card', {
y: 40,
opacity: 0,
stagger: 0.1,
duration: 0.8
})
},
once: true
}) {
"name": "stancarol-site",
"version": "1.0.0",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"start": "node server.js",
"lint": "eslint src/"
},
"dependencies": {
"astro": "^4.0.0",
"gsap": "^3.12.0",
"react": "^18.0.0"
},
"devDependencies": {
"typescript": "^5.0.0",
"tailwindcss": "^4.0.0"
}
} — Chi sono
Marian
Carol Stan.
Sviluppatore freelance.
Trieste, Italia.
Non sono una web agency con dieci commerciali davanti e uno sviluppatore
dietro. Sono una persona sola che fa tutto: ascolto, progetto, costruisco, consegno.
Ho iniziato a costruire siti web perché mi sembrava il modo più diretto
per risolvere un problema che vedevo ovunque: attività buone, con persone
capaci, invisibili online perché il sito faceva schifo o non c'era proprio.
Il mio approccio è semplice: prima ti faccio vedere il sito, poi ne parliamo.
Non perché non abbia fiducia in quello che faccio — ma perché convinci
meglio con i fatti che con le parole, e i tuoi soldi meritano rispetto.
Lavoro in remoto con clienti in tutta Italia, ma ho base a Trieste.
Se sei di qua, possiamo anche vederci di persona. Se sei altrove,
una videocall funziona benissimo.
AstroReactTypeScriptTailwind CSSGSAPSupabasePostgreSQLNode.jsViteFigmaReact NativeExpoVercelCloudflareGit
AstroReactTypeScriptTailwind CSSGSAPSupabasePostgreSQLNode.jsViteFigmaReact NativeExpoVercelCloudflareGit
Come lavoro,
concretamente.
Prima vedi, poi decidi
Il preview funzionante viene prima di qualsiasi contratto. Non chiedo atti di fede.
Parli sempre con me
Nessun account manager, nessun passaggio di mano. Dal primo messaggio alla consegna: sono io.
Revisioni senza limite
Fino a quando non è come la vuoi. Non conto le iterazioni e non le metto in fattura.
Tutto rimane tuo
Codice, dominio, hosting: intestati a te. Non sei mai in ostaggio di me o di nessun altro.
Pronti?
Scriviamoci.
Nessuna forma complicata. Una email, un messaggio, quello che preferisci.
Contattami