<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Andy Feliciotti</title>
	<atom:link href="https://drawne.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://drawne.com/</link>
	<description>Portfolio of Andy Feliciotti</description>
	<lastBuildDate>Fri, 29 May 2026 12:09:14 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://drawne.com/wp-content/uploads/2018/11/cropped-icon-32x32.jpg</url>
	<title>Andy Feliciotti</title>
	<link>https://drawne.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Claude Code Commands: The Ones I Actually Use</title>
		<link>https://drawne.com/claude-code-commands/</link>
					<comments>https://drawne.com/claude-code-commands/#respond</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Sat, 02 May 2026 21:28:13 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tutorials]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=3378</guid>

					<description><![CDATA[<p>A practical guide to the Claude Code commands I actually use day to day, plus an honest section on --dangerously-skip-permissions: what it really skips, what it doesn't, and when it's actually safe to use.</p>
<p>The post <a href="https://drawne.com/claude-code-commands/">Claude Code Commands: The Ones I Actually Use</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I&#8217;ve been running Claude Code as my main coding tool for most of the past year. Most of the work I do at <a href="https://rightblogger.com/" data-wpel-link="exclude">RightBlogger</a> and on the small product sites I run goes through it at some point. There are around 95 commands at this point, but the actual list I touch in a given week is much smaller.</p>


<p class="wp-block-paragraph">This is that list, plus an honest section on <strong><code>--dangerously-skip-permissions</code></strong>, which is the flag everyone wants to know about and almost nobody uses correctly.</p>


<h2 class="wp-block-heading">How commands work in Claude Code</h2>


<p class="wp-block-paragraph">Inside a session, type <code>/</code> to see every command available, or type <code>/</code> followed by a few letters to filter. A command is only recognized at the very start of your message; anything after the command name is passed as arguments.</p>


<p class="wp-block-paragraph">Two things to know up front. First, <strong>slash commands and skills now use the same system</strong>. The official commands reference splits them into &#8220;built-in commands&#8221; (behavior coded into the CLI, like <strong><code>/clear</code></strong> and <strong><code>/model</code></strong>) and &#8220;bundled skills&#8221; (prompt-driven, like <strong><code>/simplify</code></strong> and <strong><code>/debug</code></strong>), but you invoke both the same way. If you put a file at <code>.claude/commands/deploy.md</code> or a skill at <code>.claude/skills/deploy/SKILL.md</code>, both create <strong><code>/deploy</code></strong>.</p>


<p class="wp-block-paragraph">Second, not every command shows up for every user. Availability depends on your plan, OS, and environment. <strong><code>/desktop</code></strong> only shows on macOS and Windows when you&#8217;re signed in with a Claude subscription. <strong><code>/upgrade</code></strong> only shows on Pro and Max plans. If a command in this post isn&#8217;t there for you, that&#8217;s why.</p>


<p class="wp-block-paragraph">Everything below is from the official <a href="https://code.claude.com/docs/en/commands" data-wpel-link="external" rel="nofollow external noopener noreferrer">commands reference</a> and the <a href="https://code.claude.com/docs/en/permissions" data-wpel-link="external" rel="nofollow external noopener noreferrer">permissions docs</a>, tested against Claude Code 2.1.142.</p>


<h2 class="wp-block-heading">The ones I run constantly</h2>


<p class="wp-block-paragraph">These are the ten or so commands that earn their muscle memory.</p>


<h3 class="wp-block-heading">Context management: /clear, /compact, /context</h3>


<p class="wp-block-paragraph"><strong><code>/clear</code></strong> starts a new conversation with an empty context. The previous one stays available in <strong><code>/resume</code></strong>. Pass an optional name (<strong><code>/clear notes</code></strong>) to label the previous conversation in the resume picker so it&#8217;s easier to find later. Aliases: <strong><code>/reset</code></strong>, <strong><code>/new</code></strong>.</p>


<p class="wp-block-paragraph"><strong><code>/compact [instructions]</code></strong> is different. It keeps the same conversation but summarizes it to free up context. Pass focus instructions if you want the summary biased toward something specific. Use this when you&#8217;re mid-task and the context bar is getting hot.</p>


<p class="wp-block-paragraph"><strong><code>/context</code></strong> shows current context usage as a colored grid, with suggestions for what&#8217;s eating the most. I use it whenever a session starts feeling sluggish to figure out which tool or memory file is bloating things.</p>


<h3 class="wp-block-heading">Sessions: /resume, /branch, /rewind</h3>


<p class="wp-block-paragraph"><strong><code>/resume [session]</code></strong> (alias <strong><code>/continue</code></strong>) jumps back into a previous conversation. With no argument, it opens a picker.</p>


<p class="wp-block-paragraph"><strong><code>/branch [name]</code></strong> creates a branch of the current conversation at this point. You can explore one approach, then <strong><code>/resume</code></strong> back to the branch point and try a different one without losing the original. Alias: <strong><code>/fork</code></strong>. (If you set the <code>CLAUDE_CODE_FORK_SUBAGENT</code> env var, <strong><code>/fork</code></strong> instead spawns a forked subagent and stops being an alias for <strong><code>/branch</code></strong>.)</p>


<p class="wp-block-paragraph"><strong><code>/rewind</code></strong> is checkpointing. Roll back the conversation, the code, or both, to a previous point, or summarize from a selected message. Aliases: <strong><code>/checkpoint</code></strong>, <strong><code>/undo</code></strong>. This one feels weird the first time and indispensable after.</p>


<h3 class="wp-block-heading">Models and effort: /model, /effort</h3>


<p class="wp-block-paragraph"><strong><code>/model [model]</code></strong> switches the model for the session. With no argument, it opens a picker.</p>


<p class="wp-block-paragraph"><strong><code>/effort [level]</code></strong> controls how much reasoning the model uses. Accepts <code>low</code>, <code>medium</code>, <code>high</code>, <code>xhigh</code>, <code>max</code>, or <code>ultracode</code>. <code>max</code> and <code>ultracode</code> are session-only, and the available levels depend on the model you&#8217;re on. <code>ultracode</code> is a Claude Code setting that pairs <code>xhigh</code> reasoning with automatic workflow orchestration. Run with no argument to get an interactive slider. Both of these take effect immediately, without waiting for the current response to finish, which is the kind of small detail you only appreciate after living without it.</p>


<h3 class="wp-block-heading">Diffs and reviews: /diff, /review, /security-review</h3>


<p class="wp-block-paragraph"><strong><code>/diff</code></strong> opens an interactive diff viewer for uncommitted changes and per-turn diffs. Left and right arrows switch between the current git diff and individual Claude turns; up and down browse files. This is what I use to actually read what just happened before I trust it.</p>


<p class="wp-block-paragraph"><strong><code>/review [PR]</code></strong> reviews a pull request locally in the current session. For deeper cloud-based reviews there&#8217;s <strong><code>/code-review ultra</code></strong> (with <strong><code>/ultrareview</code></strong> remaining as an alias), which includes 3 free runs on Pro and Max before tapping usage credits and isn&#8217;t something Claude can launch on its own.</p>


<p class="wp-block-paragraph"><strong><code>/security-review</code></strong> analyzes pending changes on the current branch for things like injection, auth issues, and data exposure. Worth running before any PR that touches request handling.</p>


<h3 class="wp-block-heading">File access: /permissions, /add-dir</h3>


<p class="wp-block-paragraph"><strong><code>/permissions</code></strong> (alias <strong><code>/allowed-tools</code></strong>) opens an interactive dialog for managing allow, ask, and deny rules. You can view rules by scope, add or remove them, and review recent auto-mode denials. This is the single command most worth learning if you want to stop being prompted for the same Bash variations forty times a day.</p>


<p class="wp-block-paragraph"><strong><code>/add-dir &lt;path&gt;</code></strong> adds a working directory for file access during the current session. Worth knowing: most <code>.claude/</code> configuration in the added directory is <strong>not</strong> loaded as configuration, just as files. The exceptions are skills in <code>.claude/skills/</code>, which do get picked up with live reload.</p>


<h2 class="wp-block-heading">The ones worth knowing exist</h2>


<p class="wp-block-paragraph">These don&#8217;t earn daily slots, but they&#8217;re the ones I reach for when the situation calls for them.</p>


<ul class="wp-block-list">
<li><strong><code>/init</code></strong> initializes a project with a <code>CLAUDE.md</code> guide. Set <code>CLAUDE_CODE_NEW_INIT=1</code> for an interactive flow that also walks through skills, hooks, and personal memory files.</li>


<li><strong><code>/memory</code></strong> edits <code>CLAUDE.md</code> files, enables or disables auto-memory, and views auto-memory entries.</li>


<li><strong><code>/agents</code></strong> manages subagent configurations.</li>


<li><strong><code>/plan [description]</code></strong> enters plan mode directly from the prompt. Pass a description to start with that task immediately, like <strong><code>/plan fix the auth bug</code></strong>.</li>


<li><strong><code>/goal [condition]</code></strong> is a newer one I&#8217;ve been enjoying. Set a condition (&#8220;all tests pass,&#8221; &#8220;every endpoint returns 401 for unauthenticated requests,&#8221; &#8220;no TypeScript errors&#8221;) and Claude keeps working across turns until it&#8217;s met. With no argument, it shows the current or most recently achieved goal. Pass <code>clear</code>, <code>stop</code>, <code>off</code>, <code>reset</code>, <code>none</code>, or <code>cancel</code> to drop an active goal early. What I like about it is the simplicity: it just keeps working until the thing you asked for is done.</li>


<li><strong><code>/simplify [target]</code></strong> is a bundled skill that reviews recently changed files for reuse, simplification, efficiency, and whether the change sits at the right level of abstraction, then applies the fixes. Four review agents run in parallel and their findings get aggregated.</li>


<li><strong><code>/debug [description]</code></strong> enables debug logging for the current session and troubleshoots issues by reading the session debug log. Worth knowing that debug logging is off by default unless you started with <code>claude --debug</code>, so running <strong><code>/debug</code></strong> mid-session captures logs from that point forward, not earlier.</li>


<li><strong><code>/loop [interval] [prompt]</code></strong> runs a prompt repeatedly while the session stays open. Omit the interval and Claude self-paces. Example: <strong><code>/loop 5m check if the deploy finished</code></strong>.</li>


<li><strong><code>/schedule [description]</code></strong> (alias <strong><code>/routines</code></strong>) creates, updates, lists, or runs scheduled remote agents. Useful for the &#8220;remind me to clean up that feature flag in two weeks&#8221; pattern.</li>


<li><strong><code>/usage</code></strong> (aliases <strong><code>/cost</code></strong>, <strong><code>/stats</code></strong>) shows session cost, plan usage limits, and activity stats. On Pro, Max, Team, or Enterprise plans, it also breaks down usage by skill, subagent, plugin, and MCP server.</li>


<li><strong><code>/export [filename]</code></strong> exports the current conversation as plain text. With a filename, writes directly; without, opens a copy/save dialog.</li>


<li><strong><code>/copy [N]</code></strong> copies the last assistant response to the clipboard. Pass <code>N</code> to copy the Nth latest. With code blocks present, you get an interactive picker. Press <code>w</code> in the picker to write the selection to a file instead, which is genuinely useful over SSH.</li>


<li><strong><code>/mcp</code></strong> manages MCP server connections and OAuth.</li>


<li><strong><code>/plugin</code></strong> manages plugins. <strong><code>/reload-plugins</code></strong> reloads all active plugins to apply pending changes without restarting.</li>


<li><strong><code>/doctor</code></strong> diagnoses your Claude Code installation. Press <code>f</code> to have Claude fix any reported issues.</li>


<li><strong><code>/insights</code></strong> analyzes your sessions and reports on project areas, interaction patterns, and friction points.</li>

</ul>


<h2 class="wp-block-heading">The dangerous one</h2>


<p class="wp-block-paragraph">Now the section everyone scrolls to: <strong><code>--dangerously-skip-permissions</code></strong>.</p>


<p class="wp-block-paragraph">This is a CLI flag, not a slash command. You start a session with it:</p>


<pre class="wp-block-code"><code>claude --dangerously-skip-permissions</code></pre>


<p class="wp-block-paragraph">It puts the session in <code>bypassPermissions</code> permission mode, which skips all the per-tool approval prompts. No more &#8220;Allow Bash to run npm install?&#8221; No more accept-edit dialog. Claude just goes.</p>


<p class="wp-block-paragraph">There&#8217;s also a related flag, <strong><code>--allow-dangerously-skip-permissions</code></strong>, that doesn&#8217;t enable bypass mode but allows it as an option (so you can flip into it with <strong><code>--permission-mode bypassPermissions</code></strong> later). Anthropic recommends the latter only for sandboxes with no internet access.</p>


<h3 class="wp-block-heading">What it actually skips</h3>


<p class="wp-block-paragraph">According to the <a href="https://code.claude.com/docs/en/permissions" data-wpel-link="external" rel="nofollow external noopener noreferrer">permissions documentation</a>, <code>bypassPermissions</code> mode skips all permission prompts, including writes to <code>.git</code>, <code>.claude</code>, <code>.vscode</code>, <code>.idea</code>, and <code>.husky</code>. Those are the directories most people assume are protected and aren&#8217;t.</p>


<p class="wp-block-paragraph">That means if you&#8217;re running this in a real project, Claude can rewrite your local git history, edit your editor settings, modify your husky hooks, and overwrite your own <code>.claude/</code> config without asking. None of those will trigger a prompt.</p>


<h3 class="wp-block-heading">What it doesn&#8217;t skip</h3>


<p class="wp-block-paragraph">There is one circuit breaker. Removals targeting the filesystem root or your home directory, like <code>rm -rf /</code> or <code>rm -rf ~</code>, still prompt regardless of the mode. The docs frame this as a guard against model error, not user error. So you&#8217;re not going to wipe your machine in a single tool call without seeing a dialog first.</p>


<p class="wp-block-paragraph">Hooks are also still respected. A PreToolUse hook that exits with code 2 still blocks the call. So if you have your own guardrails wired up, they keep working.</p>


<h3 class="wp-block-heading">When I actually use it</h3>


<p class="wp-block-paragraph">My honest take: with a strong model like Claude Opus 4.7, this flag is more usable than its name implies. Opus is unlikely to wander off and do something catastrophic on its own. I do run sessions with bypass mode on for routine work where I&#8217;m watching what&#8217;s happening, and the friction reduction is real.</p>


<p class="wp-block-paragraph">The risk isn&#8217;t the model freelancing. The risk is one bad prompt from you. Ask Claude to &#8220;clean up that directory&#8221; ambiguously, drop bypass on, and you can lose work. Tell it to &#8220;reset the database&#8221; without specifying which one, and it&#8217;ll happily run the destructive command against whatever connection your local env is pointed at. Worst case, a single typo or unclear instruction in a bypass session can delete files you care about, drop a database, or do something genuinely worse if the session has access to production credentials. The flag removes the safety net that would have caught any of that.</p>


<p class="wp-block-paragraph">So a better framing than &#8220;never use it&#8221; is: use it with a strong model, in a project where you&#8217;ve thought about the blast radius, and only after you trust yourself to write prompts that are unambiguous about destructive operations. The rules I run with:</p>


<ul class="wp-block-list">
<li>Don&#8217;t run bypass mode in a directory holding uncommitted work I&#8217;d hate to lose.</li>


<li>Don&#8217;t run bypass mode in any session that has access to a production database, S3 bucket, or live API key.</li>


<li>Never paste a prompt I haven&#8217;t read carefully into a bypass session.</li>


<li>Anthropic&#8217;s own recommendation, &#8220;isolated environments like containers or VMs where Claude Code cannot cause damage,&#8221; is still the safest bar to hit when the project allows it.</li>

</ul>


<p class="wp-block-paragraph">If those constraints don&#8217;t fit a particular project, the lower-risk paths below get you most of the friction reduction without the full liability:</p>


<ul class="wp-block-list">
<li><strong><code>/permissions</code></strong> to allow specific commands you trust. Spend ten minutes setting up <code>Bash(npm run *)</code>, <code>Bash(git status *)</code>, <code>Bash(jest *)</code>, and the prompts go away.</li>


<li>The <strong><code>/fewer-permission-prompts</code></strong> skill, which scans your transcripts for common read-only Bash and MCP calls and adds a prioritized allowlist to your project&#8217;s <code>.claude/settings.json</code>.</li>


<li><strong><code>/sandbox</code></strong> to toggle sandbox mode (on supported platforms). When sandboxing is enabled with <code>autoAllowBashIfSandboxed: true</code> (the default), sandboxed Bash commands run without prompting. The sandbox boundary substitutes for the per-command prompt, which is a much safer trade than blanket bypass.</li>


<li><code>acceptEdits</code> mode, which auto-accepts file edits and common filesystem commands like <code>mkdir</code>, <code>touch</code>, <code>mv</code>, and <code>cp</code> for paths in your working directory. Most of the friction without most of the risk.</li>

</ul>


<h3 class="wp-block-heading">How orgs lock it down</h3>


<p class="wp-block-paragraph">If you run a team and don&#8217;t want anyone using bypass mode, set <code>permissions.disableBypassPermissionsMode</code> to <code>"disable"</code> in <a href="https://code.claude.com/docs/en/settings" data-wpel-link="external" rel="nofollow external noopener noreferrer">managed settings</a>. That blocks the mode regardless of what individual users put in their own settings. The <strong><code>--dangerously-skip-permissions</code></strong> flag will still parse, but the mode won&#8217;t activate. Worth setting if Claude Code is going on company laptops with access to anything sensitive.</p>


<h2 class="wp-block-heading">Custom commands are just skills now</h2>


<p class="wp-block-paragraph">If you find yourself pasting the same instructions into chat, or your <code>CLAUDE.md</code> file has grown a section that&#8217;s really a procedure, that procedure should be a skill.</p>


<p class="wp-block-paragraph">The minimum is a directory with a <code>SKILL.md</code> file. Drop it at <code>~/.claude/skills/&lt;name&gt;/SKILL.md</code> for personal use across every project, or <code>.claude/skills/&lt;name&gt;/SKILL.md</code> for a single project. The directory name becomes the command. Add YAML frontmatter with a <code>description</code>, and Claude can also load the skill automatically when the description matches what you&#8217;re asking.</p>


<p class="wp-block-paragraph">A useful pattern is the <code>!</code> prefix to inject live shell output into a skill before Claude reads it:</p>


<pre class="wp-block-code"><code>---
description: Summarize uncommitted changes and flag risky ones.
---

## Current changes

!`git diff HEAD`

## Instructions

Summarize the diff in two or three bullets. Flag missing error handling, hardcoded values, or tests that need updating.</code></pre>


<p class="wp-block-paragraph">When you run <strong><code>/summarize-changes</code></strong>, Claude Code runs <code>git diff HEAD</code> first, replaces the placeholder with the output, and only then sends the prompt. The instructions arrive with the actual diff already inlined.</p>


<p class="wp-block-paragraph">The full reference is in the <a href="https://code.claude.com/docs/en/skills" data-wpel-link="external" rel="nofollow external noopener noreferrer">skills documentation</a>. I built a few of these for the WordPress sites I run, and the time savings vs pasting the same checklist into chat are real.</p>


<h2 class="wp-block-heading">Skills worth installing</h2>


<p class="wp-block-paragraph">The good thing about skills being a shared format is you don&#8217;t have to write your own to benefit. There&#8217;s now a directory at <a href="https://skills.sh/" data-wpel-link="external" rel="nofollow external noopener noreferrer">skills.sh</a> where developers publish reusable skills for Claude Code, Cursor, Cline, and other agents. A few I keep installed:</p>


<ul class="wp-block-list">
<li><a href="https://skills.sh/meodai/skill.color-expert/color-expert" data-wpel-link="external" rel="nofollow external noopener noreferrer"><code>color-expert</code></a> by meodai. Color naming, theory, palettes, ramps, gradients, conversions, accessibility. The kind of knowledge I don&#8217;t want to keep re-explaining to an agent every time I&#8217;m picking colors.</li>


<li><a href="https://skills.sh/emilkowalski/skill/emil-design-eng" data-wpel-link="external" rel="nofollow external noopener noreferrer"><code>emil-design-eng</code></a> by Emil Kowalski. Encodes Emil&#8217;s philosophy on UI polish, component design, animation decisions, and the small details that make software feel good. If you&#8217;ve ever stared at one of Emil&#8217;s components on Twitter and wondered how he gets motion to feel that way, this is the closest thing to a transferable answer.</li>


<li><a href="https://skills.sh/jakubkrehel/make-interfaces-feel-better/make-interfaces-feel-better" data-wpel-link="external" rel="nofollow external noopener noreferrer"><code>make-interfaces-feel-better</code></a> by Jakub Krehel. Design engineering principles for hover states, micro-interactions, and the kind of polish that takes a UI from working to nice.</li>

</ul>


<p class="wp-block-paragraph">If you want to find more, <a href="https://skills.sh/" data-wpel-link="external" rel="nofollow external noopener noreferrer">skills.sh</a> itself has a <code>find-skills</code> skill you can install that helps you discover others when you describe what you&#8217;re trying to do. Mildly recursive but useful.</p>


<h2 class="wp-block-heading">Quick reference</h2>


<p class="wp-block-paragraph">If you just want the categorical list:</p>


<ul class="wp-block-list">
<li>Context tools: <strong><code>/clear</code></strong>, <strong><code>/compact</code></strong>, <strong><code>/context</code></strong></li>


<li>Sessions: <strong><code>/resume</code></strong>, <strong><code>/branch</code></strong>, <strong><code>/rewind</code></strong></li>


<li>Model and effort: <strong><code>/model</code></strong>, <strong><code>/effort</code></strong>, <strong><code>/fast</code></strong></li>


<li>Reviewing changes: <strong><code>/diff</code></strong>, <strong><code>/review</code></strong>, <strong><code>/security-review</code></strong>, <strong><code>/ultrareview</code></strong></li>


<li>Permissions and access: <strong><code>/permissions</code></strong>, <strong><code>/add-dir</code></strong>, <strong><code>/sandbox</code></strong></li>


<li>Project setup: <strong><code>/init</code></strong>, <strong><code>/memory</code></strong>, <strong><code>/agents</code></strong>, <strong><code>/skills</code></strong>, <strong><code>/hooks</code></strong></li>


<li>Workflow: <strong><code>/plan</code></strong>, <strong><code>/goal</code></strong>, <strong><code>/loop</code></strong>, <strong><code>/schedule</code></strong>, <strong><code>/simplify</code></strong>, <strong><code>/debug</code></strong>, <strong><code>/fewer-permission-prompts</code></strong></li>


<li>Visibility: <strong><code>/usage</code></strong>, <strong><code>/insights</code></strong>, <strong><code>/status</code></strong>, <strong><code>/doctor</code></strong></li>


<li>Output: <strong><code>/copy</code></strong>, <strong><code>/export</code></strong>, <strong><code>/recap</code></strong></li>


<li>Integrations: <strong><code>/mcp</code></strong>, <strong><code>/plugin</code></strong>, <strong><code>/reload-plugins</code></strong>, <strong><code>/install-github-app</code></strong>, <strong><code>/install-slack-app</code></strong></li>


<li>Session UI: <strong><code>/theme</code></strong>, <strong><code>/color</code></strong>, <strong><code>/focus</code></strong>, <strong><code>/tui</code></strong>, <strong><code>/statusline</code></strong></li>


<li>The dangerous flag, CLI only: <strong><code>--dangerously-skip-permissions</code></strong></li>

</ul>


<p class="wp-block-paragraph">That&#8217;s not all of them. The complete list is in the <a href="https://code.claude.com/docs/en/commands" data-wpel-link="external" rel="nofollow external noopener noreferrer">official commands reference</a>, and it changes often enough that I&#8217;d check it before relying on anything not covered here.</p>

<p>The post <a href="https://drawne.com/claude-code-commands/">Claude Code Commands: The Ones I Actually Use</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/claude-code-commands/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to Block Disposable Emails with JavaScript (Code Snippet)</title>
		<link>https://drawne.com/block-disposable-emails/</link>
					<comments>https://drawne.com/block-disposable-emails/#respond</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Fri, 01 Nov 2024 22:47:37 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=3323</guid>

					<description><![CDATA[<p>If you&#8217;re dealing with fake or temporary emails in your sign-up forms, you know they create issues. Whether it&#8217;s clogging up your database, wasting resources, or spamming. We see a lot of bogus signups on RightBlogger for people trying to abuse our free tier. So I thought I would share some of my best tips ... </p>
<p class="read-more-container"><a title="How to Block Disposable Emails with JavaScript (Code Snippet)" class="read-more button" href="https://drawne.com/block-disposable-emails/#more-3323" aria-label="Read more about How to Block Disposable Emails with JavaScript (Code Snippet)" data-wpel-link="internal">Read more</a></p>
<p>The post <a href="https://drawne.com/block-disposable-emails/">How to Block Disposable Emails with JavaScript (Code Snippet)</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">If you&#8217;re dealing with <strong>fake or temporary emails</strong> in your sign-up forms, you know they create issues. Whether it&#8217;s clogging up your database, wasting resources, or spamming.</p>



<p class="wp-block-paragraph">We see a lot of bogus signups on <a href="https://rightblogger.com/" data-wpel-link="exclude">RightBlogger</a> for people trying to abuse our free tier. So I thought I would share some of my best tips and insights.</p>



<p class="wp-block-paragraph">In this post, I&#8217;ll show you <strong>how to block disposable emails using JavaScript</strong> with a few API calls. This runs server-side, so your API keys stay private. No matter your programming language, some of the tips here will still apply.</p>



<p class="wp-block-paragraph">This method is useful if you want to keep things clean and prevent users from abusing sign-ups with throwaway accounts. Let&#8217;s get into it.</p>



<h2 class="wp-block-heading">Full Code Snippet to Block Disposable Emails</h2>



<p class="wp-block-paragraph">Since you&#8217;re here for the code, here&#8217;s the full snippet I use to check for disposable emails with a few API calls:</p>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
<script src="https://gist.github.com/someguy9/d3715246e91d55b6752f2c75fd81a986.js"></script>
</div></figure>



<h2 class="wp-block-heading">How it Works</h2>



<p class="wp-block-paragraph">The snippet runs three checks in sequence. Each API catches different things, so combining them covers more ground than any single check would.</p>



<p class="wp-block-paragraph"><strong>Debounce.io</strong> (free): Checks whether the email domain is a known disposable provider. Get a free API key at <a href="https://debounce.io/" data-wpel-link="external" rel="nofollow external noopener noreferrer">debounce.io</a>. No credit card required.</p>



<p class="wp-block-paragraph"><strong>VerifyMail.io</strong> (optional, paid): A secondary check that confirms whether the domain is associated with throwaway addresses. Useful if you want extra coverage beyond Debounce. Sign up at <a href="https://verifymail.io/" data-wpel-link="external" rel="nofollow external noopener noreferrer">verifymail.io</a>.</p>



<p class="wp-block-paragraph"><strong>StopForumSpam</strong> (free): Cross-references the email and IP against a database of known spammers. No API key needed. It&#8217;s especially good at catching repeat abusers who rotate disposable emails but reuse the same IP.</p>



<p class="wp-block-paragraph">One thing worth knowing: running three sequential API calls adds a small delay at signup. If latency matters to you, run Debounce and StopForumSpam in parallel with <code>Promise.all()</code> and only call VerifyMail as a fallback. Most signups get flagged by one of the free checks anyway.</p>



<h2 class="wp-block-heading">Additional Checks for Users Signing Up</h2>



<p class="wp-block-paragraph">Even with these APIs, people are persistent. Here are a few more things you can layer into your signup flow.</p>



<ul class="wp-block-list">
<li><strong>Limit Sign-Ups per IP</strong>: Allowing up to two sign-ups per IP per week cuts down on repeat abuse from the same person. You can set this up easily with an <a href="https://upstash.com/docs/redis/sdks/ratelimit-ts/overview" data-wpel-link="external" rel="nofollow external noopener noreferrer">Upstash Rate Limit</a>.</li>



<li><strong>Restrict Dot Variations</strong>: Some people create multiple accounts by adding dots in Gmail addresses (like an.d.y.f@gmail.com). Counting periods and blocking emails with three or more can help cut down on abuse. You can also normalize all Gmail addresses by removing the periods before the @ symbol, but make sure your login/signup flows account for this so no one gets locked out.</li>



<li><strong>Watch for &#8216;+&#8217;</strong>: Users might add &#8220;+something&#8221; to the end of their email (e.g., andy+test@gmail.com). Stripping the &#8220;+&#8221; and everything after it gives you the base email for deduplication. I wouldn&#8217;t block + usage outright since plenty of people use it legitimately, but it&#8217;s worth normalizing before you store or check the address.</li>
</ul>



<h2 class="wp-block-heading">Is It Worth the Setup?</h2>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1200" height="800" src="https://drawne.com/wp-content/uploads/2024/11/no-more-spam-illustration-chatgpt-1200x800.png" alt="No more spam illustration made with ChatGPT" class="wp-image-3334" srcset="https://drawne.com/wp-content/uploads/2024/11/no-more-spam-illustration-chatgpt-1200x800.png 1200w, https://drawne.com/wp-content/uploads/2024/11/no-more-spam-illustration-chatgpt-760x507.png 760w, https://drawne.com/wp-content/uploads/2024/11/no-more-spam-illustration-chatgpt-768x512.png 768w, https://drawne.com/wp-content/uploads/2024/11/no-more-spam-illustration-chatgpt.png 1536w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<p class="wp-block-paragraph">None of this stops every bad signup. Determined users will find workarounds, and new disposable email providers pop up faster than any blocklist can track them. But you don&#8217;t need perfection. Cutting out 80-90% of throwaway signups is enough to make your free tier sustainable and your user data actually useful. Since Debounce and StopForumSpam are both free, the only real cost is an hour of implementation. If fake accounts are eating into your product, that&#8217;s an easy tradeoff.</p>
<p>The post <a href="https://drawne.com/block-disposable-emails/">How to Block Disposable Emails with JavaScript (Code Snippet)</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/block-disposable-emails/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Grab Meta Tags (Title/Description) from Sites with Node.js</title>
		<link>https://drawne.com/grab-meta-tags-node/</link>
					<comments>https://drawne.com/grab-meta-tags-node/#respond</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Sat, 28 Sep 2024 22:10:22 +0000</pubDate>
				<category><![CDATA[Node.js]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=3309</guid>

					<description><![CDATA[<p>While creating Meta Preview Tool I had to build a way to grab a page&#8217;s metadata to improve the site&#8217;s experience. When users enter links into sites they expect a preview of the URL. Apps like Discord, iMessage, Messenger all show previews of URLs when they are entered. In this post I&#8217;ll show you how ... </p>
<p class="read-more-container"><a title="Grab Meta Tags (Title/Description) from Sites with Node.js" class="read-more button" href="https://drawne.com/grab-meta-tags-node/#more-3309" aria-label="Read more about Grab Meta Tags (Title/Description) from Sites with Node.js" data-wpel-link="internal">Read more</a></p>
<p>The post <a href="https://drawne.com/grab-meta-tags-node/">Grab Meta Tags (Title/Description) from Sites with Node.js</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">While creating <a href="https://metapreviewtool.com/" data-wpel-link="exclude">Meta Preview Tool</a> I had to build a way to grab a page&#8217;s metadata to improve the site&#8217;s experience. When users enter links into sites they expect a preview of the URL. Apps like Discord, iMessage, Messenger all show previews of URLs when they are entered.</p>



<p class="wp-block-paragraph">In this post I&#8217;ll show you <strong>how to grab metadata for a webpage using Node.js and Cheerio</strong>. With these tools, you can fetch and parse metadata from any web page.</p>



<h2 class="wp-block-heading">Full Code Snippet</h2>



<p class="wp-block-paragraph">Since you&#8217;re likely here for code, here&#8217;s my full code for grabbing meta title, description, and og:image using Node and Cheerio. Install Cheerio first if you haven&#8217;t already:</p>



<pre class="wp-block-code"><code>npm install cheerio</code></pre>



<figure class="wp-block-embed is-type-rich is-provider-embed-handler wp-block-embed-embed-handler"><div class="wp-block-embed__wrapper">
<script src="https://gist.github.com/someguy9/df62cca23ad49b4fc61a0d38944601df.js"></script>
</div></figure>



<h2 class="wp-block-heading">Why Server-Side JavaScript?</h2>



<p class="wp-block-paragraph">You can&#8217;t fetch another site&#8217;s HTML from the browser. Cross-origin security restrictions block those requests unless the target site explicitly allows it, which most don&#8217;t. Running the fetch server-side sidesteps this entirely.</p>



<p class="wp-block-paragraph">Node.js handles async HTTP requests well and deploys easily anywhere. The script works as a <a href="https://workers.cloudflare.com/" data-wpel-link="external" rel="nofollow external noopener noreferrer">Cloudflare Worker</a>, a <a href="https://vercel.com/" data-wpel-link="external" rel="nofollow external noopener noreferrer">Vercel</a> serverless function, or any standard Node server without changes.</p>



<h2 class="wp-block-heading">Explaining the Code</h2>



<h3 class="wp-block-heading">Importing Cheerio</h3>



<p class="wp-block-paragraph"><a href="https://www.npmjs.com/package/cheerio" data-wpel-link="external" rel="nofollow external noopener noreferrer">Cheerio</a> parses raw HTML on the server using jQuery-style selectors. It&#8217;s fast, lightweight, and has no browser dependencies. One thing to know upfront: Cheerio doesn&#8217;t execute JavaScript. It only reads the HTML the server returns. For most sites that&#8217;s fine since meta tags are in the static HTML, but more on that in the error section.</p>



<h3 class="wp-block-heading">Validating the URL</h3>



<p class="wp-block-paragraph">Before fetching anything, we need a proper URL. If the URL doesn&#8217;t start with &#8220;http://&#8221; or &#8220;https://&#8221;, we prepend &#8220;https://&#8221; to it. I found this to be a simple way to improve the experience. If you want to be more thorough, use <code>isURL</code> from the <a href="https://www.npmjs.com/package/validator" data-wpel-link="external" rel="nofollow external noopener noreferrer">Validator package</a>, but for most cases the basic check is enough.</p>



<h3 class="wp-block-heading">Fetching the HTML</h3>



<p class="wp-block-paragraph">With the URL ready, we fetch the page HTML using the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API" data-wpel-link="external" rel="nofollow external noopener noreferrer">Fetch API</a>. Note that some sites block automated requests by checking the User-Agent header or running Cloudflare bot protection. For a personal project or low-volume tool this works fine. For higher-volume use, you&#8217;ll want a rotating proxy or a service like ScrapingBee.</p>



<h3 class="wp-block-heading">Parsing HTML with Cheerio</h3>



<p class="wp-block-paragraph">Once we have the raw HTML, Cheerio loads it into a DOM-like structure we can query with selectors.</p>



<h3 class="wp-block-heading">Extracting Metadata</h3>



<p class="wp-block-paragraph">With the DOM ready, we pull three fields:</p>



<ul class="wp-block-list">
<li><strong>Title</strong>: Grabs the <code>&lt;title&gt;</code> tag text.</li>



<li><strong>Description</strong>: Checks <code>&lt;meta name="description"&gt;</code> first, then falls back to <code>&lt;meta property="og:description"&gt;</code>.</li>



<li><strong>Image</strong>: Checks <code>&lt;meta property="og:image"&gt;</code> first, then falls back to <code>&lt;meta name="twitter:image"&gt;</code>.</li>
</ul>



<p class="wp-block-paragraph">Any field that&#8217;s missing defaults to an empty string. Here&#8217;s what a successful result looks like:</p>



<pre class="wp-block-code"><code>{
  "title": "Example Domain",
  "description": "This domain is for illustrative examples.",
  "image": "https://example.com/og-image.png"
}</code></pre>



<p class="wp-block-paragraph">One thing to watch: <code>og:image</code> values are sometimes relative paths rather than absolute URLs. If you&#8217;re displaying the image in your app, check whether it starts with &#8220;http&#8221; and resolve it against the page&#8217;s base URL if not.</p>



<h3 class="wp-block-heading">Navigating Errors Gracefully</h3>



<p class="wp-block-paragraph">The function wraps everything in a <a href="https://www.geeksforgeeks.org/how-to-handle-errors-in-node-js/" data-wpel-link="external" rel="nofollow external noopener noreferrer">try/catch</a>. If the fetch fails or the HTML is unparseable, it logs the error and returns an empty metadata object. This keeps your app from crashing when it hits an unreachable or malformed URL.</p>



<p class="wp-block-paragraph">One limitation worth knowing: this won&#8217;t work for single-page applications that inject meta tags with JavaScript after page load. Cheerio only sees the raw HTML from the server. If a site&#8217;s <code>&lt;title&gt;</code> or meta description is set by React or Vue on the client, you&#8217;ll get empty strings back. For those cases you&#8217;d need a headless browser like Puppeteer.</p>



<h2 class="wp-block-heading">Wiring It Up as an API Endpoint</h2>



<p class="wp-block-paragraph">The function is meant to run on a server, not in the browser. Here&#8217;s how to expose it as an API route in Next.js so your frontend can call it:</p>



<pre class="wp-block-code"><code>// app/api/meta/route.js
import { getMetaData } from '@/lib/getMetaData';

export async function GET(request) {
  const { searchParams } = new URL(request.url);
  const url = searchParams.get('url');

  if (!url) {
    return Response.json({ error: 'url parameter required' }, { status: 400 });
  }

  const meta = await getMetaData(url);
  return Response.json(meta);
}</code></pre>



<p class="wp-block-paragraph">Then call it from your frontend:</p>



<pre class="wp-block-code"><code>const res = await fetch(`/api/meta?url=${encodeURIComponent(inputUrl)}`);
const meta = await res.json();</code></pre>



<p class="wp-block-paragraph">If you&#8217;re on Cloudflare Workers the pattern is the same, just swapping in Cloudflare&#8217;s request handler format.</p>



<h2 class="wp-block-heading">Wrapping It Up</h2>



<p class="wp-block-paragraph">For most link preview use cases, this approach works well. Cheerio is lightweight, the setup is minimal, and the fallback logic handles the messiness of real-world HTML. The main edge case is JavaScript-rendered sites. If those make up a big portion of your URLs, reach for Puppeteer instead. Otherwise this is a solid starting point and has worked well in production for Meta Preview Tool.</p>
<p>The post <a href="https://drawne.com/grab-meta-tags-node/">Grab Meta Tags (Title/Description) from Sites with Node.js</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/grab-meta-tags-node/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to Convert YouTube Videos to Blog Posts Using AI</title>
		<link>https://drawne.com/youtube-video-to-blog-post/</link>
					<comments>https://drawne.com/youtube-video-to-blog-post/#respond</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Sat, 30 Dec 2023 15:48:10 +0000</pubDate>
				<category><![CDATA[Tutorials]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=3158</guid>

					<description><![CDATA[<p>If you&#8217;re a YouTuber who also runs a blog, you know how hard it is to keep both going. The good news: every video you&#8217;ve already made is a blog post waiting to be written. Repurposing videos as blog posts gets your content in front of readers who skip YouTube, helps your site rank in ... </p>
<p class="read-more-container"><a title="How to Convert YouTube Videos to Blog Posts Using AI" class="read-more button" href="https://drawne.com/youtube-video-to-blog-post/#more-3158" aria-label="Read more about How to Convert YouTube Videos to Blog Posts Using AI" data-wpel-link="internal">Read more</a></p>
<p>The post <a href="https://drawne.com/youtube-video-to-blog-post/">How to Convert YouTube Videos to Blog Posts Using AI</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">If you&#8217;re a YouTuber who also runs a blog, you know how hard it is to keep both going. The good news: every video you&#8217;ve already made is a blog post waiting to be written.</p>



<p class="wp-block-paragraph">Repurposing videos as blog posts gets your content in front of readers who skip YouTube, helps your site rank in search, and squeezes more value from work you&#8217;ve already done. In this post I&#8217;ll show you exactly how to do it.</p>



<h2 class="wp-block-heading">Why Repurpose YouTube Videos for Blog Posts</h2>



<h3 class="wp-block-heading">Reach New Readers and Viewers</h3>



<p class="wp-block-paragraph">Not everyone watches videos. Some people prefer to read, search, and skim. Turning your videos into blog posts puts your content in front of an audience that would never find you on YouTube alone.</p>



<p class="wp-block-paragraph">This matters especially for content marketing. A blog gives you more control over the experience than social media does. You can collect email addresses, run promotions, and build a direct relationship with readers, all things that are harder to do through YouTube alone.</p>



<h3 class="wp-block-heading">Boost Your Blog&#8217;s Search Engine Traffic</h3>



<p class="wp-block-paragraph">Blog posts created from your videos can rank in search and bring new readers to your site. It&#8217;s worth doing <a href="https://www.ryrob.com/keyword-research/" data-wpel-link="exclude">keyword research</a> before you publish so the post targets a real search term rather than just mirroring your video title.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading">Picking the Perfect Videos for Your Blog</h2>



<p class="wp-block-paragraph">Not every video converts well into a blog post. A vlog works better in video format. Choose content that stands on its own in text.</p>



<h3 class="wp-block-heading">Evergreen Content</h3>



<p class="wp-block-paragraph">Pick videos that keep getting views long after they&#8217;re published. Those are the posts that will also rank in Google over time.</p>



<h3 class="wp-block-heading">Tutorial and How-To Videos</h3>



<p class="wp-block-paragraph">Tutorial videos are ideal for conversion. They have clear step-by-step structure that translates directly into a blog post, and you can pull screenshots from the video to use as illustrations without any extra work.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading">How to Convert YouTube Videos to Blog Posts</h2>



<p class="wp-block-paragraph">Here&#8217;s the step-by-step process for turning a YouTube video into a blog post using AI.</p>



<h3 class="wp-block-heading">Step 1: Get The Transcript</h3>



<p class="wp-block-paragraph">First you&#8217;ll need to grab a YouTube video transcript. This is where all the rich content of a video lives and what we&#8217;ll use to build the blog post.</p>



<p class="wp-block-paragraph">YouTube offers transcripts for most videos built in. You can also use <a href="https://rightblogger.com/tool/youtube-transcript-download" data-wpel-link="exclude">RightBlogger&#8217;s transcript downloader</a> with a free account to copy the full transcript in one click.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1200" height="822" src="https://drawne.com/wp-content/uploads/2023/12/more-button-youtube-1200x822.jpg" alt="Description on YouTube" class="wp-image-3171" srcset="https://drawne.com/wp-content/uploads/2023/12/more-button-youtube-1200x822.jpg 1200w, https://drawne.com/wp-content/uploads/2023/12/more-button-youtube-760x521.jpg 760w, https://drawne.com/wp-content/uploads/2023/12/more-button-youtube-768x526.jpg 768w, https://drawne.com/wp-content/uploads/2023/12/more-button-youtube-1536x1052.jpg 1536w, https://drawne.com/wp-content/uploads/2023/12/more-button-youtube.jpg 1968w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<p class="wp-block-paragraph">Click the more button on any video to find the &#8220;show transcript&#8221; button. This brings up a sidebar with the full transcript.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1200" height="864" src="https://drawne.com/wp-content/uploads/2023/12/show-transcript-youtube-video-1200x864.jpg" alt="Show transcript button on YouTube" class="wp-image-3170" srcset="https://drawne.com/wp-content/uploads/2023/12/show-transcript-youtube-video-1200x864.jpg 1200w, https://drawne.com/wp-content/uploads/2023/12/show-transcript-youtube-video-760x547.jpg 760w, https://drawne.com/wp-content/uploads/2023/12/show-transcript-youtube-video-768x553.jpg 768w, https://drawne.com/wp-content/uploads/2023/12/show-transcript-youtube-video-1536x1106.jpg 1536w, https://drawne.com/wp-content/uploads/2023/12/show-transcript-youtube-video.jpg 1924w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<p class="wp-block-paragraph">After the transcript appears you&#8217;ll notice timestamps next to each line. You don&#8217;t want those, so click the &#8220;&#8230;&#8221; button and toggle the timestamps off.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1200" height="990" src="https://drawne.com/wp-content/uploads/2023/12/toggle-timestamps-youtube-video-1200x990.jpg" alt="Toggle timestamps on YouTube" class="wp-image-3169" srcset="https://drawne.com/wp-content/uploads/2023/12/toggle-timestamps-youtube-video-1200x990.jpg 1200w, https://drawne.com/wp-content/uploads/2023/12/toggle-timestamps-youtube-video-760x627.jpg 760w, https://drawne.com/wp-content/uploads/2023/12/toggle-timestamps-youtube-video-768x633.jpg 768w, https://drawne.com/wp-content/uploads/2023/12/toggle-timestamps-youtube-video.jpg 1494w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<p class="wp-block-paragraph">Once the timestamps are gone, highlight all the text and copy it. If you only want part of the video, copy just the relevant sections. This works well for long videos like podcasts where you want to blog about a single segment.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1200" height="915" src="https://drawne.com/wp-content/uploads/2023/12/copy-transcript-youtube-1200x915.jpg" alt="Copying transcript from YouTube" class="wp-image-3172" srcset="https://drawne.com/wp-content/uploads/2023/12/copy-transcript-youtube-1200x915.jpg 1200w, https://drawne.com/wp-content/uploads/2023/12/copy-transcript-youtube-760x580.jpg 760w, https://drawne.com/wp-content/uploads/2023/12/copy-transcript-youtube-768x586.jpg 768w, https://drawne.com/wp-content/uploads/2023/12/copy-transcript-youtube-1536x1171.jpg 1536w, https://drawne.com/wp-content/uploads/2023/12/copy-transcript-youtube.jpg 1878w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<p class="wp-block-paragraph">If a video doesn&#8217;t have a transcript, use a service like <a href="https://www.youtube.com/watch?v=Xtu9ocJNrF4" data-wpel-link="exclude">Rev</a> to create one. Rev is one of my favorite paid options since it delivers captions and subtitles back to YouTube automatically.</p>



<p class="wp-block-paragraph">On a Mac, <a href="https://goodsnooze.gumroad.com/l/macwhisper" data-wpel-link="external" rel="nofollow external noopener noreferrer">MacWhisper</a> transcribes videos locally and outputs a .SRT file you can upload to YouTube or LinkedIn. I&#8217;ve found the transcriptions better than YouTube&#8217;s auto-captions.</p>



<p class="wp-block-paragraph">RightBlogger also has an <a href="https://rightblogger.com/tool/transcribe" data-wpel-link="exclude">AI video and audio transcription tool</a> if you&#8217;d rather handle everything in one place.</p>



<p class="wp-block-paragraph">Once you have the transcript copied, head over to <a href="https://chat.openai.com/" data-wpel-link="external" rel="nofollow external noopener noreferrer">ChatGPT</a> to generate a blog post outline.</p>



<h3 class="wp-block-heading">Step 2: Outline with AI Help</h3>



<p class="wp-block-paragraph">Use ChatGPT to turn your transcript into a blog post outline. Here&#8217;s a prompt template to get started. I&#8217;d also recommend adding &#8220;The primary keyword of my article is [keyword]&#8221; at the top if you&#8217;re targeting a specific search term, which helps shape the structure around what people are actually searching for.</p>



<pre class="wp-block-preformatted">Act as a blogger who is great at writing. Help me write a blog post outline based on a YouTube video. I am going to give you the video transcript so you can turn it into an outline for me to write a blog post. Use Markdown so it's easier to read.

YouTube Video Transcript:
[PASTE YOUTUBE VIDEO TRANSCRIPT HERE]</pre>



<figure class="wp-block-image size-large"><img decoding="async" width="1200" height="517" src="https://drawne.com/wp-content/uploads/2023/12/chatgpt-blog-outline-trascript-1200x517.jpg" alt="ChatGPT prompt to make a blog post outline from transcript" class="wp-image-3168" srcset="https://drawne.com/wp-content/uploads/2023/12/chatgpt-blog-outline-trascript-1200x517.jpg 1200w, https://drawne.com/wp-content/uploads/2023/12/chatgpt-blog-outline-trascript-760x328.jpg 760w, https://drawne.com/wp-content/uploads/2023/12/chatgpt-blog-outline-trascript-768x331.jpg 768w, https://drawne.com/wp-content/uploads/2023/12/chatgpt-blog-outline-trascript-1536x662.jpg 1536w, https://drawne.com/wp-content/uploads/2023/12/chatgpt-blog-outline-trascript-2048x883.jpg 2048w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<p class="wp-block-paragraph">ChatGPT will convert the transcript into a structured outline. You can then ask it to write each section, but don&#8217;t just copy and paste the raw output. You&#8217;ll want to edit it and add your own voice before publishing.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1200" height="919" src="https://drawne.com/wp-content/uploads/2023/12/blog-outline-from-transcript-chatgpt-1200x919.jpg" alt="Blog post outline in ChatGPT" class="wp-image-3167" srcset="https://drawne.com/wp-content/uploads/2023/12/blog-outline-from-transcript-chatgpt-1200x919.jpg 1200w, https://drawne.com/wp-content/uploads/2023/12/blog-outline-from-transcript-chatgpt-760x582.jpg 760w, https://drawne.com/wp-content/uploads/2023/12/blog-outline-from-transcript-chatgpt-768x588.jpg 768w, https://drawne.com/wp-content/uploads/2023/12/blog-outline-from-transcript-chatgpt-1536x1177.jpg 1536w, https://drawne.com/wp-content/uploads/2023/12/blog-outline-from-transcript-chatgpt-2048x1569.jpg 2048w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>



<h3 class="wp-block-heading">Step 3: Edit Your Post</h3>



<p class="wp-block-paragraph">Copy the content from ChatGPT into your blog CMS and start editing. The AI-generated outline keeps you on track while leaving room for your exact writing style.</p>



<p class="wp-block-paragraph">Don&#8217;t have a blog yet? <a href="https://www.ryrob.com/how-start-blog/" data-wpel-link="exclude">Learn how to start one</a>. A blog gives you full control over your audience, lets you grow an email list, and ranks in search in ways YouTube alone can&#8217;t.</p>



<p class="wp-block-paragraph">This step is where you add what AI can&#8217;t: specific details, your actual opinions, screenshots pulled from the video, and <a href="https://rightblogger.com/glossary/internal-linking" data-wpel-link="exclude">internal links</a> to other posts on your site. Embedding the original video in the post is also a good move, serving both readers and viewers from one page.</p>



<p class="wp-block-paragraph"><a href="https://rightblogger.com/blog/future-of-blogging" data-wpel-link="exclude">Google has been clear</a> that AI content designed to game the algorithm gets removed from search. Read over everything, refine it, and make sure the post sounds like you wrote it.</p>



<h3 class="wp-block-heading">Step 4: SEO Optimize Your Post</h3>



<p class="wp-block-paragraph">Before publishing, run through these SEO basics:</p>



<ul class="wp-block-list">
<li><strong>Title and meta description</strong>: Include your primary keyword in both. A WordPress SEO plugin like Yoast or RankMath makes this straightforward to manage.</li>



<li><strong>URL slug</strong>: Keep it short and keyword-focused. Trim any auto-generated slugs that are a long string of words.</li>



<li><strong>Alt text on images</strong>: Every screenshot you pull from the video should have descriptive alt text, not just the filename or &#8220;image&#8221;.</li>



<li><strong>Internal links</strong>: Link to related posts on your site where it fits naturally. This helps both readers and search engines understand your content.</li>
</ul>



<p class="wp-block-paragraph">I wrote a full breakdown of <a href="https://smartwp.com/wordpress-seo-tips/" data-wpel-link="exclude">WordPress SEO tips</a> if you want to go deeper on any of these.</p>



<h3 class="wp-block-heading">Skip the Manual Steps with RightBlogger</h3>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="YouTube Video to Blog Post Generator - RightBlogger Tool Demo" width="710" height="399" src="https://www.youtube.com/embed/qro0DJARSt8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">If you&#8217;d rather skip the manual process, I built a <a href="https://rightblogger.com/tool/youtube-to-blog-post" data-wpel-link="exclude">YouTube to blog post converter on RightBlogger</a> that handles everything from a single URL. Paste in your video link and it generates a full post. You pick the article length, writing style, language, and primary keyword, and can add custom instructions on top. RightBlogger is a <a href="https://rightblogger.com/youtubers" data-wpel-link="exclude">blog automation platform built for content creators</a> who want to grow traffic without doubling their workload.</p>



<p class="wp-block-paragraph">The bigger time-saver is the <a href="https://rightblogger.com/autoblogging" data-wpel-link="exclude">autoblogging feature</a>. Connect RightBlogger to your YouTube channel and it automatically converts new uploads to blog posts, no manual work after the initial setup. I put together a full guide on <a href="https://rightblogger.com/blog/automate-blog" data-wpel-link="exclude">how to automate your blog</a> that walks through the whole setup if you want to see how it works end to end.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading">FAQs about Converting YouTube Videos to Blog Posts</h2>



<h3 class="wp-block-heading">What if the YouTube video doesn&#8217;t have a transcript?</h3>



<p class="wp-block-paragraph">If the video doesn&#8217;t have a transcript, use a third-party service like Rev or MacWhisper to create one. Most videos have an auto-generated YouTube transcript, but newly uploaded and very old videos sometimes don&#8217;t. Some tools, including RightBlogger&#8217;s transcription tool, can generate a transcript directly from a YouTube link without needing to download anything first.</p>



<h3 class="wp-block-heading">How do I make longer blogs?</h3>



<p class="wp-block-paragraph">Getting AI to write longer posts consistently takes a bit of structure:</p>



<ul class="wp-block-list">
<li>Generate the outline first, then prompt the AI to write each section separately and tell it which section you&#8217;re working on.</li>



<li>Add a word requirement in the prompt, like &#8220;Write at least 700 words.&#8221; This works better on more capable models and tends to fall short on lighter ones like GPT-5.4 mini.</li>



<li>Set a minimum word count per section in your outline prompt so the AI knows what you&#8217;re expecting from the start.</li>
</ul>



<p class="wp-block-paragraph">Writing each section separately is the most reliable way to hit a longer overall word count.</p>



<h3 class="wp-block-heading">How do I export blogs to my website?</h3>



<p class="wp-block-paragraph">Copy and paste the output from ChatGPT directly into your CMS (WordPress, Webflow, Squarespace, etc.). If the formatting isn&#8217;t coming through cleanly, add &#8220;Respond with Markdown&#8221; to your prompt. This ensures headings, bullet points, and bold text carry over as expected.</p>



<h3 class="wp-block-heading">What if the transcript is too long?</h3>



<p class="wp-block-paragraph">If the transcript hits the AI&#8217;s context limit, here are your options:</p>



<ul class="wp-block-list">
<li>Use GPT-5.4, <a href="https://claude.ai/" data-wpel-link="external" rel="nofollow external noopener noreferrer">Claude</a>, or Gemini. All three have large context windows and most transcripts won&#8217;t come close to exceeding them.</li>



<li>Only paste the section of the transcript you actually want to blog about.</li>



<li>Summarize the transcript first with <a href="https://rightblogger.com/tool/summarizer" data-wpel-link="exclude">RightBlogger&#8217;s summarizer</a>, then use the summary to generate your outline.</li>
</ul>



<h3 class="wp-block-heading">What are some video to blog tools?</h3>



<p class="wp-block-paragraph">Here are paid and free options to help convert videos to articles:</p>



<ul class="wp-block-list">
<li><strong><a href="https://videotoblog.com/" data-wpel-link="exclude">Video To Blog</a>:</strong> Free video to blog tool to generate articles from YouTube videos.</li>



<li><strong><a href="https://rightblogger.com/" data-wpel-link="exclude">RightBlogger</a>:</strong> Paid tool suite for bloggers and YouTubers that includes a video to blog converter and full autoblogging.</li>



<li><a href="https://www.ryrob.com/youtube-video-blog-post/" data-wpel-link="exclude"><strong>RyRob Video to Blog Tool</strong></a><strong>:</strong> Free converter to quickly turn videos into blog posts.</li>



<li><strong><a href="https://www.videotoblog.ai/" data-wpel-link="external" rel="nofollow external noopener noreferrer">Video To Blog AI</a>:</strong> Paid service with advanced options including automatic video screenshots.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">Repurposing YouTube videos as blog posts is one of the smartest moves a content creator can make. You&#8217;ve already done the hard work of researching, scripting, and recording. Turning that into a post takes a fraction of the time and puts your content in front of an entirely different audience.</p>



<p class="wp-block-paragraph">Do it manually with the steps above, or connect RightBlogger to your channel and let it run on autopilot. Either way, your videos are too valuable to live in just one place.</p>
<p>The post <a href="https://drawne.com/youtube-video-to-blog-post/">How to Convert YouTube Videos to Blog Posts Using AI</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/youtube-video-to-blog-post/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hex Opacity: What is it &#038; hex opacity table</title>
		<link>https://drawne.com/hex-opacity/</link>
					<comments>https://drawne.com/hex-opacity/#comments</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Thu, 14 Dec 2023 14:29:53 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=3153</guid>

					<description><![CDATA[<p>Hex opacity table mapping every percentage (0-100%) to its transparent hex code. Includes CSS examples and comparison with rgba() and the opacity property.</p>
<p>The post <a href="https://drawne.com/hex-opacity/">Hex Opacity: What is it &amp; hex opacity table</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Hex opacity is the two-digit alpha value appended to a standard 6-digit hex color code</strong>, turning #RRGGBB into #RRGGBBAA. The last two characters control transparency: 00 is fully transparent, FF is fully opaque, and everything between is a partial level of transparency.</p>



<p class="wp-block-paragraph">To get a transparent hex code for any color, find the opacity percentage in the table below and append it to your hex color. Red (#FF0000) at 50% opacity becomes #FF000080. For a fully transparent hex code, use any color followed by 00, such as #00000000.</p>



<h2 class="wp-block-heading">Using Hex Opacity in CSS</h2>



<p class="wp-block-paragraph">You can apply hex opacity to any CSS property that accepts a color value: backgrounds, borders, text, box shadows, and more. Just append the two-digit hex value to any existing color code.</p>



<pre class="wp-block-code"><code>/* Background with 50% opacity */
background-color: #0000FF80;

/* Text color at 70% opacity */
color: #333333B3;

/* Border at 25% opacity */
border: 1px solid #FF000040;

/* Box shadow with transparency */
box-shadow: 0 4px 6px #00000033;</code></pre>



<p class="wp-block-paragraph">CSS also supports a 4-digit shorthand format (#RGBA), where each digit is doubled. So <code>#0F08</code> is the same as <code>#00FF0088</code>. This shorthand only works when each pair of digits is identical, so it&#8217;s less commonly used than the full 8-digit format.</p>



<p class="wp-block-paragraph">One platform difference worth knowing: Android and Kotlin use the reversed format #AARRGGBB, where the alpha comes first. The table below still applies for the alpha portion; just swap its position when writing Android color values.</p>



<h2 class="wp-block-heading">Hex Opacity Table</h2>



<p class="wp-block-paragraph">Here is a handy table to quickly find the opacity hex code to append to your <a href="https://colorkit.co/hex-color-codes/" data-wpel-link="exclude">hex color</a>.</p>



<p class="wp-block-paragraph">For example, to get 95% opacity, append F2 to your hex color. Red at 95% opacity: #ff0000<strong>f2</strong>.</p>



<p class="wp-block-paragraph">The hex values use standard mathematical rounding (rounding 0.5 up). So 50% maps to 80 (128 in decimal, since 127.5 rounds up) rather than 7F (127). Some tools use truncation instead and show 7F for 50% and 3F for 25%. Both are valid CSS values. The visual difference is imperceptible.</p>



<figure class="wp-block-table"><table><thead><tr><th>Opacity Value (%)</th><th>Hex Code</th></tr></thead><tbody><tr><td>100</td><td>FF</td></tr><tr><td>99</td><td>FC</td></tr><tr><td>98</td><td>FA</td></tr><tr><td>97</td><td>F7</td></tr><tr><td>96</td><td>F5</td></tr><tr><td>95</td><td>F2</td></tr><tr><td>94</td><td>F0</td></tr><tr><td>93</td><td>ED</td></tr><tr><td>92</td><td>EB</td></tr><tr><td>91</td><td>E8</td></tr><tr><td>90</td><td>E6</td></tr><tr><td>89</td><td>E3</td></tr><tr><td>88</td><td>E0</td></tr><tr><td>87</td><td>DE</td></tr><tr><td>86</td><td>DB</td></tr><tr><td>85</td><td>D9</td></tr><tr><td>84</td><td>D6</td></tr><tr><td>83</td><td>D4</td></tr><tr><td>82</td><td>D1</td></tr><tr><td>81</td><td>CF</td></tr><tr><td>80</td><td>CC</td></tr><tr><td>79</td><td>C9</td></tr><tr><td>78</td><td>C7</td></tr><tr><td>77</td><td>C4</td></tr><tr><td>76</td><td>C2</td></tr><tr><td>75</td><td>BF</td></tr><tr><td>74</td><td>BD</td></tr><tr><td>73</td><td>BA</td></tr><tr><td>72</td><td>B8</td></tr><tr><td>71</td><td>B5</td></tr><tr><td>70</td><td>B3</td></tr><tr><td>69</td><td>B0</td></tr><tr><td>68</td><td>AD</td></tr><tr><td>67</td><td>AB</td></tr><tr><td>66</td><td>A8</td></tr><tr><td>65</td><td>A6</td></tr><tr><td>64</td><td>A3</td></tr><tr><td>63</td><td>A1</td></tr><tr><td>62</td><td>9E</td></tr><tr><td>61</td><td>9C</td></tr><tr><td>60</td><td>99</td></tr><tr><td>59</td><td>96</td></tr><tr><td>58</td><td>94</td></tr><tr><td>57</td><td>91</td></tr><tr><td>56</td><td>8F</td></tr><tr><td>55</td><td>8C</td></tr><tr><td>54</td><td>8A</td></tr><tr><td>53</td><td>87</td></tr><tr><td>52</td><td>85</td></tr><tr><td>51</td><td>82</td></tr><tr><td>50</td><td>80</td></tr><tr><td>49</td><td>7D</td></tr><tr><td>48</td><td>7A</td></tr><tr><td>47</td><td>78</td></tr><tr><td>46</td><td>75</td></tr><tr><td>45</td><td>73</td></tr><tr><td>44</td><td>70</td></tr><tr><td>43</td><td>6E</td></tr><tr><td>42</td><td>6B</td></tr><tr><td>41</td><td>69</td></tr><tr><td>40</td><td>66</td></tr><tr><td>39</td><td>63</td></tr><tr><td>38</td><td>61</td></tr><tr><td>37</td><td>5E</td></tr><tr><td>36</td><td>5C</td></tr><tr><td>35</td><td>59</td></tr><tr><td>34</td><td>57</td></tr><tr><td>33</td><td>54</td></tr><tr><td>32</td><td>52</td></tr><tr><td>31</td><td>4F</td></tr><tr><td>30</td><td>4D</td></tr><tr><td>29</td><td>4A</td></tr><tr><td>28</td><td>47</td></tr><tr><td>27</td><td>45</td></tr><tr><td>26</td><td>42</td></tr><tr><td>25</td><td>40</td></tr><tr><td>24</td><td>3D</td></tr><tr><td>23</td><td>3B</td></tr><tr><td>22</td><td>38</td></tr><tr><td>21</td><td>36</td></tr><tr><td>20</td><td>33</td></tr><tr><td>19</td><td>30</td></tr><tr><td>18</td><td>2E</td></tr><tr><td>17</td><td>2B</td></tr><tr><td>16</td><td>29</td></tr><tr><td>15</td><td>26</td></tr><tr><td>14</td><td>24</td></tr><tr><td>13</td><td>21</td></tr><tr><td>12</td><td>1F</td></tr><tr><td>11</td><td>1C</td></tr><tr><td>10</td><td>1A</td></tr><tr><td>9</td><td>17</td></tr><tr><td>8</td><td>14</td></tr><tr><td>7</td><td>12</td></tr><tr><td>6</td><td>0F</td></tr><tr><td>5</td><td>0D</td></tr><tr><td>4</td><td>0A</td></tr><tr><td>3</td><td>08</td></tr><tr><td>2</td><td>05</td></tr><tr><td>1</td><td>03</td></tr><tr><td>0</td><td>00</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Hex Opacity vs. rgba() and the opacity Property</h2>



<p class="wp-block-paragraph">Three CSS approaches handle color transparency. They&#8217;re not interchangeable.</p>



<p class="wp-block-paragraph"><strong>#RRGGBBAA hex notation</strong> applies transparency to a single color value. It works anywhere a color is accepted in CSS. The downside is readability: #FF000080 isn&#8217;t as clear as rgba(255, 0, 0, 0.5) at a glance.</p>



<p class="wp-block-paragraph"><strong>rgba() and hsla()</strong> are the more readable alternatives. The alpha channel uses a 0-1 decimal (0.5 for 50%), so no hex conversion is needed. Both rgba() and 8-digit hex produce identical results; they&#8217;re different syntax for the same thing.</p>



<p class="wp-block-paragraph"><strong>The CSS opacity property</strong> works differently. Setting <code>opacity: 0.5</code> on an element makes the entire element transparent, including its children. Text inside a semi-transparent container will inherit the parent&#8217;s opacity. To keep text fully visible while making only the background transparent, use background-color with hex opacity or rgba() instead.</p>



<pre class="wp-block-code"><code>/* These produce identical results */
background-color: #FF000080;
background-color: rgba(255, 0, 0, 0.5);

/* This makes the entire element AND its children 50% transparent */
opacity: 0.5;</code></pre>



<h2 class="wp-block-heading">Understanding the Hexadecimal System</h2>



<p class="wp-block-paragraph">Decimal is base 10: digits run from 0 to 9. Hexadecimal is base 16, so it adds six more symbols: A, B, C, D, E, and F. That gives each digit position 16 possible values instead of 10.</p>



<p class="wp-block-paragraph">A single hex digit represents values from 0 to F, where F equals 15 in decimal. Two hex digits together cover 0 to 255 (FF in hex). That range is why the opacity channel fits in exactly two characters.</p>



<p class="wp-block-paragraph">Valid two-digit hex values include 00, 01, 99, 9D, CC, E4, and F5. Letters are case-insensitive in CSS, so #ff0000f2 and #FF0000F2 are the same color.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h2 class="wp-block-heading">Browser Support</h2>



<p class="wp-block-paragraph">8-digit hex color notation is well-supported across all modern browsers. <a href="https://caniuse.com/css-rrggbbaa" data-wpel-link="external" rel="nofollow external noopener noreferrer">CSS #RRGGBBAA notation</a> has had broad support since 2016 in Chrome and Firefox, and since 2019 in all major browsers including Safari. If you need to support Internet Explorer, use rgba() instead.</p>
<p>The post <a href="https://drawne.com/hex-opacity/">Hex Opacity: What is it &amp; hex opacity table</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/hex-opacity/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Displaying Sunset Times in Javascript using a Free Sunset Times API</title>
		<link>https://drawne.com/javascript-sunset-times-api/</link>
					<comments>https://drawne.com/javascript-sunset-times-api/#respond</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Fri, 16 Jun 2023 12:57:21 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=3098</guid>

					<description><![CDATA[<p>Looking to display sunrise or sunset times in JavaScript? There are a few ways to do this, including the SunCalc library that calculates times client-side, but in this guide I&#8217;ll show you how to use the free SunriseSunset.io API. Full disclosure: I built this API to simplify getting accurate sunrise and sunset times in apps ... </p>
<p class="read-more-container"><a title="Displaying Sunset Times in Javascript using a Free Sunset Times API" class="read-more button" href="https://drawne.com/javascript-sunset-times-api/#more-3098" aria-label="Read more about Displaying Sunset Times in Javascript using a Free Sunset Times API" data-wpel-link="internal">Read more</a></p>
<p>The post <a href="https://drawne.com/javascript-sunset-times-api/">Displaying Sunset Times in Javascript using a Free Sunset Times API</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Looking to <strong>display sunrise or sunset times in JavaScript</strong>? There are a few ways to do this, including the <a href="https://github.com/mourner/suncalc" data-wpel-link="external" rel="nofollow external noopener noreferrer">SunCalc</a> library that calculates times client-side, but in this guide I&#8217;ll show you how to use the <a href="https://sunrisesunset.io/api/" data-wpel-link="exclude">free SunriseSunset.io API</a>.</p>


<p class="wp-block-paragraph"><em>Full disclosure:</em> I built this API to simplify getting accurate sunrise and sunset times in apps and websites. It localizes times to the location you query, auto-adjusts for terrain elevation, and now returns moon and sun-position data in every response. No API key, no signup.</p>


<h2 class="wp-block-heading">Using the SunriseSunset.io API</h2>


<p class="wp-block-paragraph">The base request needs just a latitude and longitude. Drop them into a URL and you get JSON back:</p>


<pre class="wp-block-code"><code><a href="https://api.sunrisesunset.io/json?lat=38.907192&amp;lng=-77.036873" data-wpel-link="exclude">https://api.sunrisesunset.io/json?lat=38.907192&amp;lng=-77.036873</a></code></pre>


<p class="wp-block-paragraph">No authentication. Times are returned in the local timezone of the coordinates you pass.</p>


<h2 class="wp-block-heading">What you get back</h2>


<p class="wp-block-paragraph">Every response includes more than just sunrise and sunset. Here&#8217;s the shape of a typical result:</p>


<pre class="wp-block-code"><code>{
  "results": {
    "date": "2026-04-04",
    "sunrise": "6:48:29 AM",
    "sunset": "7:36:01 PM",
    "first_light": "5:16:33 AM",
    "last_light": "9:07:57 PM",
    "dawn": "6:21:29 AM",
    "dusk": "8:03:01 PM",
    "solar_noon": "1:12:15 PM",
    "golden_hour": "7:00:44 PM",
    "day_length": "12:47:32",
    "nautical_twilight_begin": "5:49:31 AM",
    "nautical_twilight_end": "8:34:59 PM",
    "timezone": "America/New_York",
    "utc_offset": -240,
    "sun_altitude": 56.81,
    "sun_azimuth": 180.33,
    "sunrise_azimuth": 82,
    "sunset_azimuth": 278.38,
    "moonrise": "9:38:28 PM",
    "moonset": "7:48:47 AM",
    "moon_illumination": 92.7,
    "moon_phase": "Waning Gibbous",
    "moon_phase_value": 0.59,
    "elevation": 26
  },
  "status": "OK",
  "tzid": "America/New_York"
}</code></pre>


<p class="wp-block-paragraph">If you only need sunrise and sunset, ignore the rest. If you&#8217;re building for photographers, hikers, climbers, or anyone who cares about golden hour, twilight, or moon phase, it&#8217;s already in the response.</p>


<h2 class="wp-block-heading">Basic JavaScript example</h2>


<p class="wp-block-paragraph">You can get coordinates for any location by right-clicking on Google Maps and copying the lat/lng.</p>


<figure class="wp-block-image size-full"><img decoding="async" width="1194" height="738" src="https://drawne.com/wp-content/uploads/2023/06/copy-coords.jpg" alt="Right-click on Google Maps to copy coordinates" class="wp-image-3100" srcset="https://drawne.com/wp-content/uploads/2023/06/copy-coords.jpg 1194w, https://drawne.com/wp-content/uploads/2023/06/copy-coords-760x470.jpg 760w, https://drawne.com/wp-content/uploads/2023/06/copy-coords-768x475.jpg 768w" sizes="(max-width: 1194px) 100vw, 1194px" /></figure>


<p class="wp-block-paragraph">Here is a basic fetch using the coordinates of the <a href="https://ihitthebutton.com/gateway-arch/" data-wpel-link="exclude">Gateway Arch in St. Louis</a>:</p>


<pre class="wp-block-code"><code>// Coordinates for Gateway Arch in St. Louis
const lat = 38.624519738607894;
const lng = -90.18581515692256;
const url = `https://api.sunrisesunset.io/json?lat=${lat}&amp;lng=${lng}`;

fetch(url)
  .then(res =&gt; res.json())
  .then(({ results, status }) =&gt; {
    if (status !== 'OK') {
      console.error('API error:', status);
      return;
    }
    console.log(`Sunrise: ${results.sunrise}`);
    console.log(`Sunset:  ${results.sunset}`);
  })
  .catch(err =&gt; console.error('Network error:', err));</code></pre>


<p class="wp-block-paragraph">A fuller <a href="https://codepen.io/someguy9/pen/XWxQvjB" data-wpel-link="external" rel="nofollow external noopener noreferrer">example on CodePen</a> renders the same data to the page.</p>


<h2 class="wp-block-heading">Useful parameters</h2>


<h3 class="wp-block-heading">Date and date ranges</h3>


<p class="wp-block-paragraph">Pass <code>date=YYYY-MM-DD</code>, <code>date=today</code>, or <code>date=tomorrow</code> for a single date. To grab a range, use <code>date_start</code> and <code>date_end</code>. You can request up to 365 days of data in one call:</p>


<pre class="wp-block-code"><code>https://api.sunrisesunset.io/json?lat=38.62&amp;lng=-90.19&amp;date_start=2026-06-01&amp;date_end=2026-06-07</code></pre>


<h3 class="wp-block-heading">Time format</h3>


<p class="wp-block-paragraph">Pass <code>time_format=24</code> for 24-hour times, <code>time_format=military</code>, or <code>time_format=unix</code> for UTC timestamps. The default is 12-hour with AM/PM.</p>


<h3 class="wp-block-heading">ISO 8601 output</h3>


<p class="wp-block-paragraph">If you want machine-parseable timestamps instead of strings like <code>"6:48:29 AM"</code>, pass <code>formatted=0</code>. The response switches to ISO 8601, and <code>day_length</code> comes back as seconds.</p>


<h3 class="wp-block-heading">Elevation</h3>


<p class="wp-block-paragraph">Sunrise and sunset are automatically adjusted for the terrain elevation at the requested coordinates. Higher elevations give an earlier sunrise and a later sunset, which matters more than people expect for mountain or coastal locations. Pass <code>elevation=false</code> to disable the adjustment, or pass a value in meters (like <code>elevation=1609</code>) to override the detected value.</p>


<h3 class="wp-block-heading">Timezone</h3>


<p class="wp-block-paragraph">Times return in the location&#8217;s local timezone by default. Pass <code>timezone=Europe/Paris</code> (any tz database name) to force a different zone.</p>


<h3 class="wp-block-heading">JSONP</h3>


<p class="wp-block-paragraph">If you need to call the API from a browser environment that requires JSONP, pass <code>callback=yourFunctionName</code> and the response will be wrapped accordingly.</p>


<h2 class="wp-block-heading">Status codes</h2>


<p class="wp-block-paragraph">The API returns a specific <code>status</code> field you can branch on:</p>


<ul class="wp-block-list">
<li><code>OK</code> for a successful request</li>


<li><code>INVALID_REQUEST</code> for malformed parameters</li>


<li><code>INVALID_DATE</code> for a bad date format</li>


<li><code>INVALID_TZID</code> for an unrecognized timezone</li>


<li><code>UNKNOWN_ERROR</code> if something fails server-side</li>

</ul>


<p class="wp-block-paragraph">One edge case worth knowing: at extreme latitudes near the poles, sunrise or sunset may not exist on a given day. In those cases the corresponding field returns <code>null</code> rather than a time string. Check for it if your app might be queried for arctic or antarctic coordinates.</p>


<h2 class="wp-block-heading">What to build with it</h2>


<p class="wp-block-paragraph">A few patterns the API gets used for:</p>


<ul class="wp-block-list">
<li>Photography apps showing golden hour, blue hour, and twilight for a chosen location</li>


<li>Outdoor reservation sites that need to know whether a booking is in daylight</li>


<li>Local business pages displaying sunset times to give visitors context</li>


<li>Smart home dashboards triggering events around solar noon or civil twilight</li>


<li>Travel sites comparing day length and sunset azimuth across destinations</li>


<li>Astronomy apps using moon phase and illumination data for planning</li>

</ul>


<p class="wp-block-paragraph">A few less obvious uses I&#8217;ve seen people build:</p>


<ul class="wp-block-list">
<li><strong>Astrophotography planning.</strong> Use the nautical twilight times and <code>moon_illumination</code> to find true dark windows when the moon isn&#8217;t washing out the sky.</li>


<li><strong>Wedding ceremony timing.</strong> Pair <code>golden_hour</code> with <code>sunset_azimuth</code> to recommend a ceremony time and orient the altar so the sunset frames the couple.</li>


<li><strong>Drone shows and fireworks.</strong> Trigger the first launch once <code>last_light</code> passes a threshold, so the sky is actually dark enough for the show to land.</li>


<li><strong>Solar panel installations.</strong> Use <code>sun_altitude</code> and <code>sun_azimuth</code> at solar noon, combined with the auto-detected <code>elevation</code>, to recommend roof tilt and orientation for a given address.</li>


<li><strong>Hiking trail safety.</strong> Compare <code>last_light</code> against the hiker&#8217;s estimated return time and warn before they commit to a leg they can&#8217;t finish in daylight.</li>


<li><strong>Trick-or-treat timers.</strong> Ping parents when civil twilight starts on October 31st in their location so they know it&#8217;s officially dark enough.</li>


<li><strong>Religious observance apps.</strong> Compute Islamic prayer times (Fajr at first light, Maghrib at sunset, Isha at last light) or Sabbath start times from the sunset and twilight fields.</li>


<li><strong>Real estate listings.</strong> Show a property&#8217;s <code>day_length</code> and <code>golden_hour</code> window as part of the listing so buyers know exactly how much natural light to expect.</li>

</ul>


<p class="wp-block-paragraph">The only requirement when using the free API in production is including a link back to <a href="https://sunrisesunset.io/" data-wpel-link="exclude">SunriseSunset.io</a> from any page or app that displays the data.</p>

<p>The post <a href="https://drawne.com/javascript-sunset-times-api/">Displaying Sunset Times in Javascript using a Free Sunset Times API</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/javascript-sunset-times-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Building a Blog Title Generator with AI</title>
		<link>https://drawne.com/building-a-blog-title-generator-with-ai/</link>
					<comments>https://drawne.com/building-a-blog-title-generator-with-ai/#respond</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Fri, 18 Nov 2022 17:24:07 +0000</pubDate>
				<category><![CDATA[Build in Public]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=2953</guid>

					<description><![CDATA[<p>TL;DR I built a free blog title generator on my friend Ryan Robinson&#8217;s site using OpenAI&#8217;s API. This process has led us to create RightBlogger, an AI tool suite for bloggers. It&#8217;s incredible to finally see AI reach a usable point to built web products easily. It all started when I found OpenAI&#8217;s GPT-3 API ... </p>
<p class="read-more-container"><a title="Building a Blog Title Generator with AI" class="read-more button" href="https://drawne.com/building-a-blog-title-generator-with-ai/#more-2953" aria-label="Read more about Building a Blog Title Generator with AI" data-wpel-link="internal">Read more</a></p>
<p>The post <a href="https://drawne.com/building-a-blog-title-generator-with-ai/">Building a Blog Title Generator with AI</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">TL;DR I built a <a href="https://www.ryrob.com/blog-title-generator/" data-wpel-link="exclude">free blog title generator</a> on my friend Ryan Robinson&#8217;s site using OpenAI&#8217;s API. This process has led us to create RightBlogger, an AI tool suite for bloggers.</p>



<p class="wp-block-paragraph">It&#8217;s incredible to finally see AI reach a usable point to built web products easily. It all started when I found <a href="https://openai.com/api/" data-wpel-link="external" rel="nofollow external noopener noreferrer">OpenAI&#8217;s GPT-3 API</a> which allows you to submit a &#8220;prompt&#8221; and get a response from their AI engine. Of course since I built this tool originally in 2022 AI has massively accelerated with the launch of models like GPT-5.4 and Gemini 3.1 Pro.</p>



<h2 class="wp-block-heading">Adding AI to Write at Scale</h2>



<p class="wp-block-paragraph">I even started to play around with OpenAI&#8217;s API to auto-write descriptions on my site <a href="https://sunrisesunset.io/" data-wpel-link="exclude">SunriseSunset.io</a> since I had no way to manually write city descriptions for 100,000+ cities.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1200" height="675" src="https://drawne.com/wp-content/uploads/2022/11/sunrise-sunset-city-description-1200x675.jpg" alt="AI city description on SunriseSunset.io" class="wp-image-2971" srcset="https://drawne.com/wp-content/uploads/2022/11/sunrise-sunset-city-description-1200x675.jpg 1200w, https://drawne.com/wp-content/uploads/2022/11/sunrise-sunset-city-description-760x428.jpg 760w, https://drawne.com/wp-content/uploads/2022/11/sunrise-sunset-city-description-768x432.jpg 768w, https://drawne.com/wp-content/uploads/2022/11/sunrise-sunset-city-description-1536x864.jpg 1536w, https://drawne.com/wp-content/uploads/2022/11/sunrise-sunset-city-description.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px" /><figcaption class="wp-element-caption">AI city description on SunriseSunset.io</figcaption></figure>



<p class="wp-block-paragraph">One of the key things to know about building AI powered tools is how to write prompts that return meaningful results. That&#8217;s where the creativity comes in. The more context and guidance you give GPT-5, the better the output. If you&#8217;re new to writing prompts, here is a full list of <a href="https://rightblogger.com/blog/chatgpt-prompts-writing" data-wpel-link="exclude">ChatGPT prompts for writers</a>.</p>



<p class="wp-block-paragraph">After experimenting on SunriseSunset I wanted to build something more useful and luckily my friend Ryan Robinson had the perfect use case.</p>



<h2 class="wp-block-heading">Building Free AI Tools for RyRob</h2>



<p class="wp-block-paragraph">Ryan needed a blog title generator for his blog which I figured it would be the perfect use of GPT-5. When I built this tool other blog title generators seemed to just auto-fill your keyword into a preset list of phrases (how boring). It&#8217;s funny to think about how people expected free web tools to work before AI.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="992" height="578" src="https://drawne.com/wp-content/uploads/2022/11/Screenshot-2022-11-18-at-11.29.38-AM.png" alt="Example of a prompt and AI generated headlines using the OpenAI playground" class="wp-image-2979" srcset="https://drawne.com/wp-content/uploads/2022/11/Screenshot-2022-11-18-at-11.29.38-AM.png 992w, https://drawne.com/wp-content/uploads/2022/11/Screenshot-2022-11-18-at-11.29.38-AM-760x443.png 760w, https://drawne.com/wp-content/uploads/2022/11/Screenshot-2022-11-18-at-11.29.38-AM-768x447.png 768w" sizes="(max-width: 992px) 100vw, 992px" /><figcaption class="wp-element-caption">Example of a prompt and AI generated headlines using the OpenAI playground</figcaption></figure>



<p class="wp-block-paragraph">Using GPT-5 (which <a href="https://rightblogger.com/blog/what-does-gpt-stand-for" data-wpel-link="exclude">stands for Generative Pre-trained Transformer</a>) gives you the ability to dynamically respond to a user&#8217;s input as if a person is replying. It handles typos and messy input gracefully, which makes it practical for real users.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1200" height="675" src="https://drawne.com/wp-content/uploads/2022/11/blog-title-generator-example-1200x675.jpg" alt="Example output from the blog title generator" class="wp-image-2973" srcset="https://drawne.com/wp-content/uploads/2022/11/blog-title-generator-example-1200x675.jpg 1200w, https://drawne.com/wp-content/uploads/2022/11/blog-title-generator-example-760x428.jpg 760w, https://drawne.com/wp-content/uploads/2022/11/blog-title-generator-example-768x432.jpg 768w, https://drawne.com/wp-content/uploads/2022/11/blog-title-generator-example-1536x864.jpg 1536w, https://drawne.com/wp-content/uploads/2022/11/blog-title-generator-example.jpg 1920w" sizes="(max-width: 1200px) 100vw, 1200px" /><figcaption class="wp-element-caption">Example output from the blog title generator</figcaption></figure>



<p class="wp-block-paragraph">While the blog title generator can give you some great ideas for headlines it&#8217;s still recommended to modify them or write your own. It&#8217;s just kind of a super charged way to get inspiration for your post.</p>



<figure class="wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Out of title ideas for your blog posts? My new free tool is here to help!<br><br>It takes your keywords or topic to generate dozens of relevant ideas.<br><br>Give it a try👇<a href="https://t.co/jHjLlUBgf2" data-wpel-link="external" rel="nofollow external noopener noreferrer">https://t.co/jHjLlUBgf2</a> <a href="https://t.co/nWp0jiH1gI" data-wpel-link="external" rel="nofollow external noopener noreferrer">pic.twitter.com/nWp0jiH1gI</a></p>&mdash; Ryan Robinson (@TheRyanRobinson) <a href="https://twitter.com/TheRyanRobinson/status/1590017338287525889?ref_src=twsrc%5Etfw" data-wpel-link="external" rel="nofollow external noopener noreferrer">November 8, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<p class="wp-block-paragraph">If you are planning on building a web tool with <a href="https://openai.com/index/introducing-gpt-5/" data-wpel-link="external" rel="nofollow external noopener noreferrer">GPT-5</a> and OpenAI keep in mind it&#8217;s usage based pricing. So if you have a large prompt or a lot of users costs can add up quickly. You&#8217;ll likely want to add a captcha, accounts, or some kind of rate limiting.</p>




<p class="wp-block-paragraph">Try out the <a href="https://www.ryrob.com/blog-title-generator/" data-wpel-link="exclude">blog title generator</a> yourself and let me know how it works for you. I&#8217;ve also built a number of <a href="https://www.ryrob.com/tools/" data-wpel-link="exclude">free AI tools</a> for Ryan&#8217;s site that thousands of people use every month. If you want to build your own embeddable AI tools for lead generation, I developed <a href="https://rightblogger.com/studio" data-wpel-link="exclude">AI Tool Studio</a> on RightBlogger specifically for that.</p>
<p>The post <a href="https://drawne.com/building-a-blog-title-generator-with-ai/">Building a Blog Title Generator with AI</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/building-a-blog-title-generator-with-ai/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How a Domain Name was Stolen on GoDaddy&#8217;s Afternic Platform</title>
		<link>https://drawne.com/godaddy-afternic-scam/</link>
					<comments>https://drawne.com/godaddy-afternic-scam/#comments</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Fri, 15 Jul 2022 21:23:25 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=2908</guid>

					<description><![CDATA[<p>This is a story about how the domain SmartWP.com was stolen from me and my friend Ryan Robinson. I&#8217;d consider myself pretty savvy with web security and domain name registrar but had no idea what GoDaddy had in store for us. TLDR; Don&#8217;t keep any domain of value on GoDaddy, I recommend using Cloudflare as ... </p>
<p class="read-more-container"><a title="How a Domain Name was Stolen on GoDaddy&#8217;s Afternic Platform" class="read-more button" href="https://drawne.com/godaddy-afternic-scam/#more-2908" aria-label="Read more about How a Domain Name was Stolen on GoDaddy&#8217;s Afternic Platform" data-wpel-link="internal">Read more</a></p>
<p>The post <a href="https://drawne.com/godaddy-afternic-scam/">How a Domain Name was Stolen on GoDaddy&#8217;s Afternic Platform</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>This is a story about how the domain <a href="https://smartwp.com/" data-wpel-link="exclude">SmartWP.com</a> was stolen from me and my friend <a href="https://www.ryrob.com/" data-wpel-link="exclude">Ryan Robinson</a>.</strong> I&#8217;d consider myself pretty savvy with web security and domain name registrar but had no idea what GoDaddy had in store for us.</p>



<p class="wp-block-paragraph"><strong>TLDR; Don&#8217;t keep any domain of value on GoDaddy, I recommend using Cloudflare as a registrar.</strong></p>



<p class="wp-block-paragraph">Before I start I just want to preface that <span style="text-decoration: underline">Afternic is a company owned by GoDaddy</span> and is a domain name auction platform. I was unfamiliar with this site but it basically functions as GoDaddy auctions but off of GoDaddy. Domain names for sale on Afternic will also show up on GoDaddy auctions and various platforms.</p>



<p class="wp-block-paragraph">In this post I&#8217;ll be going over a couple things:</p>



<ul class="wp-block-list">
<li>How I think <strong>the GoDaddy &amp; Afternic domain sale system is broken</strong>.</li>



<li><strong>What to do if you receive a &#8220;Action required: Authorize your domain listings.&#8221; email.</strong></li>



<li>General visibility into how <strong>your domains can be vulnerable on GoDadd</strong>y.</li>
</ul>



<p class="wp-block-paragraph">Let&#8217;s start from the beginning with the &#8220;Action required: Authorize your domain listings.&#8221; email from Godaddy and Afternic. To be clear Afternic is owned by GoDaddy so I find this shocking how this system works on their end.</p>



<h2 class="wp-block-heading">&#8220;Authorize your participation in Afternic.&#8221; Email</h2>



<p class="wp-block-paragraph">The SmartWP.com domain is in Ryan&#8217;s account so all of this happens through his GoDaddy account. We bought the domain in 2019 from GoDaddy auctions for $400.</p>



<p class="wp-block-paragraph"><strong>March 3rd, 2022</strong> Ryan forwards me an email with the subject &#8220;Action required: Authorize your domain listings.&#8221;. I&#8217;m used to getting hundreds of password reset emails or similar emails so nothing was that alarming to me. Typically companies will include a &#8220;I didn&#8217;t request this&#8221; button but this email didn&#8217;t have that so I just warned Ryan not to click anything and we&#8217;ll just ignore it.</p>



<p class="wp-block-paragraph">My assumption was that if you don&#8217;t click authorize now it won&#8217;t authorize.</p>



<p class="wp-block-paragraph">We were wrong about that assumption.</p>



<p class="wp-block-paragraph">My second assumption was that if this authorization is approved Ryan would receive a second email.</p>



<p class="wp-block-paragraph">We were also wrong about this.</p>


<div class="wp-block-image is-resized">
<figure class="aligncenter size-large"><img decoding="async" width="1200" height="872" src="https://drawne.com/wp-content/uploads/2022/07/afternic-authorization-email-1200x872.jpg" alt="" class="wp-image-2918" srcset="https://drawne.com/wp-content/uploads/2022/07/afternic-authorization-email-1200x872.jpg 1200w, https://drawne.com/wp-content/uploads/2022/07/afternic-authorization-email-760x552.jpg 760w, https://drawne.com/wp-content/uploads/2022/07/afternic-authorization-email-768x558.jpg 768w, https://drawne.com/wp-content/uploads/2022/07/afternic-authorization-email-1536x1116.jpg 1536w, https://drawne.com/wp-content/uploads/2022/07/afternic-authorization-email.jpg 2046w" sizes="(max-width: 1200px) 100vw, 1200px" /><figcaption class="wp-element-caption">Afternic authorization email</figcaption></figure>
</div>


<p class="wp-block-paragraph">We ignored the email (and received ZERO further emails mentioning Afternic).</p>



<p class="wp-block-paragraph">Fast forward to July 2nd, 2022. I wanted to make a DNS change to SmartWP so I logged in via delegate access. This is where things got funny, I noticed SmartWP wasn&#8217;t in his account. Which I figured maybe he moved it or the GoDaddy UI was messed up.</p>



<p class="wp-block-paragraph">So I sent Ryan a quick text to check if he moved the domain.</p>


<div class="wp-block-image is-resized">
<figure class="aligncenter size-full"><img decoding="async" width="824" height="428" src="https://drawne.com/wp-content/uploads/2022/07/july-2-2022.png" alt="" class="wp-image-2932" srcset="https://drawne.com/wp-content/uploads/2022/07/july-2-2022.png 824w, https://drawne.com/wp-content/uploads/2022/07/july-2-2022-760x395.png 760w, https://drawne.com/wp-content/uploads/2022/07/july-2-2022-768x399.png 768w" sizes="(max-width: 824px) 100vw, 824px" /></figure>
</div>


<p class="wp-block-paragraph">So he looked through his account, no indication that the SmartWP domain ever existed in it besides renewal bills he could see.</p>


<div class="wp-block-image is-resized">
<figure class="aligncenter size-full"><img decoding="async" width="822" height="962" src="https://drawne.com/wp-content/uploads/2022/07/july-3-2022.png" alt="" class="wp-image-2934" srcset="https://drawne.com/wp-content/uploads/2022/07/july-3-2022.png 822w, https://drawne.com/wp-content/uploads/2022/07/july-3-2022-760x889.png 760w, https://drawne.com/wp-content/uploads/2022/07/july-3-2022-768x899.png 768w" sizes="(max-width: 822px) 100vw, 822px" /></figure>
</div>


<p class="wp-block-paragraph">This is probably the part that made me the most angry, GoDaddy support clearly isn&#8217;t trained on this platform or integration. Why wouldn&#8217;t their first response be &#8220;oh you authorized a sale on X date so the domain sold&#8221;.</p>



<p class="wp-block-paragraph">In the time that GoDaddy response was working to get back to us the person who stole the domain already sold it which is probably the craziest part.</p>



<p class="wp-block-paragraph">If GoDaddy support had been trained for this we could have cancelled the auction before it ever sold.</p>


<div class="wp-block-image is-resized">
<figure class="aligncenter size-full"><img decoding="async" width="1170" height="740" src="https://drawne.com/wp-content/uploads/2022/07/goaddy-email-smartwp-sale.png" alt="" class="wp-image-2943" srcset="https://drawne.com/wp-content/uploads/2022/07/goaddy-email-smartwp-sale.png 1170w, https://drawne.com/wp-content/uploads/2022/07/goaddy-email-smartwp-sale-760x481.png 760w, https://drawne.com/wp-content/uploads/2022/07/goaddy-email-smartwp-sale-768x486.png 768w" sizes="(max-width: 1170px) 100vw, 1170px" /></figure>
</div>


<p class="wp-block-paragraph">This kind of blew our mind at this point, there is no way Ryan authorized this and he checked for any follow up emails.</p>



<p class="wp-block-paragraph">This eventually lead us to give up and get SmartWP.co as a backup.</p>



<p class="wp-block-paragraph">Later I&#8217;ll go over how we recovered the domain but first I want to go over what to do if you get this email from GoDaddy.</p>



<p class="wp-block-paragraph"><strong>What to do if you get the &#8220;Action required: Authorize your domain listings.&#8221; email?</strong></p>



<p class="wp-block-paragraph"><strong>If you get an email from GoDaddy Authorize your participation in Afternic I highly recommend calling them right away</strong>. Of course don&#8217;t click anything in the email but you&#8217;ll want to call them and 100% confirm that this &#8220;integration&#8221; isn&#8217;t connecting to your account/domain.</p>



<p class="wp-block-paragraph">I am convinced after you get this email an attacker is trying to social engineer GoDaddy support to authorize the domain from under you. I have check all of Ryan&#8217;s account logs for his email and GoDaddy account and see 0 suspicious logins.</p>



<h2 class="wp-block-heading">How We Got the Domain Back</h2>



<p class="wp-block-paragraph">I&#8217;m not sure if everyone will be as lucky as we were. Ryan spent over 5 hours with support unable to resolve this until someone at GoDaddy saw his tweet and pushed it up to the office of the CEO.</p>



<p class="wp-block-paragraph">So for most users I sadly don&#8217;t think this will be a path forward.</p>



<p class="wp-block-paragraph">On July 8th Ryan make this tweet below after he realizes the domain is gone from his account. We also see that it&#8217;s on sale for $65,000 on Afternic.</p>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Do I know anyone at <a href="https://twitter.com/GoDaddy?ref_src=twsrc%5Etfw" data-wpel-link="external" rel="nofollow external noopener noreferrer">@GoDaddy</a> who can help me get back a domain that&#39;s been stolen from my acct?<br><br>The domain was:<br><br>1. Transferred out of my acct w/ spoofed authorization<br>2. Sold the DAY AFTER I contacted support<br><br>Doing a vid/post about this soon w/ <a href="https://twitter.com/sup?ref_src=twsrc%5Etfw" data-wpel-link="external" rel="nofollow external noopener noreferrer">@sup</a> <a href="https://twitter.com/GoDaddyHelp?ref_src=twsrc%5Etfw" data-wpel-link="external" rel="nofollow external noopener noreferrer">@GoDaddyHelp</a> <a href="https://twitter.com/GoDaddyPro?ref_src=twsrc%5Etfw" data-wpel-link="external" rel="nofollow external noopener noreferrer">@GoDaddyPro</a></p>&mdash; Ryan Robinson (@TheRyanRobinson) <a href="https://twitter.com/TheRyanRobinson/status/1545534677762465792?ref_src=twsrc%5Etfw" data-wpel-link="external" rel="nofollow external noopener noreferrer">July 8, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<p class="wp-block-paragraph">Ryan got a bunch of useful leads from this email and eventually the director of education at GoDaddy reached out to him and pushed the issue up the chain.</p>



<p class="wp-block-paragraph">After a few days we learned that the office of the CEO was dealing with the issue and we waited. They said they&#8217;d reach out on July 15th with details.</p>



<p class="wp-block-paragraph">And just like that Ryan got an email saying the domain is in his account and a call from the CEO office. They weren&#8217;t able to give us any more details which I assume is to prevent a lawsuit but we&#8217;re happy with the outcome.</p>



<p class="wp-block-paragraph">We spent 3 years building content and backlinks to the site so it would have been a shame to lose the domain.</p>



<h2 class="wp-block-heading">Changes I&#8217;d Love to see GoDaddy Make</h2>



<p class="wp-block-paragraph">Here&#8217;s some feedback for GoDaddy about their Afternic platform. I came to these conclusions after I tried to list a domain using this integration so I could see the inner workings.</p>



<p class="wp-block-paragraph">Basically ANYONE can signup for Afternic and list YOUR domain for sale. The tricky part come in with their &#8220;instant transfer&#8221; feature. If the seller (which doesn&#8217;t have to be connected to your GoDaddy account) opts into the instant transfer feature GoDaddy will send the authorization email noted above to the corresponding GoDaddy account.</p>



<p class="wp-block-paragraph">This means you can in theory bulk spam people authorization emails in hopes that someone accidentally approves it. Worse I am assuming a scammer can call GoDaddy and convince them to authorize it.</p>



<p class="wp-block-paragraph">Ideally they should simple remove Afternic from their products, they have an auction platform currently so I am not sure why it it even exists. Afternic is basically designed in a way to help scammers, the user who uses it to sell your domain can have a separate contact, separate payout, and completely different information from the domain holder&#8217;s account.</p>



<p class="wp-block-paragraph">That being said here&#8217;s some small changes I think they can make to the Afternic authorization system that exists after testing how it works currently.</p>



<ol class="wp-block-list">
<li>Send multiple emails for every step of the process. I tried authorizing this process on my end and it only send ONE email, the initial email listed above. There needs to be a &#8220;You Authorized Afternic&#8221; email that follows up the connection. This would give someone the change to realize something is happening to their domain.</li>



<li>Second the GoDaddy UI doesn&#8217;t note ANYTHING about Afternic. If you have a domain authorized for sale in Afternic your domain will still appear &#8220;locked&#8221; and not listed for sale on GoDaddy auctions. Meaning you won&#8217;t even know that your domain is for sale if you check your GoDaddy account frequently.</li>



<li>I would love if they had an audit log of approvals like this. After searching the UI there is no indication you approved such a thing, which is insane considering it basically hands your account over to anyone.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<p class="wp-block-paragraph">Thanks for reading! I really hope this doesn&#8217;t happen to others.</p>



<p class="wp-block-paragraph">From my research, I can tell this happens to others. Since posting this article, I&#8217;ve had many reach out and say the same thing has happened to them. As you may know, DNS records can remain the same as domains are for sale, so most users won&#8217;t even know this is happening as their domain is sold out from under them.</p>



<p class="wp-block-paragraph">If you are looking to move your domains I highly recommend using <a href="https://www.cloudflare.com/products/registrar/" data-wpel-link="external" rel="nofollow external noopener noreferrer">Cloudflare as your registrar</a>.</p>
<p>The post <a href="https://drawne.com/godaddy-afternic-scam/">How a Domain Name was Stolen on GoDaddy&#8217;s Afternic Platform</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/godaddy-afternic-scam/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>Social Warfare Review: Social Sharing WordPress Plugin</title>
		<link>https://drawne.com/social-warfare-review/</link>
					<comments>https://drawne.com/social-warfare-review/#respond</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Thu, 07 Feb 2019 17:09:43 +0000</pubDate>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[Social Media]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=2428</guid>

					<description><![CDATA[<p>Social Warfare Review: Social Sharing Plugin for WordPress Everyone wants their content shared on social media and WordPress offers a massive selection of social sharing plugins. I stumbled across Social Warfare and Social Warfare pro while trying out social plugins. Here is my review of Social Warfare. What is Social Warfare? Social Warfare offers a simple ... </p>
<p class="read-more-container"><a title="Social Warfare Review: Social Sharing WordPress Plugin" class="read-more button" href="https://drawne.com/social-warfare-review/#more-2428" aria-label="Read more about Social Warfare Review: Social Sharing WordPress Plugin" data-wpel-link="internal">Read more</a></p>
<p>The post <a href="https://drawne.com/social-warfare-review/">Social Warfare Review: Social Sharing WordPress Plugin</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1><strong>Social Warfare Review:</strong><br /> Social Sharing Plugin for WordPress</h1>
<p>Everyone wants their content shared on social media and WordPress offers a massive selection of <strong>social sharing plugins</strong>.</p>
<p>I stumbled across Social Warfare and Social Warfare pro while trying out social plugins.</p>
<p>Here is my review of <strong>Social Warfare.</strong></p>
<p>												<img decoding="async" width="630" height="400" src="https://drawne.com/wp-content/uploads/2019/01/social-performance-630x400-1.png" alt="" loading="lazy" />														</p>
<h2>What is Social Warfare?</h2>
<p><a href="http://geni.us/y4J8ar" data-wpel-link="external" rel="nofollow external noopener noreferrer"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/social-warfare-homepage-wordpress-plugin-760x397.jpg" alt="" width="416" height="217" /></a></p>
<p>Social Warfare offers a simple way to add share buttons to your WordPress site. This review is based off the Pro version but you can find the free version on <a href="https://wordpress.org/plugins/social-warfare/" data-wpel-link="external" rel="nofollow external noopener noreferrer">WordPress.org</a> which offers limited options.</p>
<p>Best of all it offers support for things like &#8216;click to tweet&#8217; buttons and pulling social share metrics.</p>
<p>https://drawne.com/wp-content/uploads/2019/02/social-warfare-social-networks.mp4</p>
<p>The free version of Social Warfare will feet most people&#8217;s needs but if you need support for Reddit, WhatsApp, Pocket, Buffer, Email you&#8217;ll want to get Social Warfare Pro.</p>
<p>In addition to more social networks Social Warfare Pro offers pin buttons on images, button designs, and a lot more in depth options.</p>
<p><strong>Social Warfare Features:</strong></p>
<ul>
<li>Automatically add social share buttons to your posts</li>
<li>Support for Facebook, Twitter, Google+, Pinterest, LinkedIn, and Mix</li>
<li>Display home many times content has been shared on social</li>
</ul>
<p><strong>Additional Social Warfare Pro Features:</strong></p>
<ul>
<li> Additional social networks</li>
<li>Button design options including color schemes</li>
<li>Pin it buttons on images in articles</li>
</ul>
<h2>Reasons I use Social Warfare over other Plugins</h2>
<p>I have used plenty of social share plugins for WordPress and I have found that most of them cause formatting issues or just add a lot of bloat to pages. One of my favorite things about Social Warfare is how little it affect page load speed and the simple yet effective button design.</p>
<p>The pro version of the plugin offers plenty of button design options. I have found the default square colored buttons to be the most familiar and pleasing but if you want to heavily customize you can. This includes modifying button shape, size, and color schemes.</p>
<p style="text-align: center"><strong>Need Color Inspiration?</strong><br /><em>View: <a href="https://colorkit.co/palettes/" data-wpel-link="exclude">Best Color Palettes</a></em></p>
<p><a href="https://drawne.com/wp-content/uploads/2019/02/social-warfare-style-options.jpg" data-wpel-link="internal"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/02/social-warfare-style-options-760x466.jpg" alt="" width="373" height="229" /></a></p>
<p>One feature I have never seen in any other social sharing plugins is the ability to set a custom Pinterest image. This is huge if you plan on getting traffic from Pinterest. While editing a post you can set a custom image and text to go along with it for when the user hits the pin button. If you want a high traffic blog I recommend adding a tall Pinterest image to all of your longer posts.</p>
<p><a href="https://drawne.com/wp-content/uploads/2019/02/social-warfare-pinterest-options.jpg" data-wpel-link="internal"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/02/social-warfare-pinterest-options-760x333.jpg" alt="" width="382" height="167" /></a></p>
<p>In addition to share buttons you can also embed &#8216;click to tweet&#8217; widgets that give a user a call to action to tweet something from an article. It&#8217;s also super simple to add them to your article since it adds an embed button to the WordPress editor (and a block for <a href="https://drawne.com/gutenberg-blocks-plugins/" data-wpel-link="internal">Gutenberg</a> users).</p>
<p><a href="https://drawne.com/wp-content/uploads/2019/02/social-warfare-click-to-tweet-options.jpg" data-wpel-link="internal"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/02/social-warfare-click-to-tweet-options-760x331.jpg" alt="" width="389" height="169" /></a></p>
<p>Social Warfare also adds social share counts to your articles in the WordPress dashboard. I have found this feature to be extremely useful since you may have articles being shared you were unaware of. Best of all if you are an advanced WordPress developer you can use this metric in custom search algorithms for sorting.</p>
<p><a href="https://drawne.com/wp-content/uploads/2019/02/social-shares-in-wordpress-admin.jpg" data-wpel-link="internal"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/02/social-shares-in-wordpress-admin-760x945.jpg" alt="" width="261" height="325" /></a></p>
<p>The plugin lets you select display options based on post types. So if you only want share buttons on your single blog posts it&#8217;s simple to do. If you&#8217;re a developer you can manually add the Social Warfare buttons anywhere in your theme. Additionally if you want to place the share buttons in the middle of an article like this:</p>
<p>[social_warfare]</p>
<p>you can simply use the Social Warfare shortcode.</p>
<p><figure id="attachment_2481" aria-describedby="caption-attachment-2481" style="width: 406px" class="wp-caption aligncenter"><a href="https://drawne.com/wp-content/uploads/2019/02/social-warfare-display-settings.jpg" data-wpel-link="internal"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/02/social-warfare-display-settings-760x451.jpg" alt="" width="416" height="247" /></a><figcaption id="caption-attachment-2481" class="wp-caption-text">Social Warfare display settings</figcaption></figure>		</p>
<h2>Social Warfare Frustrations</h2>
<p>With all of the benefits of Social Warfare there is one main downside for my site I have found using the plugin.</p>
<p>First of all you can&#8217;t use the share buttons for archive pages. So for example if your blog revolves heavily around category and taxonomy pages you can&#8217;t add share buttons to those even programmatically. You can have share buttons show up for each post on those pages but not the archive page specifically. Much of my site <a href="https://awesomestufftobuy.com/" data-wpel-link="exclude">AwesomeStuffToBuy</a> revolves around archive pages so I wish it offered a way to include those buttons for the actual archive page. It is quite frustrating since the share buttons work so well!</p>
<p>Additionally Social Warfare lets you set Twitter/FB share images for posts. This is a great feature but I wish it would detect if you are using <a href="https://wordpress.org/plugins/wordpress-seo/" data-wpel-link="external" rel="nofollow external noopener noreferrer">Yoast SEO</a> since the UI for selecting a social image in the plugin is quite large in the editing screen (since I would rather use Yoast to set these).</p>
<p>Another feature of Social Warfare Pro is pulling twitter share counts using third party services. This is out of the control of Social Warfare since Twitter removed share counts but I have found the third party services they integrate with to be hit or miss in grabbing numbers.</p>
<h2>Is Social Warfare Pro Worth It?</h2>
<p>If you need social share buttons on your blog I highly recommend Social Warfare pro. The additional options offered by the Pro option is well worth it. I still don&#8217;t think this is the perfect option but it&#8217;s the best social share plugin I have found for WordPress.</p>
<p>							4/5 The Best Social Share Plugin for WordPress<br />
						<i>&#xE934;</i><i>&#xE934;</i><i>&#xE934;</i><i>&#xE934;</i><i>&#xE934;</i> 4/5<br />
			<a href="http://geni.us/2JTeO5" role="button" data-wpel-link="external" rel="nofollow external noopener noreferrer"><br />
						Get Social Warfare Pro<br />
					</a></p>
<p>The post <a href="https://drawne.com/social-warfare-review/">Social Warfare Review: Social Sharing WordPress Plugin</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/social-warfare-review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://drawne.com/wp-content/uploads/2019/02/social-warfare-social-networks.mp4" length="145811" type="video/mp4" />

			</item>
		<item>
		<title>Elementor Review: The Best WordPress Page Builder in 2020?</title>
		<link>https://drawne.com/elementor-review/</link>
					<comments>https://drawne.com/elementor-review/#respond</comments>
		
		<dc:creator><![CDATA[Andy Feliciotti]]></dc:creator>
		<pubDate>Wed, 30 Jan 2019 18:42:30 +0000</pubDate>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Elementor]]></category>
		<category><![CDATA[plugins]]></category>
		<guid isPermaLink="false">https://drawne.com/?p=2362</guid>

					<description><![CDATA[<p>Elementor Review: The Best WordPress Page Builder in 2020? Page builders have taken WordPress by storm. There are tons of choices for page builders,&#160;Beaver Builder, Divi, Themify, Cornerstone, and loads more. After testing out a lot of the WordPress page builders I have found Elementor to be the best page builder for WordPress. Here is ... </p>
<p class="read-more-container"><a title="Elementor Review: The Best WordPress Page Builder in 2020?" class="read-more button" href="https://drawne.com/elementor-review/#more-2362" aria-label="Read more about Elementor Review: The Best WordPress Page Builder in 2020?" data-wpel-link="internal">Read more</a></p>
<p>The post <a href="https://drawne.com/elementor-review/">Elementor Review: The Best WordPress Page Builder in 2020?</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1><strong>Elementor Review:</strong><br /> The Best WordPress Page Builder in 2020?</h1>
<p><strong>Page builders</strong> have taken WordPress by storm. There are tons of choices for page builders,&nbsp;Beaver Builder, Divi, Themify, Cornerstone, and loads more.</p>
<p>After testing out a lot of the WordPress page builders I have found Elementor to be the best page builder for WordPress.</p>
<p>Here is my <strong>Elementor Review.<br /></strong><em>(based on Elementor Version 3.0.6)</em></p>
<p>										<img decoding="async" width="512" height="512" src="https://drawne.com/wp-content/uploads/2019/01/elementor-logo.png" alt="" loading="lazy" />											</p>
<h2>What is Elementor?</h2>
<p><a href="https://geni.us/get-elementor" data-wpel-link="external" rel="nofollow external noopener noreferrer"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-homepage-760x382.jpg" alt="" width="487" height="244" /></a></p>
<p>Elementor is a WordPress page builder that lets you build pages and posts using a simple drag and drop editor and best of all it&#8217;s compatible with all WordPress themes.</p>
<p>Elementor also offers the ability to build headers, footers, and even popups using its drag and drop editor. This is an incredible addition to any WordPress site since you can build complex pages easily.</p>
<p>https://drawne.com/wp-content/uploads/2019/01/using-elementor.mp4</p>
<p>Loaded with plenty of useful <a href="https://elementor.com/widgets/" data-wpel-link="external" rel="nofollow external noopener noreferrer">widgets</a> and widely supported by developers Elementor has quickly become the most popular page builder for WordPress.</p>
<p><strong>Main Elementor Features:</strong></p>
<ul>
<li>Lets users build pages using an easy to use drag and drop editor.</li>
<li>30 widgets to include in your pages.</li>
<li>Compatible with all WordPress themes.</li>
</ul>
<p><strong>Elementor Pro Features:</strong></p>
<ul>
<li>Fully customize your theme using the Elementor editor for your header and footer.</li>
<li>Form builder with popular marketing integrations including Mailchimp.</li>
<li>Design popups for email capture forms (or any other use cases).</li>
<li>50+ additional widgets to use in your Elementor pages.</li>
<li>Add Custom CSS to Elementor pages.</li>
<li>Advanced Custom Fields integration which lets you display ACF fields in Elementor pages (love this feature).</li>
<li>Additional WooCommerce support</li>
</ul>
<h2>Elementor Features &amp; What I love About It All</h2>
<p>If you&#8217;ve ever built a WordPress site from scratch either using a custom theme or a premium theme you know how it can be frustrating at times.</p>
<p>Many themes become unsupported overtime, are hard to learn when first installing, or worse don&#8217;t end up meeting your needs.</p>
<p>Since Elementor is separated from your theme you don&#8217;t have to worry about being locked into one theme which is simply incredible to me. I have found myself using Elementor with WordPress theme <a href="https://wpastra.com/" data-wpel-link="external" rel="nofollow external noopener noreferrer">WP Astra</a> for all new sites that I create.</p>
<p>This makes Elementor a great addition to any site looking to developer stylish pages. Best of all if you&#8217;re a <a href="https://developers.elementor.com/" data-wpel-link="external" rel="nofollow external noopener noreferrer">developer</a> there are plenty of hooks and actions that will make customizing WordPress with Elementor nearly limitless.</p>
<p>I have also been massively impressed with Elementors updates and the amount of new features they have added just from the few months I have been using the plugin.</p>
<p><b>Elementor Pro</b> includes a header and footer theme builder so you basically can overwrite all of the default elements of a theme. Things like colors and fonts are primarily controlled by the theme while Elementor can modify the design of everything else. Plus if you know CSS you can manually overwrite any element as you see fit.</p>
<p>The basic set of elements in the Elementor page builder include useful ones like a text editor (similar to the classic WP editor), headings, buttons, social icons, shortcode embed, and more. </p>
<p>This makes the free version of Elementor very useful out of the box, especially since you have access to all of the Elementor layout options for columns, rows, etc.</p>
<p><figure id="attachment_2374" aria-describedby="caption-attachment-2374" style="width: 464px" class="wp-caption aligncenter"><a href="https://drawne.com/wp-content/uploads/2019/01/elementor-basic-widgets.jpg" data-wpel-link="internal"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-basic-widgets-1200x838.jpg" alt="" width="474" height="331" /></a><figcaption id="caption-attachment-2374" class="wp-caption-text">Basic Elements in Elementor</figcaption></figure></p>
<p>Oddly enough <b>one of my favorite features</b> of Elementor is the ability to <strong>right click elements</strong>. This is one tweak I have never seen in another page builder including Gutenberg and it makes building pages quickly a breeze. No longer am I constantly clicking elements to figure out what to select, the right click gives me the most important options I need at a glance. Especially if you are building multiple pages, you can simple click copy and paste whole sections of pages into another Elementor page.</p>
<p><figure id="attachment_2369" aria-describedby="caption-attachment-2369" style="width: 279px" class="wp-caption aligncenter"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-right-click.jpg" alt="" width="289" height="311" /><figcaption id="caption-attachment-2369" class="wp-caption-text">Elementor Right Click</figcaption></figure></p>
<p>Elementor includes most of the options you need to build awesome pages. But sometimes you want to get under the hood and modify a page&#8217;s CSS. Elementor Pro includes a simple to use CSS editor to perfectly modify pages as you&#8217;d like. You can add global CSS for all pages or specific CSS to elements on the site. Plus you can add classes to any element making this bridging most gaps you&#8217;d want to manually control.</p>
<p><figure id="attachment_2367" aria-describedby="caption-attachment-2367" style="width: 311px" class="wp-caption aligncenter"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-custom-css-760x672.jpg" alt="" width="321" height="284" /><figcaption id="caption-attachment-2367" class="wp-caption-text">Elementor Custom CSS Option</figcaption></figure></p>
<p>Out of all of the page builder I have used the responsive options in Elementor just seem more thought out. Elements involving margin, padding, font-size, etc all have options to set them manually for device size. This has become extremely useful when building a responsive web pages.</p>
<p><figure id="attachment_2366" aria-describedby="caption-attachment-2366" style="width: 257px" class="wp-caption aligncenter"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-responsive-margin-options-760x782.jpg" alt="" width="267" height="275" /><figcaption id="caption-attachment-2366" class="wp-caption-text">Responsive Overwrites in Elementor</figcaption></figure></p>
<p>Additionally like many page builders you can view the entire page in a responsive editor. This make it great for quickly fixing mobile or tablet issues on your site. A lot of designers miss out on viewing the mobile experience which is the primary way people visit sites now.</p>
<p><figure id="attachment_2370" aria-describedby="caption-attachment-2370" style="width: 332px" class="wp-caption aligncenter"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-responsive-preview-760x386.jpg" alt="" width="342" height="174" /><figcaption id="caption-attachment-2370" class="wp-caption-text">Elementor Responsive Preview Mode</figcaption></figure></p>
<p>Some of the responsive options are extremely helpful like reversing the order of a column when viewed on mobile. So if you have a photo on the right hand side of a row you can have it appear on top on mobile.</p>
<p>Elementor Pro also offers the ability to create headers and footers using its editor. This means you can create complex headers and footer easily using the Elementor editor. You can also select what pages the header/footer shows up on so if you have one part of your site that you&#8217;d like to use it on it&#8217;s easy to do that.</p>
<p><strong>I can&#8217;t stress how much I love this feature.</strong></p>
<p>Being able to overwrite everything in your theme and use Elementor&#8217;s editor is incredible.</p>
<p><figure id="attachment_2385" aria-describedby="caption-attachment-2385" style="width: 418px" class="wp-caption aligncenter"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/editing-nav-menu-in-elementor-pro-760x514.jpg" alt="" width="428" height="289" /><figcaption id="caption-attachment-2385" class="wp-caption-text">Editing Nav Menu in Elementor Footer Editor</figcaption></figure></p>
<p>In addition to creating headers and footers you can also create pages for custom post types.</p>
<p>I found this extremely useful if you need to setup a custom post type page to display custom fields for example.</p>
<p><figure id="attachment_2387" aria-describedby="caption-attachment-2387" style="width: 279px" class="wp-caption aligncenter"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-single-elements.jpg" alt="" width="289" height="420" /><figcaption id="caption-attachment-2387" class="wp-caption-text">Drag and Drop Variables for Editing a Custom Post Type Template</figcaption></figure></p>
<p>Additionally the &#8216;text&#8217; widget lets you pull any custom field (<a href="https://www.advancedcustomfields.com" data-wpel-link="external" rel="nofollow external noopener noreferrer">ACF</a> supported) from the post so you can easily make pages for portfolios, video viewers, store location pages, etc. Anything where you have data in custom fields and want to display is easily. Best of all it&#8217;s beginner friendly when previously you needed a developer to modify a page like this.</p>
<p>When you create a theme page for a post type you have the ability to set when it&#8217;s displayed as well.</p>
<p><figure id="attachment_2390" aria-describedby="caption-attachment-2390" style="width: 443px" class="wp-caption aligncenter"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-conditional-theme-page-display-760x507.jpg" alt="" width="453" height="302" /><figcaption id="caption-attachment-2390" class="wp-caption-text">The Conditional Editor for Post Type Pages</figcaption></figure></p>
<p>You can also overwrite archive pages using the Elementor editor which you can see an example of a page I&#8217;ve done on the <a href="https://igdcofficial.com/podcast" data-wpel-link="exclude">IGDC Podcast</a> page. I didn&#8217;t just want to list posts like a standard archive page so I used the feature to include details to the podcast, links to download, and a list of the podcasts dynamically pulled from the post type.</p>
<p>One of the newest features to Elementor is <strong>Popups</strong>.</p>
<p>Now that you have a grasp of all of the widgets in Elementor they all can be used to create popups. Email capture, promos, cookie noticies, just about anything can be made.</p>
<p><figure id="attachment_2398" aria-describedby="caption-attachment-2398" style="width: 495px" class="wp-caption aligncenter"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-editing-a-popup-760x498.jpg" alt="" width="505" height="331" /><figcaption id="caption-attachment-2398" class="wp-caption-text">Editing a Popup in Elementor</figcaption></figure></p>
<p>After designing a popup or using one of their templates you can pick when the popup is displayed. Either using a button, or on page load, or loads of other options.</p>
<p><figure id="attachment_2397" aria-describedby="caption-attachment-2397" style="width: 593px" class="wp-caption aligncenter"><a href="https://drawne.com/wp-content/uploads/2019/01/elementor-popup-conditions.jpg" data-wpel-link="internal"><img decoding="async" src="https://drawne.com/wp-content/uploads/2019/01/elementor-popup-conditions-1200x627.jpg" alt="" width="603" height="315" /></a><figcaption id="caption-attachment-2397" class="wp-caption-text">Elementor Popup Conditions</figcaption></figure></p>
<p>Now that you have see the majority of features in Elementor the good news about all of it is that they have hundreds of templates for everything. Headers, pages, footers, pop ups, all have pre built templates.</p>
<p>So if you&#8217;re not too keen on what an about page should look like you can start with one of their templates and tailor it to your liking.</p>
<p>One thing I appreciated is the fast <b>performance</b> of the Elementor plugin as well. Many page builders I have used in the past felt sluggish. I typically use WP Rocket on my sites and achieve an under 1 second load time on Elementor pages using <a href="https://tools.pingdom.com/#5a46c70a7bc00000" data-wpel-link="external" rel="nofollow external noopener noreferrer">Pingdom</a>.</p>
<p>I hate to sound overly positive but I really haven&#8217;t found anything that hangs me up about loving Elementor.</p>
<p>[social_warfare]		</p>
<h2>How Much Does Elementor Cost?</h2>
<p><a href="https://wordpress.org/plugins/elementor/" data-wpel-link="external" rel="nofollow external noopener noreferrer">Elementor <strong>is free</strong> on WordPress.org</a> but if you want to get the most out of this page builder I highly recommend upgrading to Elementor Pro.</p>
<p>The free version of Elementor is great since it lets you get a feel for the Element editor and it includes most of the useful widgets.</p>
<p>Elementor Pro<strong> costs $49 a year</strong> but if you build a lot of websites like I do you can get an unlimited licence for $199 a year. Which for me is a steal since I can use it on all of my sites while at the same time learning more about Elementor.</p>
<p>If you&#8217;re managing many client sites using the Elementor unlimited license can quickly speed up your workflow while making your yearly costs predictable.</p>
<p>			<a href="https://geni.us/elementor-pro" role="button" data-wpel-link="external" rel="nofollow external noopener noreferrer"><br />
						Get Elementor Pro<br />
					</a></p>
<h2>Is Elementor Pro Worth It?</h2>
<p>As I said at the start of my review <strong>I HIGHLY recommend Elementor and Elementor Pro</strong>.</p>
<p>The additions that Elementor Pro brings to the Elementor builder is well worth the cost in my book. Whether you have a simple blog and want to create a stunning homepage or have a business site Elementor will meet all of your needs.</p>
<p>The fact that Elementor Pro also offers an unlimited use license also makes it fantastic if you build a lot of sites for clients. This way you are mastering one tool and can quickly work when building new sites.</p>
<p>							5/5 the Best WordPress Page Builder<br />
						<i>&#xE934;</i><i>&#xE934;</i><i>&#xE934;</i><i>&#xE934;</i><i>&#xE934;</i> 5/5<br />
			<a href="https://geni.us/elementor-pro" role="button" data-wpel-link="external" rel="nofollow external noopener noreferrer"><br />
						Get Elementor Pro<br />
					</a></p>
<p>The post <a href="https://drawne.com/elementor-review/">Elementor Review: The Best WordPress Page Builder in 2020?</a> appeared first on <a href="https://drawne.com">Andy Feliciotti</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://drawne.com/elementor-review/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://drawne.com/wp-content/uploads/2019/01/using-elementor.mp4" length="513995" type="video/mp4" />

			</item>
	</channel>
</rss>
