Dev.to clone

Overview

Dev.to-clone


A Dev.to clone created with MERN stack and more (Essentially FB without stories feature)

Tech used with vite 🔥 :

Frontend

  • React
  • Redux toolkit (Advanced RTK)
  • Tailwind
  • Styled components
  • Framer motion
  • React router
  • Cloudinary (Image hosting)

Backend

  • MongoDB
  • Express
  • Node.js
  • OAuth (Google/Github)
  • JWT
  • Socket.io (Real-time)
  • Cloudinary
  • Mongoose
  • Axios

Features

  • Login / Signup
  • View / Edit Profile
  • Google / Github OAuth
  • Ultimate mobile responsiveness
  • Real-time Notifications Toasted
  • CRUD Posts / Comments / Replies / Tags
  • Follow / Unfollow Users
  • Follow / Unfollow Tags
  • Like / Unicorn / Bookmark Posts
  • Like comments
  • Advanced Search engine for posts, people and tags
  • Filter for posts
  • Reading List
  • Dashboard

Screenshots

Login / Signup / Edit / Delete

Login - Signup -Edit - Delete profile

Google / Github OAuth

Login OAuth

Create / Update / Edit / Delete Posts

CRUD Posts

Reactions / Comments / Follows with Real-time notifications (Toasted)

Real time notifications - Reactions - Comments - Replies - Follows

Tags / ReadingList

Tags - ReadingList

Dashboard

Dashboard

Search Engine

Search engine

Live

Client: https://marodevv-devto-clone.vercel.app

Server: https://marodevv-devto-clone-server.onrender.com

How to setup locally

Clone Repo

Clone the repo to your local machine by https://github.com/marodevv/Devto-clone

Setup

Install all dependencies in both client and server subdirectories by npm i

$ cd server && npm i
$ cd client && npm i

Create

A MongoDB database either locally or online via MongoDB Atlas

A Cloudinary account

A new project on Google Cloud Platform

A .env file in in both client and server subdirectories

ENV variables

client/.env:

BASE_URL=
GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}

server/.env:

ACCESS_TOKEN_SECRET=
REFRESH_TOKEN_SECRET=

CLIENT_URL=

GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}

DB_NAME=
DB_USER=
DB_PASSWORD=

CLOUDINARY_CLOUD_NAME=
CLOUDINARY_API_KEY=
CLOUDINARY_API_SECRET=
CLOUDINARY_DEFAULT_URL= // default image url
CLOUDINARY_DEFAULT_PUBLIC_ID= // default image public_id

Finally, run npm run stack on the root of the two subdirectories

Credit

Dev.to clone by me

Comments
  • sorry my friend . my last question i removed the cloudinary part from website but i face error that not going away at any const

    sorry my friend . my last question i removed the cloudinary part from website but i face error that not going away at any const

    sorry my friend . my last question i removed the cloudinary part from website but i face error that not going away at any const

    can u answer please i did this . i removed cloudinary part but it just isError occurs

    https://stackoverflow.com/questions/74770359/tried-every-solution-why-this-error-occurs-body-casterror-cast-to-string-fai

    opened by am0029 10
  • can u say to me what is CLOUDINARY_DEFAULT_URL =  and  CLOUDINARY_DEFAULT_PUBLIC_ID=

    can u say to me what is CLOUDINARY_DEFAULT_URL = and CLOUDINARY_DEFAULT_PUBLIC_ID=

    please can u say to me what is CLOUDINARY_DEFAULT_URL = and CLOUDINARY_DEFAULT_PUBLIC_ID=

    because cloudinary said there is no cloudinary_default_url and cloudinary_default_pulic id

    what should i fill in this two ?

    I still have problem uplaoding to clouadinary this error occurs to me when i click in register button

    {status: 500, data: "Cannot read properties of undefined (reading 'url')"} data: "Cannot read properties of undefined (reading 'url')" status: 500 [[Prototype]]: Object

    opened by am0029 9
  • hello. sorry i asked question again . i am really sorry . can not create post and post not showing in main page but  in your latest repository

    hello. sorry i asked question again . i am really sorry . can not create post and post not showing in main page but in your latest repository

    hello this is the latest from your repository i uploaded on github :

    [
    

    ](https://github.com/am0029/latest-dev-to-clone.git) at the first website not loading i have to delete this line from cliet/src/postlist/component./post.jsx line 52 makes problem and post page not showing at clinet/src/pages/postpage/componnets/post.jsx return ( post && ( <Wrapper> {isFirstPost && ( <Image onClick={() => navigate(/${post.author?.username}/${createPostUrl(post.title, post.id)}) } I HAVE TO REMOVE THIS LINE UNTILL SITE WORK >> src={post.image.url} /> )}

    cloudinary part uploading image to cloudinary . but the posts not showing at the first page : localhost:3000 but it is ok in mongo db and post saved in mongo db but not showing in website post list . do not know why and when u click on the post and it goes to blank page instead .

    this is your latest repository language english that i put 2 .env file one in client and one is server

    but i did not add google client id because i do not have

    and when u click on the post and it goes to blank page instead .

    can u check why post created in mongo db but not showing in website and pictures all white it means picture uplaoded to cloudinary but there is no post in website with that picture and body and title . nothing . and picture not showing at all .

    opened by am0029 2
  • problem at uploading image to cloudinary and problem at creating post after usersign up to the website

    problem at uploading image to cloudinary and problem at creating post after usersign up to the website

    problem at uploading image to cloudinary and of course user can not sign up becasue image can not be uploaded

    i asked question in stack over flow but zero answer

    can u look at this problem ?

    https://stackoverflow.com/questions/74747950/what-is-cloudinary-default-url-and-cloudinary-default-publicid

    no one will correct some one else source code can u see 1 month zero answer

    i am learning developing but I am sure there is problem in this source code

    and problem at creating post after user sign up to the website

    opened by am0029 1
  • Bump vite from 2.9.12 to 2.9.13 in /client

    Bump vite from 2.9.12 to 2.9.13 in /client

    Bumps vite from 2.9.12 to 2.9.13.

    Changelog

    Sourced from vite's changelog.

    2.9.13 (2022-06-27)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump minimist from 1.2.5 to 1.2.6 in /server

    Bump minimist from 1.2.5 to 1.2.6 in /server

    Bumps minimist from 1.2.5 to 1.2.6.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump ansi-regex from 4.1.0 to 4.1.1 in /server

    Bump ansi-regex from 4.1.0 to 4.1.1 in /server

    Bumps ansi-regex from 4.1.0 to 4.1.1.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump mongoose from 6.0.11 to 6.4.6 in /server

    Bump mongoose from 6.0.11 to 6.4.6 in /server

    Bumps mongoose from 6.0.11 to 6.4.6.

    Release notes

    Sourced from mongoose's releases.

    6.4.6 / 2022-07-20

    • fix(schema): disallow setting proto when creating schema with dotted properties #12085
    • fix(document): avoid mutating original object passed to $set() when applying defaults to nested properties #12102
    • fix(query): apply lean transform option to top-level document #12093
    • docs(migrating_to_6): correct example for isObjectIdOrHexString() #12123 LokeshKanumoori

    6.4.5 / 2022-07-18

    • fix(model+timestamps): set timestamps on subdocuments in insertMany() #12060
    • fix: correct isAtlas check #12110 skrtheboss
    • fix(types): fix various issues with auto typed schemas #12042 mohammad0-0ahmad
    • fix(types): allow any value for AddFields #12096
    • fix(types): allow arbitrary expressions for ConcatArrays #12058
    • fix(types): make $addToSet fields mutable to allow programatically constructing $addToSet #12091
    • fix(types): add $let as a possible expression to $addFields #12087 AbdelrahmanHafez
    • fix(types): fix $switch expression type #12088 AbdelrahmanHafez
    • fix(types): correct options type for syncIndexes() #12101 lpizzinidev
    • fix(types): avoid treating | undefined types as any in Require_id to better support _id: String with auto-typed schemas #12070
    • docs: fix up various jsdoc issues #12086 hasezoey
    • docs: add sanitizeFilter to mongoose.set() options #12112 pathei-kosmos

    6.4.4 / 2022-07-08

    6.4.3 / 2022-07-05

    • fix(document): handle validating deeply nested subdocuments underneath nested paths with required: false #12021
    • fix(types): infer schematype type from schema paths when calling SchemaType.path() #11987
    • fix(types): add $top and $topN aggregation operators #12053
    • fix(types): clean up a couple of issues with $add and $ifNull #12017
    • fix(types): allow $cond with $in #12028
    • docs: add path level descending index example in docs #12023 MitchellCash
    • docs: add Buffer, Decimal128, Map to docs #11971

    6.4.2 / 2022-07-01

    • fix: keep autoIndex & autoCreate as true by default if read preference is primaryPreferred #11976
    • fix(types): improve inferred Schema Type to handle nested paths and ObjectIds #12007 iammola
    • fix(types): avoid inferring doc type from param to create() #12001
    • fix(types): make populate Paths generic consistently overwrite doc interface #11955
    • fix(types): allow null at ne expression second parameter #11996 jyeros
    • fix(types): change index "weights" to be more explicit #11997 hasezoey

    6.4.1 / 2022-06-27

    ... (truncated)

    Changelog

    Sourced from mongoose's changelog.

    6.4.6 / 2022-07-20

    • fix(schema): disallow setting proto when creating schema with dotted properties #12085
    • fix(document): avoid mutating original object passed to $set() when applying defaults to nested properties #12102
    • fix(query): apply lean transform option to top-level document #12093
    • docs(migrating_to_6): correct example for isObjectIdOrHexString() #12123 LokeshKanumoori

    6.4.5 / 2022-07-18

    • fix(model+timestamps): set timestamps on subdocuments in insertMany() #12060
    • fix: correct isAtlas check #12110 skrtheboss
    • fix(types): fix various issues with auto typed schemas #12042 mohammad0-0ahmad
    • fix(types): allow any value for AddFields #12096
    • fix(types): allow arbitrary expressions for ConcatArrays #12058
    • fix(types): make $addToSet fields mutable to allow programatically constructing $addToSet #12091
    • fix(types): add $let as a possible expression to $addFields #12087 AbdelrahmanHafez
    • fix(types): fix $switch expression type #12088 AbdelrahmanHafez
    • fix(types): correct options type for syncIndexes() #12101 lpizzinidev
    • fix(types): avoid treating | undefined types as any in Require_id to better support _id: String with auto-typed schemas #12070
    • docs: fix up various jsdoc issues #12086 hasezoey
    • docs: add sanitizeFilter to mongoose.set() options #12112 pathei-kosmos

    6.4.4 / 2022-07-08

    6.4.3 / 2022-07-05

    • fix(document): handle validating deeply nested subdocuments underneath nested paths with required: false #12021
    • fix(types): infer schematype type from schema paths when calling SchemaType.path() #11987
    • fix(types): add $top and $topN aggregation operators #12053
    • fix(types): clean up a couple of issues with $add and $ifNull #12017
    • fix(types): allow $cond with $in #12028
    • docs: add path level descending index example in docs #12023 MitchellCash
    • docs: add Buffer, Decimal128, Map to docs #11971

    6.4.2 / 2022-07-01

    • fix: keep autoIndex & autoCreate as true by default if read preference is primaryPreferred #11976
    • fix(types): improve inferred Schema Type to handle nested paths and ObjectIds #12007 iammola
    • fix(types): avoid inferring doc type from param to create() #12001
    • fix(types): make populate Paths generic consistently overwrite doc interface #11955
    • fix(types): allow null at ne expression second parameter #11996 jyeros
    • fix(types): change index "weights" to be more explicit #11997 hasezoey

    6.4.1 / 2022-06-27

    ... (truncated)

    Commits
    • 5449ab9 chore: release 6.4.6
    • b8c99cf Merge pull request #11892 from Automattic/netlify-functions-example
    • 2751883 fix tests
    • eced2c7 Merge branch 'master' into netlify-functions-example
    • 92cb6fb Merge branch 'master' into vkarpov15/gh-12085
    • 422f9da test(schema): add coverage for calling plugin() with options
    • 2262a77 fix(document): avoid mutating original object passed to $set() when applying ...
    • 2e6b064 made requested changes
    • b70a0dc Merge pull request #12123 from LokeshKanumoori/patch-1
    • 086bd9f fix(query): apply lean transform option to top-level document
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
Owner
Marwan mostafa
Hello there, An 18 years old Fullstack developer Specialized in Frontend development based in Egypt. I have almost 4 years of experience in web development.
Marwan mostafa
An example repository on how to start building graph applications on streaming data. Just clone and start building 💻 💪

Example Streaming App ?? ?? This repository serves as a point of reference when developing a streaming application with Memgraph and a message broker

Memgraph 40 Dec 20, 2022
A Gmail Clone which built with ReactJS and Redux. You can sign in with your Google Account, compose a new e-mail and send realtime emails to the project.

Gmail Clone with ReactJS A Gmail Clone that you can sign in with your Google Account, compose a new e-mail and send realtime emails to the project. Cl

Özge Coşkun Gürsucu 49 Nov 14, 2022
Uniswapv2-pool-funding - A "Nugget Standard for Funding" compliant smart contract to provide liquidity to UniswapV2 (clone) pools. (Quickswap in this case)

uniswap(clone)-v2-pool-funding A smart contract that makes it easy to: supply liquidity to a uniswap(clone)-v2 pool using ERC20 or the network native

null 2 May 14, 2022
Dev.to clone

Dev.to-clone A Dev.to clone created with MERN stack and more (Essentially FB without stories feature) Tech used with vite ?? : Frontend React Redux to

Marwan mostafa 64 Dec 13, 2022
Twitter-Clone-Nextjs - Twitter Clone Built With React JS, Next JS, Recoil for State Management and Firebase as Backend

Twitter Clone This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn de

Basudev 0 Feb 7, 2022
LinkedIn-Clone - a LinkedIn clone with firebase, redux and styled components

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: ya

Asher Price 1 Jan 3, 2022
quickly start your Vue dev server

vue-fast-dev-server 10倍缩短您的vue dev server启动时间 安装 npm install vue-fast-dev-server --save-dev vue.config.js const path = require('path') module.exports

null 22 Feb 28, 2022
Japanese translation of vitejs.dev

Vite Docs JA Vite ドキュメントの日本語翻訳レポジトリです。現状、本レポジトリは翻訳作業用のものとして一時的に用意されています。将来的に、本レポジトリは別場所に移動される可能性があります。 貢献ガイド Vite 日本語翻訳ガイド を一読お願いします! はじめかた 本ドキュメントは V

vite 50 Dec 14, 2022
Data lake for dev.

Dev Lake What is Dev Lake? Dev Lake is the one-stop solution that integrates, analyzes, and visualizes the development data throughout the software de

Merico 78 Dec 30, 2022
Solana blockchain candy machine app boilerplate on top of Metaplex Candy Machine. NextJS, Tailwind, Anchor, SolanaLabs.React, dev/mainnet automation scripts.

NFT Candy Factory NOTE: This repo will prob only work on unix-based environments. The NFT Candy Factory project is designed to let users fork, customi

Kevin Faveri 261 Dec 30, 2022
Small (fragile) script for migrating comments from dev.to posts to Wordpress format (WXR/XML)

dev-to-wxr Small (fragile) script for migrating comments from dev.to posts to Wordpress format (WXR/XML). Useful for importing in tools like disqus. U

Fahad Hossain 2 Jan 29, 2022
Personal repository for adventjs.dev

?? My adventjs commented solutions ?? adventjs.dev is a platform developed by where you can practice your JavaScript skills via challenges as an adven

Álvaro Rivas 12 Dec 3, 2022
Blog - ⚡️ Blog pessoal onde publico artigos relacionados a dev. Desenvolvido com Next.js e TailwindCSS

⚡️ Blog Blog pessoal desenvolvido com Next.js e TypeScript ℹ️ Sobre o projeto Este projeto consiste em um blog pessoal, onde futuramente farei posts d

Caio Augusto 2 Oct 6, 2022
Stepzen-sveltekit - An Example Blog with SvelteKit, the DEV API, and a StepZen GraphQL Backend.

Building a Serverless Blog with StepZen, SvelteKit, and the DEV API SvelteKit is a serverless first Svelte metaframework for building web applications

Anthony Campolo 0 Jan 17, 2022
Dev Guide for Archival Node & Indexer Setup

Algorand - The Undocumented Docs Dev Notes for Archival Node, Indexer Setup (and more) Archival Node FAQ [ ? ] How much space will I need? See -> http

null 5 May 23, 2022
Unstyled, dev error overlays for SolidJS

solid-error-overlay Unstyled, headless Error Overlay for SolidJS Install npm i solid-error-overlay yarn add solid-error-overlay pnpm add solid-error-o

Alexis H. Munsayac 20 Dec 29, 2022
vota.dev - Vote the best web development trends of the year

vota.dev Welcome to vota.dev! This is a work in progress! Development GitHub - Set-Up an OAuth Application Using Railway Development Install the proje

Miguel Ángel Durán 97 Dec 28, 2022
LunaSec - Open Source Security Software built by Security Engineers. Scan your dependencies for Log4Shell, or add Data Tokenization to prevent data leaks. Try our live Tokenizer demo: https://app.lunasec.dev

Our Software We're a team of Security Engineers on a mission to make awesome Open Source Application Security tooling. It all lives in this repo. Here

LunaSec 1.2k Jan 7, 2023
Tool for publishing posts to mitchinson.dev from a Notion database

Notion Publish Tool - publish.mitchinson.dev A publishing API for mirroring Notion posts to mitchinson.dev Includes: Asset uploading to Cloudinary CDN

Ben Mitchinson 6 Dec 23, 2022
In game dev, generative art, and creative coding, sine is a ubiquitous function that is often used as a spring-like oscillator for a given parameter.

In game dev, generative art, and creative coding, sine is a ubiquitous function that is often used as a spring-like oscillator for a given parameter.

Mark Racette 3 Feb 22, 2022