<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Meum Ink</title>
    <description>The latest articles on DEV Community by Meum Ink (@meum_ink).</description>
    <link>https://dev.to/meum_ink</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3454185%2Fb173b923-5aa3-48f1-a2ac-94330bae84f7.jpg</url>
      <title>DEV Community: Meum Ink</title>
      <link>https://dev.to/meum_ink</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/meum_ink"/>
    <language>en</language>
    <item>
      <title>How I’m Building My Website: Idea, Stack, and Tips for Beginners</title>
      <dc:creator>Meum Ink</dc:creator>
      <pubDate>Sat, 23 Aug 2025 12:43:00 +0000</pubDate>
      <link>https://dev.to/meum_ink/how-im-building-my-website-idea-stack-and-tips-for-beginners-3fo0</link>
      <guid>https://dev.to/meum_ink/how-im-building-my-website-idea-stack-and-tips-for-beginners-3fo0</guid>
      <description>&lt;p&gt;Hello! I’d like to share a short story about how I’m building my website—what tools I use, what I avoid, and the lessons I’ve learned along the way. I don’t claim to have all the answers; I have about four years of development experience and I’m always open to feedback from more seasoned engineers. I hope this post is useful for beginners—and also helps get my project in front of people who might find it interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  0. Idea
&lt;/h2&gt;

&lt;p&gt;To get started, you need an idea. With so many apps already out there, it’s hard to invent something truly unique—especially something a solo beginner can realistically ship. But it’s not impossible. There’s always room for improvement: somewhere there’s too much advertising, somewhere there are rough edges, and elsewhere there’s a missing tool or a clumsy UX.&lt;/p&gt;

&lt;p&gt;Sometimes, you can just build what you want to see in the world. That’s how my project began. Alternatives likely exist and may be more polished, but I wanted to make this site myself.&lt;/p&gt;

&lt;p&gt;The site’s core idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;put all a user’s social links and forum profiles in one place to make sharing easy;&lt;/li&gt;
&lt;li&gt;keep the profile free of advertising so it looks clean;&lt;/li&gt;
&lt;li&gt;offer broad customization options;&lt;/li&gt;
&lt;li&gt;provide widgets that present personal info nicely—from birthdays to integrations with services like &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;let beginner developers and designers publish themes and earn a little money.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Monetization
&lt;/h2&gt;

&lt;p&gt;Monetization is a popular question. There are many approaches, but the key is to be clear about what users are paying for. The product should not only solve a problem, but also be likable.&lt;/p&gt;

&lt;p&gt;This topic deserves its own articles; here I’ll outline how I think about monetizing my site. Infrastructure costs are modest, so the project can run on donations and small purchases. I don’t plan to restrict widget functionality—most will be free. So what do we monetize?&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1. Themes (Appearance)
&lt;/h3&gt;

&lt;p&gt;Not everyone wants to configure everything from scratch. Ready‑made themes save time and simplify onboarding. Of course, there will also be free options so no one feels limited.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2. Usernames
&lt;/h3&gt;

&lt;p&gt;This idea is inspired by &lt;a href="https://telegram.org/" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;—without the resale problem. Short usernames are easier to read, remember, and type. I realize “ownership” can be contentious, so I’ll make decisions as transparently and fairly as possible. For example, protecting the names of well‑known brands from impersonation, and helping promising projects by reclaiming names from inactive accounts.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I also plan to share revenue stats for the project later on.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Setup Tips
&lt;/h2&gt;

&lt;p&gt;These are not universal rules—just my experience. Yours may differ.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1. Operating System
&lt;/h3&gt;

&lt;p&gt;I’ve used Windows (7/10/11) and Linux (&lt;a href="https://ubuntu.com/" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt;, &lt;a href="https://archlinux.org/" rel="noopener noreferrer"&gt;Arch&lt;/a&gt;). I’d recommend Linux even to beginners: it gives you valuable experience and eliminates many issues (while adding some new ones—usually temporary). I’m currently on Ubuntu 25.04. There’s a huge selection of software via &lt;a href="https://wiki.debian.org/Apt" rel="noopener noreferrer"&gt;APT&lt;/a&gt;, &lt;a href="https://snapcraft.io/" rel="noopener noreferrer"&gt;Snap&lt;/a&gt;, and &lt;a href="https://flatpak.org/" rel="noopener noreferrer"&gt;Flatpak&lt;/a&gt;. Linux hasn’t been “terminal only” for a long time—it’s worth a try. Dual‑booting is also an option and can be resource‑friendly.&lt;/p&gt;

&lt;p&gt;Working on Linux at home helps you understand servers more easily. I also appreciate the file systems Linux offers—but that’s a topic for another post.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2. IDE / Code Editor
&lt;/h3&gt;

&lt;p&gt;My editor of choice is &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;—an excellent tool with a vast ecosystem used by both beginners and pros. I use the &lt;a href="https://vscodium.com/" rel="noopener noreferrer"&gt;VSCodium&lt;/a&gt; fork—not so much for disabled telemetry as for the convenience of separating different projects across different editors.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3. Consistent Code Style
&lt;/h3&gt;

&lt;p&gt;Set this up early: &lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt; and a linter (e.g., &lt;a href="https://eslint.org/" rel="noopener noreferrer"&gt;ESLint&lt;/a&gt;), and in my stack—&lt;a href="https://typicode.github.io/husky/" rel="noopener noreferrer"&gt;Husky&lt;/a&gt; to run checks before committing. Editor plugins make these tools even smoother. If you work with a partner or a team, consistency becomes critical.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Frontend Technologies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1. Framework
&lt;/h3&gt;

&lt;p&gt;I’m primarily a backend developer, but here’s my frontend take. I chose &lt;a href="https://vuejs.org/" rel="noopener noreferrer"&gt;Vue&lt;/a&gt;. If SEO is a priority, server‑side rendering (e.g., &lt;a href="https://nuxt.com/" rel="noopener noreferrer"&gt;Nuxt&lt;/a&gt;, which is also Vue) makes sense, and you’d be right to consider it.&lt;/p&gt;

&lt;p&gt;In my case, page generation lives on the backend, and Vue powers the interactive site. I’ve worked with both Vue and Nuxt; they’re similar enough that for the beta I stuck with Vue. I may migrate to Nuxt later.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2. Components
&lt;/h3&gt;

&lt;p&gt;I’ve tried many libraries, and my favorite is &lt;a href="https://primevue.org/" rel="noopener noreferrer"&gt;PrimeVue&lt;/a&gt;: a large component set with strong customization. (They also offer &lt;a href="https://primeblocks.org/" rel="noopener noreferrer"&gt;PrimeBlocks&lt;/a&gt; and &lt;a href="https://primeflex.org/" rel="noopener noreferrer"&gt;PrimeFlex&lt;/a&gt; for layout.) There are minor visual details I don’t love, but they’re easy to fix with custom styles.&lt;/p&gt;

&lt;p&gt;Ready‑made components save time on common UI (Switch, Select, Calendar, etc.), which is ideal for beginners while aligning with UI/UX expectations.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3. Icons
&lt;/h3&gt;

&lt;p&gt;I use &lt;a href="https://iconify.design/" rel="noopener noreferrer"&gt;Iconify&lt;/a&gt; (&lt;code&gt;@iconify/vue&lt;/code&gt;)—a single interface to a huge collection of icon sets. Very convenient.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4. Fonts
&lt;/h3&gt;

&lt;p&gt;Two main options: &lt;a href="https://fonts.google.com/" rel="noopener noreferrer"&gt;Google Fonts&lt;/a&gt; or &lt;a href="https://fontsource.org/" rel="noopener noreferrer"&gt;Fontsource&lt;/a&gt;. I prefer Fontsource since fonts install as npm packages and fit nicely into the build.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.5. Styles (CSS)
&lt;/h3&gt;

&lt;p&gt;My choice is &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt; (v4). It removes the need to name every &lt;code&gt;div&lt;/code&gt; and reduces context‑switching into separate CSS files (though editor plugins help with that as well). Highlights include a rich color palette, handy modifiers for dark mode (&lt;code&gt;dark:&lt;/code&gt;), states (&lt;code&gt;hover:&lt;/code&gt;), and responsive breakpoints. For most sites—especially early on—this is more than enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.6. Other
&lt;/h3&gt;

&lt;p&gt;For default profile backgrounds I use &lt;a href="https://www.npmjs.com/package/tsparticles" rel="noopener noreferrer"&gt;&lt;code&gt;tsparticles&lt;/code&gt;&lt;/a&gt;—a fork of &lt;code&gt;particles.js&lt;/code&gt;—to create an interactive network of particles that connect into interesting shapes.&lt;/p&gt;

&lt;p&gt;For random name generation I use &lt;a href="https://www.npmjs.com/package/@faker-js/faker" rel="noopener noreferrer"&gt;&lt;code&gt;@faker-js/faker&lt;/code&gt;&lt;/a&gt;. For typewriter and counter animations: &lt;a href="https://www.npmjs.com/package/vue-countup-v3" rel="noopener noreferrer"&gt;&lt;code&gt;vue-countup-v3&lt;/code&gt;&lt;/a&gt; (based on &lt;a href="https://www.npmjs.com/package/countup.js" rel="noopener noreferrer"&gt;&lt;code&gt;countup.js&lt;/code&gt;&lt;/a&gt;) and &lt;a href="https://www.npmjs.com/package/vue3-typed-ts" rel="noopener noreferrer"&gt;&lt;code&gt;vue3-typed-ts&lt;/code&gt;&lt;/a&gt;. You can also look at &lt;a href="https://animejs.com/" rel="noopener noreferrer"&gt;&lt;code&gt;anime.js&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://motion.vueuse.org/" rel="noopener noreferrer"&gt;&lt;code&gt;@vueuse/motion&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For backend requests I use &lt;a href="https://www.npmjs.com/package/openapi-fetch" rel="noopener noreferrer"&gt;&lt;code&gt;openapi-fetch&lt;/code&gt;&lt;/a&gt;. I’ll return to this in the OpenAPI section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3t8mmxzyekmtq2p32jn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3t8mmxzyekmtq2p32jn.png" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Backend Technologies
&lt;/h2&gt;

&lt;p&gt;Here the bar is higher: security, performance, scalability, and more. Each of these topics could fill a series of posts, so here’s a concise overview of my choices.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1. Programming Language
&lt;/h3&gt;

&lt;p&gt;High‑ or low‑level depends on your goals and ecosystem. I choose &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt;: I like the syntax and type safety. I also use TS on the frontend. I’m not a fan of overly complex types—basic constructs usually suffice, and type safety helps you sleep better.&lt;/p&gt;

&lt;p&gt;For the runtime I use modern &lt;a href="https://bun.sh/" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; instead of Node.js. Practical advantages include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;near‑full compatibility with Node.js;&lt;/li&gt;
&lt;li&gt;strong performance;&lt;/li&gt;
&lt;li&gt;the ability to run TS files directly;&lt;/li&gt;
&lt;li&gt;a rich standard toolkit (fs, crypto, etc.);&lt;/li&gt;
&lt;li&gt;hot reload and partial module reloads;&lt;/li&gt;
&lt;li&gt;packaging the app into a single executable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.2. Framework for REST APIs
&lt;/h3&gt;

&lt;p&gt;I use &lt;a href="https://hono.dev/" rel="noopener noreferrer"&gt;Hono&lt;/a&gt;. Why I like it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;many useful features out of the box: CORS, logger, rate limiting, etc. (with Express you often add them as separate packages);&lt;/li&gt;
&lt;li&gt;in my tests Hono was faster than Express; combined with Bun this yields a nice performance buffer;&lt;/li&gt;
&lt;li&gt;straightforward OpenAPI integration via &lt;a href="https://www.npmjs.com/package/@hono/zod-openapi" rel="noopener noreferrer"&gt;&lt;code&gt;@hono/zod-openapi&lt;/code&gt;&lt;/a&gt;, giving you typing and validation during development.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.3. OpenAPI
&lt;/h3&gt;

&lt;p&gt;Instead of manually maintaining Postman collections, I use OpenAPI and &lt;a href="https://www.npmjs.com/package/@scalar/hono-api-reference" rel="noopener noreferrer"&gt;&lt;code&gt;@scalar/hono-api-reference&lt;/code&gt;&lt;/a&gt; for modern, generated docs. For frontend integration—&lt;a href="https://www.npmjs.com/package/openapi-typescript" rel="noopener noreferrer"&gt;&lt;code&gt;openapi-typescript&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/openapi-fetch" rel="noopener noreferrer"&gt;&lt;code&gt;openapi-fetch&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Benefits of this stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;built‑in validation (via &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;Zod&lt;/a&gt; in my case);&lt;/li&gt;
&lt;li&gt;automatically generated, always up‑to‑date documentation;&lt;/li&gt;
&lt;li&gt;strong typing on the backend;&lt;/li&gt;
&lt;li&gt;types on the frontend that update alongside the API (no duplicated interfaces);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openapi-fetch&lt;/code&gt; is lighter and faster than alternatives like &lt;a href="https://axios-http.com/" rel="noopener noreferrer"&gt;Axios&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.4. Database and ORM / Query Builder
&lt;/h3&gt;

&lt;p&gt;I originally planned &lt;a href="https://www.postgresql.org/" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;, but for speed I started with &lt;a href="https://www.mongodb.com/" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt; + &lt;a href="https://mongoosejs.com/" rel="noopener noreferrer"&gt;Mongoose&lt;/a&gt;. For this kind of project a non‑relational DB is a compromise: not perfect for optimization, but fast to iterate. I’ll likely migrate to PostgreSQL with &lt;a href="https://kysely.dev/" rel="noopener noreferrer"&gt;Kysely&lt;/a&gt; (a TypeScript‑friendly query builder inspired by &lt;a href="https://knexjs.org/" rel="noopener noreferrer"&gt;Knex&lt;/a&gt;). A big plus of Kysely is typed database schemas: once described, your tables and fields are discoverable right in code. Many ORMs offer similar features, but I prefer a more minimal approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.5. Page Generation
&lt;/h3&gt;

&lt;p&gt;User profiles are rendered with &lt;a href="https://www.npmjs.com/package/happy-dom" rel="noopener noreferrer"&gt;&lt;code&gt;happy-dom&lt;/code&gt;&lt;/a&gt;, giving me a lightweight SSR. For OpenGraph banners I use &lt;a href="https://playwright.dev/" rel="noopener noreferrer"&gt;Playwright&lt;/a&gt;: instead of custom canvas drawing, I write familiar HTML/CSS (Vue, Tailwind, and friends are all available).&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Deploy (a Bit of DevOps)
&lt;/h2&gt;

&lt;p&gt;Getting code into users’ hands is the trickiest part for beginners.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1. Versioning
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;Git&lt;/a&gt; is non‑negotiable. I used to struggle with commit messages, and maybe you do too. AI can help draft them now, but it’s still worth knowing the basics—see &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2. Containerization
&lt;/h3&gt;

&lt;p&gt;The main benefit: consistent behavior across environments, plus extra isolation on the server. Most often this means &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3. CI/CD
&lt;/h3&gt;

&lt;p&gt;After pushing to &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; / &lt;a href="https://about.gitlab.com/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;, a pipeline should ideally run type checks, linting, tests, build, and deploy. If you use PostgreSQL (or similar), include migrations.&lt;/p&gt;

&lt;p&gt;Full disclosure: for the alpha I skipped the first two steps because I’m working solo. I’ll set them up later. I currently use a bare Git repository and custom bash scripts. It may look like reinventing the wheel, but my code and server keys stay exclusively with me—no need to host my own GitLab/Gitea.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4. Nginx
&lt;/h3&gt;

&lt;p&gt;This may be overkill for beginners, but I run two servers with the future in mind. One is public and runs only &lt;a href="https://nginx.org/" rel="noopener noreferrer"&gt;Nginx&lt;/a&gt; (and could act as a load balancer later). The second is private and hosts the API, database, and other services. They’re connected via VPN (&lt;a href="https://www.wireguard.com/" rel="noopener noreferrer"&gt;WireGuard&lt;/a&gt;), which lets me avoid certificates between internal services. I considered self‑signed certs and &lt;a href="https://caddyserver.com/" rel="noopener noreferrer"&gt;Caddy&lt;/a&gt;, but VPN was the quickest and most convenient choice for me.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.5. DDoS Protection
&lt;/h3&gt;

&lt;p&gt;I recommend adding &lt;a href="https://www.cloudflare.com/" rel="noopener noreferrer"&gt;Cloudflare&lt;/a&gt;. My project isn’t popular yet, so I haven’t enabled it; I’m also curious about alternatives—and even building something myself for learning’s sake.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Domain
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1. Purchase and Setup
&lt;/h3&gt;

&lt;p&gt;I like &lt;a href="https://www.namecheap.com/" rel="noopener noreferrer"&gt;Namecheap&lt;/a&gt;—they support DNS‑01 (useful in the next step), have reasonable prices, and offer “Beast Mode” for bulk domain search.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2. SSL Certificate
&lt;/h3&gt;

&lt;p&gt;I use &lt;a href="https://certbot.eff.org/" rel="noopener noreferrer"&gt;Certbot&lt;/a&gt; with the Nginx plugin to obtain free &lt;a href="https://letsencrypt.org/" rel="noopener noreferrer"&gt;Let’s Encrypt&lt;/a&gt; certificates. I configured auto‑renewal for the site and API and plan to renew the wildcard certificate manually. For that you need DNS‑01—see Let’s Encrypt’s docs on &lt;a href="https://letsencrypt.org/docs/faq/#does-let-s-encrypt-issue-wildcard-certificates" rel="noopener noreferrer"&gt;wildcard certificates&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What’s Next
&lt;/h2&gt;

&lt;p&gt;The hardest part is growth. I understand the mechanics, but I don’t have a widely popular project yet, so I won’t pretend to teach growth hacking. My only advice: consistently share what you’re building. The platform matters less than the habit. Maybe nobody will notice the first posts—or maybe the algorithms will help quickly. Everyone has something valuable to offer—show it to people.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! I welcome critique and suggestions. Tell me what you’d like to read next. I’m still developing my writing style, so I value any feedback. In any case—thanks for your time!&lt;/p&gt;

&lt;p&gt;P.S. I wrote this article myself. I used AI only for an accurate English translation and a few minor edits. I have a draft version to prove it. This piece was written from the heart.&lt;/p&gt;

&lt;p&gt;And if I may, here’s a link to my app—I’d love your feedback: &lt;a href="https://meum.ink" rel="noopener noreferrer"&gt;meum.ink&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>portfolio</category>
      <category>typescript</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
