sept 2024 progress
This commit is contained in:
966
static/archive/alexplescan-com-ffcy9q.txt
Normal file
966
static/archive/alexplescan-com-ffcy9q.txt
Normal file
@@ -0,0 +1,966 @@
|
||||
[1]Alex Plescan
|
||||
|
||||
[2]Blog [3]Projects [4]Newsletter
|
||||
|
||||
Okay, I really like WezTerm
|
||||
|
||||
10 August 2024 | [5]Permalink
|
||||
|
||||
A while back [6]my friend recommended that I try [7]WezTerm. I’d been an iTerm
|
||||
2 stalwart for the better part of a decade, but not to be too narrow-minded I
|
||||
conceded, started it up, and saw this:
|
||||
|
||||
screenshot of WezTerm's default look
|
||||
|
||||
Does the job, sure, but doesn’t feel quite right. Okay then, experiment over.
|
||||
Back to iTerm…
|
||||
|
||||
Fast forward a couple of months and I got the itch to try a new terminal again.
|
||||
I wanted to use one whose config was entirely text based so I could pop it in
|
||||
to my dotfiles and share it across my work and personal machines. A few
|
||||
terminals already do this, but whispers of WezTerm’s powerful API and Lua
|
||||
config got me particularly interested.
|
||||
|
||||
I tried it again with a bit more patience and I’m glad I did. My terminal is
|
||||
prettier than it’s ever been, more functional, and I can finally justify my
|
||||
mechanical keyboard purchase with all the keybindings I’ve configured.
|
||||
|
||||
This post is an introduction to configuring WezTerm based on the setup that I
|
||||
eventually landed on. I’d consider it relatively low-frills. Most of what I
|
||||
talk about here can already be found in WezTerm’s [8]docs, but as they’ve got a
|
||||
large surface area, I’m hoping this post will be a useful jumping off point for
|
||||
WezTerm beginners.
|
||||
|
||||
We won’t be looking at some of WezTerm’s key features, like custom hyperlinks
|
||||
highlighting rules, searchable scrollback, quick copy mode, and image support
|
||||
(you can find [9]more details here).
|
||||
|
||||
The feature I find most exciting about WezTerm is the flexibility of its Lua
|
||||
config, so we’ll be focusing on that. This includes configuring appearance,
|
||||
keybindings, multiplexing, workspace navigation, status bar setup, and dynamic
|
||||
theming. By the end of it all, we’ll have a terminal that looks like this:
|
||||
|
||||
screenshot of the WezTerm look we'll end up with at the end of this post
|
||||
|
||||
Subtly prettier than the default, and with some great features to boot.
|
||||
|
||||
I use macOS, so what follows is focused on ergonomics that make WezTerm great
|
||||
there. I haven’t tested my config on other systems, but I’m not doing anything
|
||||
too bespoke so things should be portable (WezTerm works pretty much
|
||||
everywhere).
|
||||
|
||||
tl;dr? Here’s [10]a gist containing the config we’ll end up with.
|
||||
|
||||
Pre-flight checks
|
||||
|
||||
Start by installing WezTerm. Instructions for this are on [11]WezTerm’s site.
|
||||
If you’re on macOS and reading this you probably have Homebrew installed, so $
|
||||
brew install wezterm will do the trick.
|
||||
|
||||
Now launch WezTerm, and you’re already winning.
|
||||
|
||||
A note on Lua
|
||||
|
||||
My favourite WezTerm feature is its use of Lua for defining config. Unlike
|
||||
terminals where your settings are adjusted via the UI (iTerm 2), your WezTerm
|
||||
config lives in your dotfiles and is portable across all your machines.
|
||||
|
||||
And unlike other terminals where your configuration is written using a data
|
||||
serialization format like YAML or TOML (Alacritty, kitty), with Lua you can
|
||||
more easily achieve complex configs by leveraging dynamic scripts.
|
||||
|
||||
Granted, Lua is a programming language so it is trickier to learn than YAML or
|
||||
TOML, but it’s still remarkably simple. If you’ve used another dynamic
|
||||
programming language (e.g. Ruby, Python, JavaScript) - you should be able to
|
||||
read the Lua code in this post easily. For achieving more complex configs, I’d
|
||||
recommend diving deeper into the language. Its [12]Getting Started guide is a
|
||||
good place to… get started.
|
||||
|
||||
Config files, and the best feedback loop in town
|
||||
|
||||
WezTerm supports loading in its config from all the usual places on your system
|
||||
([13]docs). For this guide we’re going to be creating our config in
|
||||
$XDG_CONFIG_HOME/wezterm/wezterm.lua. On most systems (including macOS) this
|
||||
resolves to ~/.config/wezterm/wezterm.lua. Using a directory to store our
|
||||
config instead of dumping it in ~/.wezterm.lua will let us keep our config
|
||||
logically grouped as we split some of it out into different files.
|
||||
|
||||
Create the wezterm.lua file on that path, and add this boilerplate to it:
|
||||
|
||||
-- Import the wezterm module
|
||||
local wezterm = require 'wezterm'
|
||||
-- Creates a config object which we will be adding our config to
|
||||
local config = wezterm.config_builder()
|
||||
|
||||
-- (This is where our config will go)
|
||||
|
||||
-- Returns our config to be evaluated. We must always do this at the bottom of this file
|
||||
return config
|
||||
|
||||
Save the file and all going well… nothing will happen. Well, at least nothing
|
||||
appeared to happen, but what WezTerm did behind the scenes is quite magical. It
|
||||
watched your config file, and when it changed it auto-reloaded instantly. This
|
||||
feature makes for a wonderfully tight feedback loop where you don’t need to
|
||||
restart your terminal to see the effects of your new config.
|
||||
|
||||
We can quickly test this auto-reload by adding some invalid syntax and seeing
|
||||
what happens. Replace the call to wezterm.config_builder() with
|
||||
wezterm.config_builderZ(), save, and you should immediately see a window pop-up
|
||||
with:
|
||||
|
||||
runtime error: [string "/Users/alex/.config/wezterm/wezterm.lua"]:2: attempt
|
||||
to call a nil value (field 'config_builderZ')
|
||||
stack traceback:
|
||||
[string "/Users/alex/.config/wezterm/wezterm.lua"]:2: in main chunk
|
||||
|
||||
How’s that for a feedback loop? Fix the error and save the file again.
|
||||
|
||||
This time, have your config log something:
|
||||
|
||||
wezterm.log_info("hello world! my name is " .. wezterm.hostname())
|
||||
|
||||
Save. Now… where did that log go? Press CTRL + SHIFT + L to bring up the debug
|
||||
overlay ([14]docs) and lo and behold, your beautiful log was waiting for you
|
||||
all along. Not only that but what you’re looking at is a full Lua REPL. Enter 1
|
||||
+ 1 and you’ll see the result. Enter wezterm.home_dir and you’ll see the result
|
||||
of accessing the home_dir entry on the wezterm module ([15]docs).
|
||||
|
||||
screenshot of the WezTerm's debug overlay
|
||||
|
||||
The combination of hot reloading and the debug overlay makes experimenting with
|
||||
WezTerm configs extremely low friction and low consequence. The feedback loop
|
||||
is so tight now it’s more like a feedback lp.
|
||||
|
||||
Configuring appearance
|
||||
|
||||
Okay enough gushing - let’s cut to the chase and make this thing prettier. Add
|
||||
a few lines to the config to start customising the look of the terminal. We’ll
|
||||
start with a colour scheme ([16]docs):
|
||||
|
||||
-- Pick a colour scheme. WezTerm ships with more than 1,000!
|
||||
-- Find them here: https://wezfurlong.org/wezterm/colorschemes/index.html
|
||||
config.color_scheme = 'Tokyo Night'
|
||||
|
||||
Save, and you should immediately see it update. Thanks Wez!
|
||||
|
||||
screenshot of applying a colour scheme to WezTerm
|
||||
|
||||
(if the hot config reload doesn’t work for whatever reason, you can manually
|
||||
reload it by pressing CMD + R).
|
||||
|
||||
Many colours, all at once
|
||||
|
||||
With over 1,000 colour choices to choose from, it’s tough to decide on your
|
||||
favourite. Why not outsource that work to your computer? Let’s explore the
|
||||
power of WezTerm’s dynamic config by randomly assigning a colour scheme for
|
||||
each new window you open:
|
||||
|
||||
-- Creates a lua table containing the name of every color scheme WezTerm
|
||||
-- ships with.
|
||||
local scheme_names = {}
|
||||
for name, scheme in pairs(wezterm.color.get_builtin_schemes()) do
|
||||
table.insert(scheme_names, name)
|
||||
end
|
||||
|
||||
-- When the config for a window is reloaded (i.e. when you save this file
|
||||
-- or open a new window)...
|
||||
wezterm.on('window-config-reloaded', function(window, pane)
|
||||
-- Don't proceed if the config has already been overriden, otherwise
|
||||
-- we'll enter an infinite loop of neverending colour scheme changes.
|
||||
-- If that sounds like your kinda thing, then remove this line ;) - but
|
||||
-- don't say you haven't been warned.
|
||||
if window:get_config_overrides() then return end
|
||||
-- Pick a random colour scheme name.
|
||||
local scheme = scheme_names[math.random(#scheme_names)]
|
||||
-- Assign it as an override for this window.
|
||||
window:set_config_overrides { color_scheme = scheme }
|
||||
-- And log it for good measure
|
||||
wezterm.log_info("Your colour scheme is now: " .. scheme)
|
||||
end)
|
||||
|
||||
Open up a few windows (CMD + N on macOS) and each one will have a different
|
||||
colour scheme. A cornucopia of terminals, each more surprising than the last.
|
||||
We, my friends, are truly innovating now.
|
||||
|
||||
screenshot of many WezTerm terminal windows, each with a distinctive colour
|
||||
scheme
|
||||
|
||||
But really, that was kind of a dumb idea meant to prove a point. Now that
|
||||
you’ve gotten a taste for dynamic config, you probably wanna remove those lines
|
||||
and stick to a colour scheme you do like.
|
||||
|
||||
(You may find that after you remove that code and add your static color_scheme
|
||||
config back in, it doesn’t hot reload. That’s because our script set an
|
||||
override on the config specific to each window. To clear your overrides, you
|
||||
can go to your debug terminal and type window:set_config_overrides({}) - or you
|
||||
can just close and reopen your WezTerm window).
|
||||
|
||||
Respecting the system’s appearance
|
||||
|
||||
Light themes, dark themes… why not both? Let’s have the terminal’s colour
|
||||
scheme automatically change when the operating system’s appearance changes.
|
||||
While we’re at it, we’ll learn how to split up WezTerm config into different
|
||||
modules.
|
||||
|
||||
Create a new file alongside wezterm.lua and call it appearance.lua. Add this to
|
||||
it:
|
||||
|
||||
-- We almost always start by importing the wezterm module
|
||||
local wezterm = require 'wezterm'
|
||||
-- Define a lua table to hold _our_ module's functions
|
||||
local module = {}
|
||||
|
||||
-- Returns a bool based on whether the host operating system's
|
||||
-- appearance is light or dark.
|
||||
function module.is_dark()
|
||||
-- wezterm.gui is not always available, depending on what
|
||||
-- environment wezterm is operating in. Just return true
|
||||
-- if it's not defined.
|
||||
if wezterm.gui then
|
||||
-- Some systems report appearance like "Dark High Contrast"
|
||||
-- so let's just look for the string "Dark" and if we find
|
||||
-- it assume appearance is dark.
|
||||
return wezterm.gui.get_appearance():find("Dark")
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
return module
|
||||
|
||||
Back in wezterm.lua:
|
||||
|
||||
-- Import our new module (put this near the top of your wezterm.lua)
|
||||
local appearance = require 'appearance'
|
||||
|
||||
-- Use it!
|
||||
if appearance.is_dark() then
|
||||
config.color_scheme = 'Tokyo Night'
|
||||
else
|
||||
config.color_scheme = 'Tokyo Night Day'
|
||||
end
|
||||
|
||||
Toggle your system appearance between dark mode and light mode, and watch your
|
||||
theme change right before your eyes.
|
||||
|
||||
screenshot of WezTerm in light and dark mode
|
||||
|
||||
Fonts
|
||||
|
||||
Next up let’s look at fonts. WezTerm ships with the lovely JetBrains Mono, and
|
||||
Nerd Font Symbols ([17]docs) so there’s nothing to complain about there. I do
|
||||
prefer Berkeley Mono at 13 points though, so:
|
||||
|
||||
-- Choose your favourite font, make sure it's installed on your machine
|
||||
config.font = wezterm.font({ family = 'Berkeley Mono' })
|
||||
-- And a font size that won't have you squinting
|
||||
config.font_size = 13
|
||||
|
||||
There’s good support for ligatures and other fancy font settings if you’re into
|
||||
that ([18]docs), but I’m not so let’s move on.
|
||||
|
||||
Window styling
|
||||
|
||||
Let’s style our terminal’s window. This controls the chrome that appears around
|
||||
it, and can vary between operating systems. On macOS, I like the below:
|
||||
|
||||
-- Slightly transparent and blurred background
|
||||
config.window_background_opacity = 0.9
|
||||
config.macos_window_background_blur = 30
|
||||
-- Removes the title bar, leaving only the tab bar. Keeps
|
||||
-- the ability to resize by dragging the window's edges.
|
||||
-- On macOS, 'RESIZE|INTEGRATED_BUTTONS' also looks nice if
|
||||
-- you want to keep the window controls visible and integrate
|
||||
-- them into the tab bar.
|
||||
config.window_decorations = 'RESIZE'
|
||||
-- Sets the font for the window frame (tab bar)
|
||||
config.window_frame = {
|
||||
-- Berkeley Mono for me again, though an idea could be to try a
|
||||
-- serif font here instead of monospace for a nicer look?
|
||||
font = wezterm.font({ family = 'Berkeley Mono', weight = 'Bold' }),
|
||||
font_size = 11,
|
||||
}
|
||||
|
||||
screenshot of WezTerm after we've styled its window
|
||||
|
||||
Now, let’s do something a little kitsch. See that empty space to the right of
|
||||
our terminal’s tab bar? Let’s fill it with a powerline looking status bar.
|
||||
We’ll add an update-status callback:
|
||||
|
||||
wezterm.on('update-status', function(window)
|
||||
-- Grab the utf8 character for the "powerline" left facing
|
||||
-- solid arrow.
|
||||
local SOLID_LEFT_ARROW = utf8.char(0xe0b2)
|
||||
|
||||
-- Grab the current window's configuration, and from it the
|
||||
-- palette (this is the combination of your chosen colour scheme
|
||||
-- including any overrides).
|
||||
local color_scheme = window:effective_config().resolved_palette
|
||||
local bg = color_scheme.background
|
||||
local fg = color_scheme.foreground
|
||||
|
||||
window:set_right_status(wezterm.format({
|
||||
-- First, we draw the arrow...
|
||||
{ Background = { Color = 'none' } },
|
||||
{ Foreground = { Color = bg } },
|
||||
{ Text = SOLID_LEFT_ARROW },
|
||||
-- Then we draw our text
|
||||
{ Background = { Color = bg } },
|
||||
{ Foreground = { Color = fg } },
|
||||
{ Text = ' ' .. wezterm.hostname() .. ' ' },
|
||||
}))
|
||||
end)
|
||||
|
||||
screenshot of WezTerm with a right status bar showing the system's hostname
|
||||
|
||||
A few interesting things happening here:
|
||||
|
||||
1. We just used WezTerm’s events API with wezterm.on. Events are things that
|
||||
happen to the terminal (e.g. window resize) that we can define callbacks
|
||||
for. The update-status event is emitted periodically when the terminal is
|
||||
ready to have its status updated. WezTerm manages this cleverly to ensure
|
||||
that only one such update can run at any given time, and if your code takes
|
||||
too long to execute, a timeout will be hit and your handler will be
|
||||
abandoned… protecting your terminal from bogging down.
|
||||
2. We’re grabbing the effective_config() of the window to get the “effective”
|
||||
configuration, which is the config with any overrides applied. From this we
|
||||
can get the resolved_palette, which is the currently active colour scheme.
|
||||
To see what this data looks like you can enter the debug overlay (CTRL +
|
||||
SHIFT + L) and execute window:effective_config().resolved_palette.
|
||||
3. We’re using the wezterm.format function ([19]docs) to style our string with
|
||||
colours. Other ways you could format text include setting font weight,
|
||||
underlining text, and more.
|
||||
4. Finally, the wezterm.hostname() function ([20]docs) gives us the hostname
|
||||
of the machine we’re running on. WezTerm ships with a bunch of useful
|
||||
functions for getting the state of your system, and also… we’re doing stuff
|
||||
in Lua - so you have full access to your file system, are able to make
|
||||
network requests, etc.
|
||||
|
||||
Altogether this gives us a powerline…ish. It’s a bit sad with only one segment
|
||||
isn’t it? Don’t you worry, we’ll be adding more soon…
|
||||
|
||||
Keys
|
||||
|
||||
Here’s the part where we justify our mechanical keyboard purchases. Let’s set
|
||||
up some key assignments. During this section we’ll look at WezTerm’s deep key
|
||||
handling capabilities and ability to take action based on your input.
|
||||
|
||||
By default, WezTerm defines some standard key assignments ([21]docs). I leave
|
||||
them on because they’re very sensible, but if you wanna really wrest total
|
||||
control of your config, you can turn them off with
|
||||
config.disable_default_key_bindings = true.
|
||||
|
||||
Our first key assignment will be a humble start for us macOS users… you might
|
||||
be used to Option + Left Arrow and Option + Right Arrow jumping between words
|
||||
on your terminal. That’s the default in iTerm 2 and Terminal.app, but not in
|
||||
WezTerm. However, we can map it!
|
||||
|
||||
We do this by adding a keys table to our config:
|
||||
|
||||
-- Table mapping keypresses to actions
|
||||
config.keys = {
|
||||
-- Sends ESC + b and ESC + f sequence, which is used
|
||||
-- for telling your shell to jump back/forward.
|
||||
{
|
||||
-- When the left arrow is pressed
|
||||
key = 'LeftArrow',
|
||||
-- With the "Option" key modifier held down
|
||||
mods = 'OPT',
|
||||
-- Perform this action, in this case - sending ESC + B
|
||||
-- to the terminal
|
||||
action = wezterm.action.SendString '\x1bb',
|
||||
},
|
||||
{
|
||||
key = 'RightArrow',
|
||||
mods = 'OPT',
|
||||
action = wezterm.action.SendString '\x1bf',
|
||||
},
|
||||
}
|
||||
|
||||
By now you’ve probably figured out that you’re gonna be spending more time
|
||||
configuring WezTerm than doing actual work. There’s no shame in admitting this
|
||||
reality, so let’s encode it into our config. On macOS, the default shortcut for
|
||||
opening an application’s preferences is CMD + , - let’s make it so when we
|
||||
press this, our favourite editor opens up the WezTerm config. I’m using neovim,
|
||||
but feel free to substitute with your own:
|
||||
|
||||
config.keys = {
|
||||
-- ... add these new entries to your config.keys table
|
||||
{
|
||||
key = ',',
|
||||
mods = 'SUPER',
|
||||
action = wezterm.action.SpawnCommandInNewTab {
|
||||
cwd = wezterm.home_dir,
|
||||
args = { 'nvim', wezterm.config_file },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
Try that out, but you may see an error along the lines of:
|
||||
|
||||
Unable to spawn nvim because:
|
||||
No viable candidates found in PATH "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
|
||||
|
||||
If that error showed up, it’s typically because the process that launched
|
||||
WezTerm didn’t include a PATH environment variable that led to your editor’s
|
||||
binary (e.g. on macOS, Finder is usually WezTerm’s parent). We can work around
|
||||
this by specifying the full path to your editor in the SpawnCommandInNewTab
|
||||
properties ([22]docs), or by updating the default environment variables WezTerm
|
||||
spawns commands with. I prefer the latter, since it means that any other places
|
||||
in our config where we might spawn new commands will also inherit the same env
|
||||
vars:
|
||||
|
||||
config.set_environment_variables = {
|
||||
PATH = '/opt/homebrew/bin:' .. os.getenv('PATH')
|
||||
}
|
||||
|
||||
Try that again, and it should work.
|
||||
|
||||
We really are just scratching the surface of all the commands available ([23]
|
||||
WezTerm supports a lot). In the next section, we’ll be growing our key bindings
|
||||
further.
|
||||
|
||||
Multiplexing terminals, levelling up key assignments
|
||||
|
||||
Let’s move on to WezTerm’s multiplexing capabilities. If you make use of a
|
||||
multiplexer (i.e. tmux) then you may consider using WezTerm’s builtin
|
||||
capabilities instead. They’ll generally give you a more integrated experience,
|
||||
with individual scrollback buffers per pane, better mouse control, easier
|
||||
selection functionality, and generally faster performance.
|
||||
|
||||
Hit CTRL + SHIFT + P to bring up WezTerm’s command palette. (Yes, WezTerm has a
|
||||
command palette. Yes, it’s as customisable as everything else we’ve seen so
|
||||
far. No, we won’t dwell on it here). Type split horizontally until the “Shell:
|
||||
Split Horizontally” option is selected and hit ENTER. Ta-da! Your shell split
|
||||
horizontally! Do the same for split vertically and… you get the idea.
|
||||
|
||||
screenshot of WezTerm's command palette
|
||||
|
||||
You may have noticed that the command palette displays the keyboard shortcut
|
||||
assigned to each action. The ones for splitting are quite a fingerful, e.g.
|
||||
SHIFT + CTRL + OPTION + ". I get why they’re this complicated - because they’re
|
||||
trying not to clash with any other shortcuts you may have on your system, but
|
||||
we can do a lot better - and WezTerm gives us the tools do so easily!
|
||||
|
||||
Splitting panes, leader key
|
||||
|
||||
A leader key ([24]docs) is a special key combination that you press first,
|
||||
followed by another key combination, to perform a specific action. It can help
|
||||
you create complex shortcuts without needing to push a lot of keys all at once.
|
||||
|
||||
Sounds like a perfect fit for splitting panes, right? We’ll bind our leader to
|
||||
CTRL + A, and in case you accidentally type the leader without following it up
|
||||
with another key, we’ll have it automatically deactivate after 1,000
|
||||
milliseconds.
|
||||
|
||||
-- If you're using emacs you probably wanna choose a different leader here,
|
||||
-- since we're gonna be making it a bit harder to CTRL + A for jumping to
|
||||
-- the start of a line
|
||||
config.leader = { key = 'a', mods = 'CTRL', timeout_milliseconds = 1000 }
|
||||
|
||||
Next let’s define some key assignments for splitting panes:
|
||||
|
||||
config.keys = {
|
||||
-- ... add these new entries to your config.keys table
|
||||
{
|
||||
-- I'm used to tmux bindings, so am using the quotes (") key to
|
||||
-- split horizontally, and the percent (%) key to split vertically.
|
||||
key = '"',
|
||||
-- Note that instead of a key modifier mapped to a key on your keyboard
|
||||
-- like CTRL or ALT, we can use the LEADER modifier instead.
|
||||
-- This means that this binding will be invoked when you press the leader
|
||||
-- (CTRL + A), quickly followed by quotes (").
|
||||
mods = 'LEADER',
|
||||
action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' },
|
||||
},
|
||||
{
|
||||
key = '%',
|
||||
mods = 'LEADER',
|
||||
action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' },
|
||||
},
|
||||
}
|
||||
|
||||
Give it a go now. Press CTRL + A, quickly followed by ", and you’ll get a
|
||||
horizontal split. Use the other assignment and you’ll get a vertical split.
|
||||
|
||||
screenshot of WezTerm's with split panes
|
||||
|
||||
Before we move on - you might be wondering what happens if you actually want to
|
||||
send the CTRL + A keypress without invoking the leader? CTRL + A is useful in
|
||||
and of its own as pressing it jumps to the start of a line on your shell (and
|
||||
on operating systems like Emacs).
|
||||
|
||||
Well there’s a solution for that. We can map CTRL + A quickly followed by CTRL
|
||||
+ A to send a CTRL + A to our terminal. That’s a confusing sentence! It’ll be
|
||||
simpler to just look at the config:
|
||||
|
||||
config.keys = {
|
||||
-- ... add these new entries to your config.keys table
|
||||
{
|
||||
key = 'a',
|
||||
-- When we're in leader mode _and_ CTRL + A is pressed...
|
||||
mods = 'LEADER|CTRL',
|
||||
-- Actually send CTRL + A key to the terminal
|
||||
action = wezterm.action.SendKey { key = 'a', mods = 'CTRL' },
|
||||
},
|
||||
},
|
||||
|
||||
Moving around panes
|
||||
|
||||
Okay with that done, let’s get back to multiplexing. Next up, navigating our
|
||||
splits. I like to use vim direction keybindings, but feel free to replace with
|
||||
arrow keys instead.
|
||||
|
||||
config.keys = {
|
||||
-- ... add these new entries to your config.keys table
|
||||
{
|
||||
-- I like to use vim direction keybindings, but feel free to replace
|
||||
-- with directional arrows instead.
|
||||
key = 'j', -- or DownArrow
|
||||
mods = 'LEADER',
|
||||
action = wezterm.action.ActivatePaneDirection('Down'),
|
||||
},
|
||||
{
|
||||
key = 'k', -- or UpArrow
|
||||
mods = 'LEADER',
|
||||
action = wezterm.action.ActivatePaneDirection('Up'),
|
||||
},
|
||||
{
|
||||
key = 'h', -- or LeftArrow
|
||||
mods = 'LEADER',
|
||||
action = wezterm.action.ActivatePaneDirection('Left'),
|
||||
},
|
||||
{
|
||||
key = 'l', -- or RightArrow
|
||||
mods = 'LEADER',
|
||||
action = wezterm.action.ActivatePaneDirection('Right'),
|
||||
},
|
||||
}
|
||||
|
||||
Look at all that duplication - We’re using a dynamic language for our config
|
||||
here, we don’t need to stand for that! Let’s go on a little side quest and see
|
||||
if we can extract it to a function.
|
||||
|
||||
local function move_pane(key, direction)
|
||||
return {
|
||||
key = key,
|
||||
mods = 'LEADER',
|
||||
action = wezterm.action.ActivatePaneDirection(direction),
|
||||
}
|
||||
end
|
||||
|
||||
config.keys = {
|
||||
-- ... remove the previous move bindings, and replace with
|
||||
move_pane('j', 'Down'),
|
||||
move_pane('k', 'Up'),
|
||||
move_pane('h', 'Left'),
|
||||
move_pane('l', 'Right'),
|
||||
}
|
||||
|
||||
Ooh so much smaller, but it could be smaller still. I dare you to keep code
|
||||
golfing this down to 6 lines. Go on - I believe in you!
|
||||
|
||||
Resizing panes, and introducing key tables
|
||||
|
||||
You might’ve figured out that you can resize panes by dragging the edge of one
|
||||
with your mouse, but we’re developers here, not olympic athletes. What’re we
|
||||
expected to move our hands away from the safety of our keyboard and over to the
|
||||
mouse?! No! I won’t stand for it and neither should you!
|
||||
|
||||
It’d be really nice to use the same keys that we use for moving between the
|
||||
panes for resizing (h, j, k, l)… but they’ve already been mapped… we could add
|
||||
another key modifier that needs to be held down when we want to resize vs. move
|
||||
between the panes:
|
||||
|
||||
config.keys = {
|
||||
-- ... add this new entry to your config.keys table
|
||||
{
|
||||
key = 'h',
|
||||
mods = 'LEADER|CTRL',
|
||||
-- "3" here is the amount of cells we wish to resize
|
||||
-- the terminal by
|
||||
action = wezterm.action.AdjustPaneSize { 'Left', 3 },
|
||||
},
|
||||
}
|
||||
|
||||
But that’s no good really. We have to first push our leader CTRL + A, then push
|
||||
CTRL + H, and keep repeating that each time we wanna resize the pane to the
|
||||
left. Fingers getting sore. Send help. Oh, here comes WezTerm with the
|
||||
antidote: [25]key tables.
|
||||
|
||||
When you activate a key table you’re entering a different mode with its own set
|
||||
of assignments for whatever you’re doing. This allows you to have multiple
|
||||
layers of assignments that are context specific.
|
||||
|
||||
It’s a similar kind of concept to the leader key, but unlike it, our key table
|
||||
will not automatically deactivate after an action is invoked, so it’ll be a
|
||||
good fit for resizing, where we want to keep pressing the same button over and
|
||||
over again until we’re happy with our pane’s new size.
|
||||
|
||||
With all that… this is easier done that said, so let’s check out the code:
|
||||
|
||||
local function resize_pane(key, direction)
|
||||
return {
|
||||
key = key,
|
||||
action = wezterm.action.AdjustPaneSize { direction, 3 }
|
||||
}
|
||||
end
|
||||
|
||||
config.keys = {
|
||||
-- ... remove the yucky keybinding from above and replace it with this
|
||||
{
|
||||
-- When we push LEADER + R...
|
||||
key = 'r',
|
||||
mods = 'LEADER',
|
||||
-- Activate the `resize_panes` keytable
|
||||
action = wezterm.action.ActivateKeyTable {
|
||||
name = 'resize_panes',
|
||||
-- Ensures the keytable stays active after it handles its
|
||||
-- first keypress.
|
||||
one_shot = false,
|
||||
-- Deactivate the keytable after a timeout.
|
||||
timeout_milliseconds = 1000,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
config.key_tables = {
|
||||
resize_panes = {
|
||||
resize_pane('j', 'Down'),
|
||||
resize_pane('k', 'Up'),
|
||||
resize_pane('h', 'Left'),
|
||||
resize_pane('l', 'Right'),
|
||||
},
|
||||
}
|
||||
|
||||
Now you can push CTRL + A to activate leader, then R to activate the resizing
|
||||
layer… and movement keys to resize to your heart’s content. When 1,000
|
||||
milliseconds have elapsed, you’ll automatically exit the resizing layer and be
|
||||
back to the default keytable.
|
||||
|
||||
WezTerm intensifies…
|
||||
|
||||
(While we’re on multiplexing, if you’re using neovim, I’d recommend checking
|
||||
out [26]smart-splits.nvim - that’ll let you jump between your vim panes and
|
||||
your WezTerm ones).
|
||||
|
||||
Project workspaces
|
||||
|
||||
Okay let’s graduate from WezTerm university with one final assignment… project
|
||||
workspaces.
|
||||
|
||||
I’m often working across a few different projects at a time, and need to be
|
||||
able to quickly switch between them. I want each project to maintain its own
|
||||
multiplexer instance with its own windows, panes, and tabs. In tmux you might
|
||||
achieve this with different sessions. In WezTerm we’ll do it with [27]
|
||||
workspaces.
|
||||
|
||||
Creating and switching between workspaces
|
||||
|
||||
Create a new file in your config directory and call it projects.lua. We’ll use
|
||||
this to provide some project switching functions to our main config file.
|
||||
|
||||
local wezterm = require 'wezterm'
|
||||
local module = {}
|
||||
|
||||
local function project_dirs()
|
||||
return {
|
||||
'~/Projects/mailgrip',
|
||||
'~/Projects/alexplescan.com',
|
||||
'~/Projects/wezterm_love_letters',
|
||||
-- ... keep going, list all your projects
|
||||
-- (or don't if you value your time. we'll improve on this soon)
|
||||
}
|
||||
end
|
||||
|
||||
function module.choose_project()
|
||||
local choices = {}
|
||||
for _, value in ipairs(project_dirs()) do
|
||||
table.insert(choices, { label = value })
|
||||
end
|
||||
|
||||
-- The InputSelector action presents a modal UI for choosing between a set of options
|
||||
-- within WezTerm.
|
||||
return wezterm.action.InputSelector {
|
||||
title = 'Projects',
|
||||
-- The options we wish to choose from
|
||||
choices = choices,
|
||||
-- Yes, we wanna fuzzy search (so typing "alex" will filter down to
|
||||
-- "~/Projects/alexplescan.com")
|
||||
fuzzy = true,
|
||||
-- The action we want to perform. Note that this doesn't have to be a
|
||||
-- static definition as we've done before, but can be a callback that
|
||||
-- evaluates any arbitrary code.
|
||||
action = wezterm.action_callback(function(child_window, child_pane, id, label)
|
||||
-- As a placeholder, we'll log the name of what you picked
|
||||
wezterm.log_info("you chose " .. label)
|
||||
end),
|
||||
}
|
||||
end
|
||||
|
||||
return module
|
||||
|
||||
… and in your wezterm.lua:
|
||||
|
||||
local projects = require 'projects'
|
||||
|
||||
config.keys = {
|
||||
-- ... add these new entries to your config.keys table
|
||||
{
|
||||
key = 'p',
|
||||
mods = 'LEADER',
|
||||
-- Present in to our project picker
|
||||
action = projects.choose_project(),
|
||||
},
|
||||
{
|
||||
key = 'f',
|
||||
mods = 'LEADER',
|
||||
-- Present a list of existing workspaces
|
||||
action = wezterm.action.ShowLauncherArgs { flags = 'FUZZY|WORKSPACES' },
|
||||
},
|
||||
}
|
||||
|
||||
Lots going on here, take your time to read it and the comments. And give it a
|
||||
go! Push LEADER + P, and you’ll see the project input selector come up. Pick a
|
||||
project by highlighting one and pushing ENTER, or push CTRL + C to close the
|
||||
picker. Once you’ve picked a project you’ll see its directory logged to your
|
||||
debug overlay (CTRL + SHIFT + L).
|
||||
|
||||
screenshot of WezTerm's with the workspace switcher we've configured
|
||||
|
||||
Still a couple of issues though… it’s really annoying to type out all your
|
||||
projects by hand in that file, and, uh, what was the other issue? Oh yeah! When
|
||||
you pick a project nothing happens. Okay, let’s fix these. Back in
|
||||
projects.lua, we’ll start by having the list of projects automatically
|
||||
populate.
|
||||
|
||||
-- The directory that contains all your projects.
|
||||
local project_dir = wezterm.home_dir .. "/Projects"
|
||||
|
||||
local function project_dirs()
|
||||
-- Start with your home directory as a project, 'cause you might want
|
||||
-- to jump straight to it sometimes.
|
||||
local projects = { wezterm.home_dir }
|
||||
|
||||
-- WezTerm comes with a glob function! Let's use it to get a lua table
|
||||
-- containing all subdirectories of your project folder.
|
||||
for _, dir in ipairs(wezterm.glob(project_dir .. '/*')) do
|
||||
-- ... and add them to the projects table.
|
||||
table.insert(projects, dir)
|
||||
end
|
||||
|
||||
return projects
|
||||
end
|
||||
|
||||
(This all assumes that you like to keep your projects grouped together in a
|
||||
folder, if not… well you’ve got Lua at your fingertips to implement whatever
|
||||
you want!)
|
||||
|
||||
Now launch the project picker, and what do you see? All those projects staring
|
||||
back at thee.
|
||||
|
||||
One thing left to do, let’s add the functionality that opens your project in a
|
||||
new WezTerm workspace. Still in projects.lua let’s change up choose_project:
|
||||
|
||||
function module.choose_project()
|
||||
local choices = {}
|
||||
for _, value in ipairs(project_dirs()) do
|
||||
table.insert(choices, { label = value })
|
||||
end
|
||||
|
||||
return wezterm.action.InputSelector {
|
||||
title = "Projects",
|
||||
choices = choices,
|
||||
fuzzy = true,
|
||||
action = wezterm.action_callback(function(child_window, child_pane, id, label)
|
||||
-- "label" may be empty if nothing was selected. Don't bother doing anything
|
||||
-- when that happens.
|
||||
if not label then return end
|
||||
|
||||
-- The SwitchToWorkspace action will switch us to a workspace if it already exists,
|
||||
-- otherwise it will create it for us.
|
||||
child_window:perform_action(wezterm.action.SwitchToWorkspace {
|
||||
-- We'll give our new workspace a nice name, like the last path segment
|
||||
-- of the directory we're opening up.
|
||||
name = label:match("([^/]+)$"),
|
||||
-- Here's the meat. We'll spawn a new terminal with the current working
|
||||
-- directory set to the directory that was picked.
|
||||
spawn = { cwd = label },
|
||||
}, child_pane)
|
||||
end),
|
||||
}
|
||||
end
|
||||
|
||||
Try that out, select a new project, and you’ll see a workspace get created for
|
||||
it. Switch back to your default workspace (we bound so LEADER, CTRL + F to show
|
||||
you a list of active workspaces) and you’ll see everything is right where you
|
||||
left it.
|
||||
|
||||
Bonus: improving the powerline, and more colour stuff
|
||||
|
||||
Let’s add a couple of polishing touches to this workflow and then I promise
|
||||
we’ll be done…
|
||||
|
||||
Remember that sad powerline we set up earlier? Let’s make it happier by adding
|
||||
another segment to it which contains the name of the current workspace. In true
|
||||
powerline fashion, each subsequent segment on the powerline will display in a
|
||||
different colour. We’ll explore some of WezTerm’s colour maths support and do
|
||||
this all dynamically based on our theme. Back in wezterm.lua:
|
||||
|
||||
-- Replace the old wezterm.on('update-status', ... function with this:
|
||||
|
||||
local function segments_for_right_status(window)
|
||||
return {
|
||||
window:active_workspace(),
|
||||
wezterm.strftime('%a %b %-d %H:%M'),
|
||||
wezterm.hostname(),
|
||||
}
|
||||
end
|
||||
|
||||
wezterm.on('update-status', function(window, _)
|
||||
local SOLID_LEFT_ARROW = utf8.char(0xe0b2)
|
||||
local segments = segments_for_right_status(window)
|
||||
|
||||
local color_scheme = window:effective_config().resolved_palette
|
||||
-- Note the use of wezterm.color.parse here, this returns
|
||||
-- a Color object, which comes with functionality for lightening
|
||||
-- or darkening the colour (amongst other things).
|
||||
local bg = wezterm.color.parse(color_scheme.background)
|
||||
local fg = color_scheme.foreground
|
||||
|
||||
-- Each powerline segment is going to be coloured progressively
|
||||
-- darker/lighter depending on whether we're on a dark/light colour
|
||||
-- scheme. Let's establish the "from" and "to" bounds of our gradient.
|
||||
local gradient_to, gradient_from = bg
|
||||
if appearance.is_dark() then
|
||||
gradient_from = gradient_to:lighten(0.2)
|
||||
else
|
||||
gradient_from = gradient_to:darken(0.2)
|
||||
end
|
||||
|
||||
-- Yes, WezTerm supports creating gradients, because why not?! Although
|
||||
-- they'd usually be used for setting high fidelity gradients on your terminal's
|
||||
-- background, we'll use them here to give us a sample of the powerline segment
|
||||
-- colours we need.
|
||||
local gradient = wezterm.color.gradient(
|
||||
{
|
||||
orientation = 'Horizontal',
|
||||
colors = { gradient_from, gradient_to },
|
||||
},
|
||||
#segments -- only gives us as many colours as we have segments.
|
||||
)
|
||||
|
||||
-- We'll build up the elements to send to wezterm.format in this table.
|
||||
local elements = {}
|
||||
|
||||
for i, seg in ipairs(segments) do
|
||||
local is_first = i == 1
|
||||
|
||||
if is_first then
|
||||
table.insert(elements, { Background = { Color = 'none' } })
|
||||
end
|
||||
table.insert(elements, { Foreground = { Color = gradient[i] } })
|
||||
table.insert(elements, { Text = SOLID_LEFT_ARROW })
|
||||
|
||||
table.insert(elements, { Foreground = { Color = fg } })
|
||||
table.insert(elements, { Background = { Color = gradient[i] } })
|
||||
table.insert(elements, { Text = ' ' .. seg .. ' ' })
|
||||
end
|
||||
|
||||
window:set_right_status(wezterm.format(elements))
|
||||
end)
|
||||
|
||||
screenshot of WezTerm with an enhanced status line, showing multiple segments
|
||||
in different colours
|
||||
|
||||
WezTerm delivers yet again. This updated callback supports arbitrary numbers of
|
||||
segments for its powerline. We’ve specified 3 but you could add way more. All
|
||||
this without needing to manually configure what colour we want on each segment,
|
||||
but rather have WezTerm do it for us by creating a gradient based on the
|
||||
currently active theme. Some highlights:
|
||||
|
||||
• We use wezterm.color.parse to convert a string containing a hex colour code
|
||||
into a Color object ([28]docs) - this lets us perform more advanced
|
||||
operations on the color.
|
||||
• The colour scheme’s background colour is still what we want to use as the
|
||||
value that our gradient draws to, but to figure out where the gradient
|
||||
should start, we use either color:darken ([29]docs) or color:lighten to
|
||||
create a new colour.
|
||||
• The gradient itself is made with wezterm.color.gradient ([30]docs), which
|
||||
returns a table containing a evenly spaced colours between our gradient_to
|
||||
and gradient_from.
|
||||
• We then iterate over our powerline segments to create the items required
|
||||
for wezterm.format.
|
||||
|
||||
Where to from here?
|
||||
|
||||
There’s a [31]lot more that WezTerm does and that [32]you can do with WezTerm.
|
||||
By now you’ll have a good understanding of WezTerm config fundamentals, but I
|
||||
encourage you to keep exploring!
|
||||
|
||||
If you’ve followed this guide step by step, I’d recommend pruning the config
|
||||
down to things that you’ll actually use, rewriting it in your own style, then
|
||||
start sprinkling in your own stuff. Take ownership of this thing! Make your own
|
||||
beautiful WezTerm snowflake!
|
||||
|
||||
When you want some inspiration for what you could do next, browse through the
|
||||
[33]WezTerm API docs to see what’s possible.
|
||||
|
||||
And if you find that you too really like WezTerm, please consider [34]
|
||||
supporting Wez for his great open-source work.
|
||||
|
||||
Receive an email when I post
|
||||
|
||||
[35][ ] [36][Subscribe]
|
||||
(You'll get no more than one email per post. I manage this list with [37]
|
||||
Buttondown).
|
||||
Want to get in touch? [38]Send me an email, [39]a tweet, or [40]check out my
|
||||
GitHub.
|
||||
How about an email when I next post something? [41]Subscribe to my newsletter.
|
||||
|
||||
This website is [42]open source, and built using [43]Jekyll. Photos are © Alex
|
||||
Plescan (2024).
|
||||
|
||||
|
||||
References:
|
||||
|
||||
[1] https://alexplescan.com/
|
||||
[2] https://alexplescan.com/posts/
|
||||
[3] https://alexplescan.com/projects/
|
||||
[4] https://buttondown.email/alexplescan
|
||||
[5] https://alexplescan.com/posts/2024/08/10/wezterm/
|
||||
[6] https://blog.lambo.land/
|
||||
[7] https://wezfurlong.org/wezterm/
|
||||
[8] https://wezfurlong.org/wezterm/config/lua/general.html
|
||||
[9] https://wezfurlong.org/wezterm/features.html
|
||||
[10] https://gist.github.com/alexpls/83d7af23426c8928402d6d79e72f9401
|
||||
[11] https://wezfurlong.org/wezterm/installation.html
|
||||
[12] https://www.lua.org/start.html
|
||||
[13] https://wezfurlong.org/wezterm/config/files.html#configuration-files
|
||||
[14] https://wezfurlong.org/wezterm/troubleshooting.html#debug-overlay
|
||||
[15] https://wezfurlong.org/wezterm/config/lua/wezterm/home_dir.html
|
||||
[16] https://wezfurlong.org/wezterm/config/appearance.html
|
||||
[17] https://wezfurlong.org/wezterm/config/fonts.html
|
||||
[18] https://wezfurlong.org/wezterm/config/font-shaping.html
|
||||
[19] https://wezfurlong.org/wezterm/config/lua/wezterm/format.html
|
||||
[20] https://wezfurlong.org/wezterm/config/lua/wezterm/hostname.html
|
||||
[21] https://wezfurlong.org/wezterm/config/default-keys.html
|
||||
[22] https://wezfurlong.org/wezterm/config/lua/SpawnCommand.html
|
||||
[23] https://wezfurlong.org/wezterm/config/lua/keyassignment/index.html
|
||||
[24] https://wezfurlong.org/wezterm/config/keys.html#leader-key
|
||||
[25] https://wezfurlong.org/wezterm/config/key-tables.html
|
||||
[26] https://github.com/mrjones2014/smart-splits.nvim
|
||||
[27] https://wezfurlong.org/wezterm/recipes/workspaces.html
|
||||
[28] https://wezfurlong.org/wezterm/config/lua/color/index.html
|
||||
[29] https://wezfurlong.org/wezterm/config/lua/color/darken.html
|
||||
[30] https://wezfurlong.org/wezterm/config/lua/wezterm.color/gradient.html
|
||||
[31] https://wezfurlong.org/wezterm/features.html
|
||||
[32] https://wezfurlong.org/wezterm/config/lua/general.html
|
||||
[33] https://wezfurlong.org/wezterm/config/lua/general.html
|
||||
[34] https://wezfurlong.org/sponsor/
|
||||
[37] https://buttondown.email/
|
||||
[38] https://alexplescan.com/cdn-cgi/l/email-protection#b0d1dcd5c8f0d1dcd5c8c0dcd5c3d3d1de9ed3dfdd
|
||||
[39] https://twitter.com/alexplescan
|
||||
[40] https://github.com/alexpls
|
||||
[41] https://buttondown.email/alexplescan
|
||||
[42] https://github.com/alexpls/alexplescan.com
|
||||
[43] https://jekyllrb.com/
|
||||
200
static/archive/culture-ghost-io-yb12ir.txt
Normal file
200
static/archive/culture-ghost-io-yb12ir.txt
Normal file
@@ -0,0 +1,200 @@
|
||||
[1] Culture: An Owner's Manual
|
||||
[2]
|
||||
Login
|
||||
Jul 29, 2024 7 min read
|
||||
|
||||
Cultural Stasis Produces Fewer Cheesy Relics like Rocky IV
|
||||
|
||||
Cultural Stasis Produces Fewer Cheesy Relics like Rocky IV [4]Let's get ready
|
||||
to crumble
|
||||
|
||||
The much-maligned 1985 boxing film provides a few hints about the causes of
|
||||
21st century artistic stagnation: namely, popular artists now work in a
|
||||
risk-averse creative paradigm that avoids making instantly-outmoded artworks
|
||||
|
||||
Sylvester Stallone’s 1985 film Rocky IV is so infamously schlocky that it’s
|
||||
become a cliché to even discuss its flaws. The Cold War Russia-versus-America
|
||||
plot is cartoonish, and Stallone’s direction is thoroughly over-the-top, from
|
||||
the opening sequence with exploding American and Russian flag boxing gloves to
|
||||
the superfluous montage sequences of pre-existing footage meant to stretch the
|
||||
film to feature length. Compared to other cinematic masterpieces, Rocky IV is
|
||||
not a well-made film, and no one has ever thought it to be. In his
|
||||
contemporaneous review, Roger Ebert called it “a film so predictable that
|
||||
viewing it is like watching one of those old sitcoms where the characters never
|
||||
change and the same situations turn up again and again.”
|
||||
|
||||
But unlike most bad films made in 1985, Rocky IV remains fascinating nearly
|
||||
forty years later. It has great value to us in 2024 as a relic — an artwork
|
||||
that embodies the unique stylistic choices of a particular point in time. Rocky
|
||||
IV is a time-traveling passport to 1985: the Manichaean Reaganite politics, the
|
||||
sassy robot maid, the soundtrack of power ballads and cold digital synths, the
|
||||
artless action-film editing and over-use of freeze-frame fade-outs, the casual
|
||||
lack of verisimilitude in using Wyoming as a stand-in for the Russian
|
||||
countryside.
|
||||
|
||||
There can be good relics, of course. Nothing represents the artistic decisions
|
||||
of 1967 better than Sgt. Pepper’s Lonely Hearts Club Band, and until recently,
|
||||
it was long canonized as the best album of all time. By comparison, almost all
|
||||
of Rocky IV’s bold aesthetic choices quickly soured. Just five years later,
|
||||
movies no longer looked or sounded like Rocky IV, and the end of the Cold War
|
||||
calmed the American spiritual anxiety powering its ridiculous plot. “Eye of the
|
||||
Tiger” became a joke. So did Carl Weathers. And in the last few decades, we’ve
|
||||
seen so many [5]parodies of Eighties montage sequences that it is nearly
|
||||
impossible to watch the originals as earnest filmmaking. The musical montage in
|
||||
the middle of Rocky IV, where Stallone remembers clips from the previous Rocky
|
||||
films, is absolutely ludicrous.
|
||||
|
||||
Watching Rocky IV in 2024, however, was clarifying to me in the ongoing debate
|
||||
around "21st century cultural stasis." The basic argument is that culture is
|
||||
less healthy because there are fewer significant aesthetic changes. This
|
||||
implies a healthy ecosystem produces a large quantity of relics, as new styles
|
||||
outmode old ones. Songs that are "so Eighties" imply that the Nineties rejected
|
||||
all of those artistic choices. In the logic of the stasis narrative, if The
|
||||
Bourne Identity doesn’t scream 2002 with the same volume as Rocky IV screams
|
||||
1985, culture must be slowing down.
|
||||
|
||||
Of course, the 21st century produced many now-outmoded looks: “early 2000s
|
||||
gel-spike-hair guy,” “2012-era pork pie hat speakeasy bartender,” “background
|
||||
extra in Legally Blonde.” At the same time, 2003's “Hey Ya” and "Drop It Like
|
||||
It's Hot" feel timeless rather than ludicrous. The 21st century seems to
|
||||
produce fewer novel aesthetics that humiliate the previous attempt at novel
|
||||
aesthetics.
|
||||
|
||||
Debates about the causes of 21st century cultural stasis always begin by
|
||||
blaming the economy and technology: monopolistic control of the media industry,
|
||||
the hollowing out of the middle class, rising health care costs, algorithmic
|
||||
feeds, the proliferation of media-making tools, etc. These are certainly
|
||||
legitimate factors and set the horizon for our social activity. Yet Rocky IV
|
||||
makes it clear that stasis also must involve how artists think about
|
||||
production. In 1985, Stallone made most choices as director that broke with
|
||||
pre-Eighties filmmaking techniques, and unfortunately for him, very few of
|
||||
these radical decisions became conventional in the future. He swung, and he
|
||||
missed. Compare that with original Rocky director John G. Avildsen who chose to
|
||||
do his film as a grainy, naturalistic underdog story. Both are products of
|
||||
their times, but the original is canonical, while part four is famous as the
|
||||
world's most dated film.
|
||||
|
||||
But Stallone was doing what a lot of 20th century artists felt was their core
|
||||
responsibility: pursuing bold aesthetics. He operated from a vague avant-garde
|
||||
mindset of wanting to make something that felt au courant. A major part of
|
||||
cultural stasis, then, may stem from most artists refusing to embrace
|
||||
contemporary aesthetic choices. In fact, I would argue that the Nineties
|
||||
ushered in a paradigm of rationalized, naturalistic aesthetics anchored in the
|
||||
meta-knowledge that artworks have a longer shelf life when they feel “real” and
|
||||
avoid mannerist/over-indulgent faddish aesthetics.
|
||||
|
||||
Technology and economy do play an indirect role in this change, but there seem
|
||||
to be three values guiding the anti-relic school of art:
|
||||
|
||||
1. A Rejection of Radical Stylization
|
||||
|
||||
In many cultures, art is expected to involve mannerism. Even today older
|
||||
Japanese audiences expect and enjoy “overacting." For maybe the last century,
|
||||
however, Western acting has instead emphasized acting that attempts to recreate
|
||||
real-life human expression.
|
||||
|
||||
This second approach itself is an aesthetic — not the lack of aesthetics. As
|
||||
Susan Sontag wrote in her 1965 essay “On Style,” “There is no neutral,
|
||||
absolutely transparent style.” Hemingway’s bare prose, for example, is its own
|
||||
style. Sontag complained in her day that “Today styles do not develop slowly
|
||||
and succeed each other gradually, over long periods of time which allow the
|
||||
audience for art to assimilate fully the principles of repetition on which the
|
||||
work of art is built; but instead succeed one another so rapidly as to seem to
|
||||
give their audiences no breathing space to prepare.” And perhaps as a backlash
|
||||
to this failure of new aesthetics to stick in the postmodern era, there was a
|
||||
move to naturalism — an attempt to find a common universal artistic language.
|
||||
This meant fewer obvious breaks with the past — and with the future.
|
||||
Alternative music in the 1990s stripped down production back to basic live
|
||||
instrumentation, making it sound like 1970s rock and teenage garage bands. Same
|
||||
goes for fiction: Most contemporary fiction avoids the overly stylized prose of
|
||||
a Woolf, a Gaddis, or a Pynchon, thereby making it seem era-less.
|
||||
|
||||
In clothing, the overall de-formalization of society led to a similar outcome.
|
||||
Men in suits gave the suit industry a literal canvas to direct sequential
|
||||
changes in silhouette, lapel sizes, and jacket lengths. This created clear
|
||||
chronological differences in looks. In a world where the baseline is T-shirts
|
||||
and shorts and the brands/graphics are primary over silhouettes, there is less
|
||||
opportunity for subtle stylizations that mark the eras. A Supreme T-shirt in
|
||||
1998 doesn't look that different than a Supreme T-shirt in 2024.
|
||||
|
||||
2. Rationalization of Techniques
|
||||
|
||||
The cultural industry has always had a core business problem of not being able
|
||||
to anticipate demand for its products. The more these companies can reduce
|
||||
risk, the more they can profit. One way to mitigate risk is to collect audience
|
||||
data and try to create goods that better respond to human psychology. This has
|
||||
produced formulas and templates that increase the odds of success. Streaming TV
|
||||
episodes, for example, mostly end with small cliffhangers so that audiences
|
||||
will click to watch the next one episode immediately.
|
||||
|
||||
This kind of rationalization crowds out the possibility of idiosyncratic
|
||||
choices that can be made by a single auteur (and then sour). Moreover most
|
||||
big-budget films and albums are no longer made by a single person. Big studio
|
||||
productions — especially those made with computer graphics — require massive
|
||||
bureaucratic planning and technocratic decision making. Larger staff numbers
|
||||
are likely to pull the work towards an “average” approach based on time-held
|
||||
conventions.
|
||||
|
||||
3. A Deeper Respect for Pre-Existing Audience Tastes
|
||||
|
||||
Avant-garde art bombarded the audience with aesthetic choices that made them
|
||||
uncomfortable. More naturalistic art avoids this by conforming to the
|
||||
audience's conventional understanding of artistic forms. Everyone knows that a
|
||||
woman singing with an acoustic guitar is "music"; aleatoric composition on a
|
||||
prepared piano requires the audience to work harder.
|
||||
|
||||
Whether meant for market maximization or as a sign of respect for the audience,
|
||||
21st century artists seem more interested in speaking their fans’ pre-existing
|
||||
aesthetic languages rather than pushing them into new styles. This results in
|
||||
the use of more classic artistic techniques. Simon Reynolds’ idea of [6]
|
||||
“retromania” now makes sense as an audience-pleasing strategy. And the more
|
||||
that things pull directly from canonized past artworks, the less they’re likely
|
||||
to end up as embarassing relics. Janelle Monae’s [7]“Tightrope” today sounds
|
||||
like a take on Sixties soul rather than “so 2010.”
|
||||
|
||||
That being said, the overuse of a particular retro sound can become associated
|
||||
with a specific contemporary era. Robin Thicke’s “Blurred Lines” so resembled a
|
||||
[8]Marvin Gaye song that royalties now go to his estate. But as that song
|
||||
became de-canonized, it's now starting to sound “very 2013.” Same for “Uptown
|
||||
Funk” being “very 2014.” Yet I’d still argue that “Blurred Lines” is much
|
||||
weaker as a relic than Rocky IV, which is solely "1985."
|
||||
|
||||
[caomart]
|
||||
|
||||
The question is simply: are artists themselves choosing to reduce aesthetic
|
||||
risk-taking in their art? In an era where past and present songs all exist on
|
||||
the same Spotify playlist, few musical artists would want to create songs that
|
||||
may be ridiculed as passé a few years later. And all artists have the
|
||||
historical knowledge that helps them avoid mistakes of the past like Rocky IV.
|
||||
But this result — a lack of embarrassing relics — is what makes us feel that
|
||||
culture is less healthy. New genres like trap and drill feel vibrant because
|
||||
they outmoded "boom bap," yet it's this vibrancy that puts them at risk of
|
||||
feeling dated in the future. When artists stick with the classics, it's good
|
||||
for stabilizing their careers. But if they don't push for outrageously now
|
||||
sounds, we're left with the feeling of stagnation.
|
||||
|
||||
[9]
|
||||
|
||||
Published by:
|
||||
|
||||
[10] W. David Marx
|
||||
[11] Share [12] Tweet
|
||||
Culture: An Owner's Manual © 2024
|
||||
[13]Published with Ghost
|
||||
[14]
|
||||
|
||||
References:
|
||||
|
||||
[1] https://culture.ghost.io/
|
||||
[2] https://twitter.com/wdavidmarx
|
||||
[4] https://www.youtube.com/watch?v=KrXxGf1lDd0
|
||||
[5] https://www.youtube.com/watch?v=C0Q2F6QYiD4&t=65s&ref=culture.ghost.io
|
||||
[6] https://pitchfork.com/features/paper-trail/8010-paper-trail-simon-reynolds/?ref=culture.ghost.io
|
||||
[7] https://www.youtube.com/watch?v=pwnefUaKCbc&ref=culture.ghost.io
|
||||
[8] https://www.youtube.com/watch?v=iStrNY_8n_U&ref=culture.ghost.io
|
||||
[9] https://culture.ghost.io/culture-is-an-ecosystem-a-manifesto-towards-a-new-cultural-criticism-3/
|
||||
[10] https://culture.ghost.io/author/wdavidmarx/
|
||||
[11] https://www.facebook.com/sharer.php?u=https://culture.ghost.io/cultural-stasis-produces-fewer-cheesy-relics-like-rocky-iv/
|
||||
[12] https://twitter.com/intent/tweet?url=https://culture.ghost.io/cultural-stasis-produces-fewer-cheesy-relics-like-rocky-iv/&text=Cultural%20Stasis%20Produces%20Fewer%20Cheesy%20Relics%20like%20Rocky%20IV
|
||||
[13] https://ghost.org/
|
||||
[14] https://twitter.com/wdavidmarx
|
||||
13
static/archive/doriantaylor-com-ua6hkk.txt
Normal file
13
static/archive/doriantaylor-com-ua6hkk.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
Not Acceptable
|
||||
|
||||
An appropriate representation of the requested resource could not be found on
|
||||
this server.
|
||||
|
||||
Available variants:
|
||||
|
||||
• [1]e64e45a6-7f23-4679-99bd-a88e987aca7e.xml , type application/xml
|
||||
|
||||
|
||||
References:
|
||||
|
||||
[1] https://doriantaylor.com/e64e45a6-7f23-4679-99bd-a88e987aca7e.xml
|
||||
101
static/archive/rachsmith-com-8l0g9q.txt
Normal file
101
static/archive/rachsmith-com-8l0g9q.txt
Normal file
@@ -0,0 +1,101 @@
|
||||
[1]Rach Smith [2]
|
||||
Rach Smith'sdigitalgarden
|
||||
|
||||
• [3]Notes
|
||||
• [4]Tags
|
||||
• [5]About
|
||||
• [6]Subscribe image/svg+xml
|
||||
|
||||
• rainbows[7][ ]
|
||||
• cursor trails[8][ ]
|
||||
• dark mode[9][ ]
|
||||
|
||||
It's okay to lower the bar
|
||||
|
||||
Added: August 13, 2024
|
||||
|
||||
• [10]#journaling
|
||||
|
||||
I had a journal entry in my [11]Hobonichi Techo Cousin for every day this year
|
||||
until July, where I have a string of blank pages.
|
||||
|
||||
I was doing so well, and I was really in to the swing of journaling every day…
|
||||
until I wasn’t.
|
||||
|
||||
The cause? Doing a little too well at journaling, actually. I got inspired by
|
||||
the fancy spreads of other Hobonichi enthusiasts on Instagram, and started
|
||||
making my own pretty layouts. My pages were looking beautiful until things got
|
||||
busy and my mental health/energy [12]took a dive.
|
||||
|
||||
I’d raised the bar for my daily entries, and didn’t have the energy to meet it.
|
||||
But instead of just lowering the bar and going back to boring/ugly entries,
|
||||
perfectionist thinking kicked in. If I couldn’t make it good, why do it at all?
|
||||
|
||||
So I missed a couple of days, at which point the all-or-nothing thinking
|
||||
started up. I’ve broken my journaling streak, why even continue? I’ve basically
|
||||
ruined my Hobonichi now, for the rest of 2024!
|
||||
|
||||
Thankfully, I was eventually able to shake myself out of those thoughts and
|
||||
come back to just getting something, anything on the page at the end of the
|
||||
day. But there was a while there were I really thought I may as well put the
|
||||
journal in the bin.
|
||||
|
||||
I had to remind myself that it’s okay to lower the bar. That an average version
|
||||
of something is better than a perfect version of nothing. All I can do is have
|
||||
a go.
|
||||
|
||||
Thanks for reading! If you'd like to share your thoughts you can [13]leave a
|
||||
comment, [14]send me an email, hit me up [15]on Mastodon, or [16]add an issue
|
||||
on GitHub.
|
||||
|
||||
Comments
|
||||
|
||||
Leave a Comment
|
||||
|
||||
💯 Thanks for submitting your comment! It will appear here after it has been
|
||||
approved.
|
||||
|
||||
Comment (You can use [19]Markdown syntax if you wish) [ ]
|
||||
|
||||
Name[21][ ]
|
||||
|
||||
Website[22][ ]
|
||||
|
||||
URL[23][ ]
|
||||
|
||||
Submit
|
||||
|
||||
Acknowledgement of Country
|
||||
|
||||
I acknowledge the [25]Gubbi Gubbi people, the Traditional Owners of the land
|
||||
and waterways where I live. I would like to pay my respects to Elders past,
|
||||
present and emerging.
|
||||
|
||||
• [26] codepen.io/rachsmith
|
||||
• [27]github.com/rachsmithcodes
|
||||
• [28] mastodon.social/@rachsmith
|
||||
• [29]contact@rachsmith.com
|
||||
|
||||
© 2024 Rachel Smith
|
||||
|
||||
References:
|
||||
|
||||
[1] https://rachsmith.com/
|
||||
[2] https://rachsmith.com/
|
||||
[3] https://rachsmith.com/
|
||||
[4] https://rachsmith.com/tags/
|
||||
[5] https://rachsmith.com/about/
|
||||
[6] https://rachsmith.com/feed.xml
|
||||
[10] https://rachsmith.com/tags/#journaling
|
||||
[11] https://rachsmith.com/hobonichi-techo-cousin/
|
||||
[12] https://rachsmith.com/mnnm-7/
|
||||
[13] https://rachsmith.com/lower-the-bar/#comments
|
||||
[14] mailto:contact@rachsmith.com?subject=re%3A%20It's%20okay%20to%20lower%20the%20bar
|
||||
[15] https://mastodon.social/@rachsmith
|
||||
[16] https://github.com/rachsmithcodes/rachsmith.com/issues
|
||||
[19] https://www.markdownguide.org/basic-syntax/
|
||||
[25] https://gubbigubbidyungungoo.com/gubbi-gubbi-country/
|
||||
[26] https://codepen.io/rachsmith
|
||||
[27] https://github.com/rachsmithcodes
|
||||
[28] https://mastodon.social/@rachsmith
|
||||
[29] mailto:contact@rachsmith.com
|
||||
918
static/archive/snarkmarket-com-axj6mr.txt
Normal file
918
static/archive/snarkmarket-com-axj6mr.txt
Normal file
@@ -0,0 +1,918 @@
|
||||
The murmur of the snarkmatrix…
|
||||
|
||||
Jennifer § [1]Two songs from The Muppet Movie / 2021-02-12 15:53:34
|
||||
A few notes on daily blogging § [2]Stock and flow / 2017-11-20 19:52:47
|
||||
El Stock y Flujo de nuestro negocio. – redmasiva § [3]Stock and flow /
|
||||
2017-03-27 17:35:13
|
||||
Meet the Attendees – edcampoc § [4]The generative web event / 2017-02-27
|
||||
10:18:17
|
||||
Does Your Digital Business Support a Lifestyle You Love? § [5]Stock and flow /
|
||||
2017-02-09 18:15:22
|
||||
Daniel § [6]Stock and flow / 2017-02-06 23:47:51
|
||||
Kanye West, media cyborg – MacDara Conroy § [7]Kanye West, media cyborg /
|
||||
2017-01-18 10:53:08
|
||||
Inventing a game – MacDara Conroy § [8]Inventing a game / 2017-01-18 10:52:33
|
||||
Losing my religion | Mathew Lowry § [9]Stock and flow / 2016-07-11 08:26:59
|
||||
Facebook is wrong, text is deathless – Sitegreek !nfotech § [10]Towards A
|
||||
Theory of Secondary Literacy / 2016-06-20 16:42:52
|
||||
[11]Snarkmarket
|
||||
/ [12]whatmarket?
|
||||
|
||||
[13]Stock and flow
|
||||
/ [14]Robin
|
||||
|
||||
I was an economics major in college, and I’ve been grateful ever since for a
|
||||
few key concepts those courses drilled into me: things like opportunity cost,
|
||||
sunk cost, and marginal cost. I think about this stuff all the time in my
|
||||
everyday life. I think about the sunk cost of waiting for a slow elevator; I
|
||||
think about the marginal cost of making myself another sandwich.
|
||||
|
||||
I think most of all about the concept of stock and flow.
|
||||
|
||||
Do you know about this? It couldn’t be simpler. There are two kinds of
|
||||
quantities in the world. Stock is a static value: money in the bank or trees in
|
||||
the forest. Flow is a rate of change: fifteen dollars an hour or three thousand
|
||||
toothpicks a day. Easy. Too easy.
|
||||
|
||||
But I actually think stock and flow is a useful metaphor for media in the 21st
|
||||
century. Here’s what I mean:
|
||||
|
||||
• Flow is the feed. It’s the posts and the tweets. It’s the stream of daily
|
||||
and sub-daily updates that reminds people you exist.
|
||||
• Stock is the durable stuff. It’s the content you produce that’s as
|
||||
interesting in two months (or two years) as it is today. It’s what people
|
||||
discover via search. It’s what spreads slowly but surely, building fans
|
||||
over time.
|
||||
|
||||
Flow is ascendant these days, for obvious reasons—but I think we neglect stock
|
||||
at our peril. I mean that both in terms of the health of an audience and, like,
|
||||
the health of a soul. Flow is a treadmill, and you can’t spend all of your time
|
||||
running on the treadmill. Well, you can. But then one day you’ll get off and
|
||||
look around and go: oh man. I’ve got nothing here.
|
||||
|
||||
I’m not saying you should ignore flow! This is no time to hole up and work in
|
||||
isolation, emerging after years with your work in hand. Everybody will go: huh?
|
||||
Who are you? And even if they don’t—even if your exquisite opus is the talk of
|
||||
the tumblrs for two whole days—if you don’t have flow to plug your new fans
|
||||
into, you’re suffering a huge (get ready for it!) opportunity cost. You’ll have
|
||||
to find those fans all over again next time you emerge from your cave.
|
||||
|
||||
Here’s a case study. My pal Alexis Madrigal has got the stock/flow balance
|
||||
down. On one end of the spectrum, he’s [15]a Twitter natural and [16]a
|
||||
fast-paced writer. Madrigal’s got mad flow; you plug in, and you get a steady
|
||||
stream of interesting stuff. But on the other end of the spectrum—and man, this
|
||||
is just so important—he’s written a deep, nuanced [17]history of green tech in
|
||||
America. This is a book intended to stand the test of time.
|
||||
|
||||
You can tell that I want you to stop and think about stock here. I feel like we
|
||||
all got really good at flow, really fast. But flow is ephemeral, while stock
|
||||
sticks around. Stock is capital. Stock is protein.
|
||||
|
||||
And the real magic trick is to put them both together. To keep the ball
|
||||
bouncing with your flow—to maintain that open channel of communication—while
|
||||
you work on some kick-ass stock in the background. Sacrifice neither. The
|
||||
hybrid strategy.
|
||||
|
||||
So, I was thinking about stock and flow just now while I was standing in my
|
||||
kitchen doing the dishes, and I thought, wait, there are all these
|
||||
super-successful artists and media people today who don’t think about flow at
|
||||
all. Like, Wes Anderson? Come on. He’s all stock. And he seems to be
|
||||
doing okay.
|
||||
|
||||
But I think the secret is that somebody else does his flow for him. I mean,
|
||||
what are PR and advertising but flow, bought and paid for? Rewind history and
|
||||
put Wes Anderson on his own—proprietor of an extremely symmetrical YouTube
|
||||
channel—and I don’t think you get the same result, not if it’s one video every
|
||||
three years.
|
||||
|
||||
So, if you’re in the position to have somebody else handle your flow while you
|
||||
tend to your stock: great. But that’s true for almost no one, and will I think
|
||||
be true for even fewer over time, so you need to have your own plan for
|
||||
this stuff.
|
||||
|
||||
Anyway, this is not a huge insight, I know. Mostly I just wanted to share the
|
||||
terminology, because it’s been echoing in my head since my first microeconomics
|
||||
course. Today, whenever I put my hands on the keyboard, I’m asking myself: Is
|
||||
this stock? Is this flow? How’s my mix? Do I have enough of both?
|
||||
|
||||
[18]January 18, 2010 / [19]Greatest hits
|
||||
|
||||
[20]73 comments
|
||||
|
||||
[21]Joshua Dance [22]says…
|
||||
|
||||
Great ideas. I feel like most of the “Social Media Guru” people are all flow
|
||||
and no stock. They don’t every produce anything that stands the test of time.
|
||||
And for that matter a lot of bloggers are just flow as well. 33 Ways to Make
|
||||
Money posts get outdated pretty quick. I feel that I also have neglected stock
|
||||
with my own stuff and have trying to get back to more stock producing. Thanks
|
||||
for the great ideas.
|
||||
|
||||
/ [23]Reply
|
||||
[24]Saheli [25]says…
|
||||
|
||||
This is a good mental model, with a nice Anglo-Saxon poetic ring to it, for
|
||||
balancing one’s daily management. Nice.
|
||||
|
||||
/ [26]Reply
|
||||
[27]Robin Sloan [28]says…
|
||||
|
||||
I’m glad you picked up on the linguistics of it. It’s just nice to say: stock
|
||||
and flow.
|
||||
|
||||
[29]PoN [30]says…
|
||||
|
||||
I prefer hustle and flow.
|
||||
|
||||
[31]http://www.pp2g.tv/vZ3pwZnM_.aspx
|
||||
|
||||
/ [32]Reply
|
||||
[33]typofi [34]says…
|
||||
|
||||
Thanks for the lingo!
|
||||
|
||||
I’ve been thinking lately how the flow (I just didn’t have a good word for it
|
||||
before) can be seen as noise (from communication theories) in situations where
|
||||
you are trying to get to the stock.
|
||||
|
||||
I mean moments where you know that the information you seek is out there, but
|
||||
you can’t find what you want because all you get is, as said by Joshua, “33
|
||||
ways of doing x” and tag clouds bursting with #ashtonkutchner, #lol, and #
|
||||
retweetthis. Even if you’re not looking for something in particular, the
|
||||
problem often arises when you are trying to find deeper articles in general.
|
||||
|
||||
I’m not against the social media, far from it. I’m just acknowledging that we
|
||||
need better search algorithms and other tools to balance or even battle the
|
||||
pure attention-seeking flow conventions. (e.g. celebrity gossip, or people
|
||||
blogging top lists and how-to articles just because they know those will
|
||||
attract traffic)
|
||||
|
||||
/ [35]Reply
|
||||
[36]Carlos [37]says…
|
||||
|
||||
Awesome. I think people should think more about the legacy they will leave to
|
||||
the future generations. Could be a small business or some nice paintings,
|
||||
everyone wants to be remembered, and that’s the stock you are talking about
|
||||
here. The flow is the thing that comes in the meantime you are building your
|
||||
stock.
|
||||
|
||||
/ [38]Reply
|
||||
[39]milann [40]says…
|
||||
|
||||
ahahah
|
||||
you took the words out of my mouth.
|
||||
thank you for giving the phantoms in my head some form,
|
||||
me and my business associates have been going about this for months now and it
|
||||
still felt like we were trying to give words to some silent moments in a Godard
|
||||
film or something.
|
||||
|
||||
/ [41]Reply
|
||||
[42]J. Smith [43]says…
|
||||
|
||||
great stuff. couldn’t agree more. file this under “read or die.”
|
||||
|
||||
/ [44]Reply
|
||||
[45]Frank Chimero [46]says…
|
||||
|
||||
This is fantastic, Robin. Really.
|
||||
I get a lot of questions from creatives just beginning (or about to begin) in
|
||||
their respective fields about how to get started promoting themselves.
|
||||
|
||||
I had been using a similar idea, but a poor analogy: you breadcrumb your
|
||||
audience along like Hansel and Gretel did, leading your fans along a trail of
|
||||
small bits of information and tiny delicious morsels of output. It’s important
|
||||
that these tasty morsels have a clear point of view and a consistent flavor.
|
||||
Then, every once in a while, deliver a house of candy. But don’t eat your
|
||||
audience. That’d be bad.
|
||||
|
||||
In retrospect, stock and flow is a way better way to say this.
|
||||
|
||||
/ [47]Reply
|
||||
[48]Robin Sloan [49]says…
|
||||
|
||||
Ha hahahahahaha. I love this. It’s the sinister version of stock. Now I want to
|
||||
come up w/ more analogies. Like,
|
||||
|
||||
flow : stock :: stormtroopers : DEATH STAR
|
||||
|
||||
[50]Basti Hirsch ッ [51]says…
|
||||
|
||||
“Social Media Guru” people are all flow and no stock. It really is fun to say,
|
||||
but I also still love the “all hat and no cattle” idiom.
|
||||
|
||||
Perhaps we need search engines that give us the explicit choice of asking
|
||||
“What’s in stock”? I mean we already do that a bit when deciding to search
|
||||
amazon, delicious, twitter, or Google scholar. Only show me results that have
|
||||
stood the test of time. Words that last.
|
||||
|
||||
/ [52]Reply
|
||||
[53]Robin Sloan [54]says…
|
||||
|
||||
That’s interesting! Some sense of measuring what’s held up… if nothing else, a
|
||||
graph in Google Analytics that shows which content has had a durable audience.
|
||||
Durability is a key word.
|
||||
|
||||
[55]IQpierce [56]says…
|
||||
|
||||
I think that Google already works this way… which might be why it’s so
|
||||
successful.
|
||||
|
||||
In college a professor told me that fundamentally, Google’s algorithm works
|
||||
around the concept of “hubs” and “content.” This is actually a very old idea:
|
||||
because socially, people themselves have always been about “hubs” and
|
||||
“content.” If you’re the socially-awkward brilliant programmer, you’re the
|
||||
content: you can make stuff. If you’re the incredibly outgoing HR lady who
|
||||
seems to know every other person in her industry, you’re a hub.
|
||||
|
||||
Google’s job is to help people get to content; but they do it by using hubs.
|
||||
Kottke.org, twitter posts, blogs – these are hubs/flow that people use to point
|
||||
their friends towards the content/stock – pages of useful information. Google
|
||||
rates a hub higher when it links to high-quality content; and they link content
|
||||
higher when it’s linked-to by a highly-rated hub (in a nice chicken-and-egg
|
||||
paradox).
|
||||
|
||||
JTS [57]says…
|
||||
|
||||
To be honest, there’s a lot of runners who train on treadmills all the time (or
|
||||
a lot of the time), and it can be a fairly effective way of building up miles.
|
||||
So that metaphor is a little confusing.
|
||||
|
||||
Other than that, I think this is a fairly effective way of explaining the
|
||||
relationship that many creatives should have/need to have to the web. I work in
|
||||
publishing, and many of the editors/writers that I interact with on a regular
|
||||
basis are great stock people — it’s what they’ve been doing for decades. They
|
||||
are just not very good at flow. On the other hand, I look at what a lot of
|
||||
other media companies/bloggers/creatives/etc are doing and it looks like a
|
||||
whole lot of flow which feels like a whole lot of spinning of the proverbial
|
||||
wheels. The ideal mix is something like Frank’s relationship as described
|
||||
above.
|
||||
|
||||
/ [58]Reply
|
||||
[59]Robin Sloan [60]says…
|
||||
|
||||
Good point re: treadmills. If I wanted to torture the analogy I could say:
|
||||
“Aha, precisely! Sometimes flow helps you cross-train on your way to making
|
||||
great stock!”—but mostly, I think I just used too many (different/conflicting)
|
||||
analogies 🙂
|
||||
|
||||
[61]Alexis Madrigal [62]says…
|
||||
|
||||
Thanks for the shout out! We need to convene another meeting of the mutual
|
||||
admiration society soon…
|
||||
|
||||
Now that you mention it, here’s how I think about stock and flow. Flow is how I
|
||||
see the world. Stock is what happens when I apply my worldview to something
|
||||
that matters for long enough that I fundamentally transform how I see the
|
||||
world. Recording that process is what creates the thing of lasting value. (I
|
||||
hope.)
|
||||
|
||||
And now, here’s a thought that is related but sort of tangentially. I’ve become
|
||||
obsessed with Tumblr as a medium for historical investigation recently. It’s
|
||||
just so good at defamiliarization in that Bakhtin sense… One minute you’re
|
||||
looking at pony made out of vegan donuts, the next you’re staring at a
|
||||
little-known stunt from 1955. People who would not read David McCullough in a
|
||||
million years suddenly find history fascinating. The strangeness and pastness
|
||||
of the past come to dominate the backcasted ideas that we have about what those
|
||||
times were like.
|
||||
|
||||
But… Tumblr records only the flow of our histories without ever taking stock of
|
||||
why and how we ended up where we are. There is no record of decisions made or
|
||||
the world’s forces brought to bear. Tumblr’s version of history has no
|
||||
explanatory power. It does not synthesize what the images from the past with
|
||||
where we are in the present or with the other things we know of the past. So,
|
||||
to me, the meaning that the flow of photos has is fundamentally limited, even
|
||||
if it’s beautiful and fascinating.
|
||||
|
||||
/ [63]Reply
|
||||
[64]Saheli [65]says…
|
||||
|
||||
|
||||
Flow is how I see the world. Stock is what hap pens when I apply my world
|
||||
view to some thing that mat ters for long enough that I fun da mentally
|
||||
trans form how I see the world. Record ing that process is what cre ates
|
||||
the thing of last ing value.
|
||||
|
||||
D’accord!, she cried, in the most emphatic voice. You describe what I want out
|
||||
of good writing. This is what makes it so magically, and it hits all the points
|
||||
of why I value such stock to begin with.
|
||||
|
||||
Though what the hell, Snarkmarket? What is up with the kerning in “trans form”
|
||||
“fun da mentally” “Record ing” “cre ates” and “last ing” when I just copy and
|
||||
paste? Are you secretly trying to trick me into thinking like some sort of
|
||||
crazed poet? That is a weird way to generate stock.
|
||||
|
||||
[66]Robin Sloan [67]says…
|
||||
|
||||
(They are wee microspaces that allow the words to break gracefully across the
|
||||
page. They only become evident when ungainly humans rip these words from their
|
||||
perfect habitat.)
|
||||
|
||||
[68]Basti Hirsch ッ [69]says…
|
||||
|
||||
“Tumblr’s version of history has no explanatory power.”
|
||||
|
||||
This is a great sentence, and of course also applies to twitter or your daily
|
||||
news segment.
|
||||
|
||||
Ryan McAdam [70]says…
|
||||
|
||||
I understand and agree with stock & flow as it pertains to social media, et al.
|
||||
However, I think you may want to take another look at the premise you use to
|
||||
describe stock. In practice, money is made from thin air in ever increasing
|
||||
amounts. Trees are a natural resource and as such are finite – whether based
|
||||
upon available land, growth cycles, or environmental influences. I’m suspect
|
||||
your friend who is writing about green technology would agree.
|
||||
|
||||
/ [71]Reply
|
||||
[72]TRMW [73]says…
|
||||
|
||||
Thanks for this. Well said.
|
||||
|
||||
/ [74]Reply
|
||||
[75]Nathan Bowers [76]says…
|
||||
|
||||
Speaking of flow, where’s your Twitter feed Robin? Looked around, can’t find
|
||||
it.
|
||||
|
||||
That’s another strength of things like Tumblr and Twitter, it just takes one
|
||||
click to form a lightweight “I want to know more about you” relationship.
|
||||
“Flow” is stickier than “Stock”.
|
||||
|
||||
/ [77]Reply
|
||||
[78]Robin Sloan [79]says…
|
||||
|
||||
I’m [80]@robinsloan! And somewhat discouraged it was hard to find. Hmm.
|
||||
|
||||
You’re totally right about the interplay; when everything’s working together,
|
||||
stock leads to flow leads to stock.
|
||||
|
||||
[81]Tim Maly [82]says…
|
||||
|
||||
I think you’re right on about how we tend to feel like we got good at flow
|
||||
really fast. I’ve also been coming around to thinking that this might often be
|
||||
an illusion. It’s really, really easy to reblog, retweet, reshare without
|
||||
thinking and to clog the flow with stuff that other people have seen or that
|
||||
aren’t on topic (for whatever value of “on topic” you feel like your feed
|
||||
should have).
|
||||
|
||||
This is one of the things that recommends the ‘official’ retweet feature. If
|
||||
dozens of your friends retweet the same thing, you don’t have to see it dozens
|
||||
of times. Think about the nature of the problem that this is solving.
|
||||
|
||||
My watchphrase for the latter quarter of 2009 and all of 2010 is “Less often,
|
||||
higher quality”. I hope that as many of my Quiet Babylon posts as I can manage
|
||||
will be of stock caliber and I’d like to put out at least one project that’s
|
||||
even better. But I think that this needs to apply to the flow work as well. The
|
||||
best feeds are the ones where I am delighted every time there is an update. I
|
||||
aspire to be one of those.
|
||||
|
||||
One of the best things that I ever did for my feelings about my work was to
|
||||
more carefully distinguish between my stock and my flow and to distinguish
|
||||
between even types of flow (I didn’t know that was what they were called at the
|
||||
time). Do I link up my Tumblr with my Twitter with my gReader share with
|
||||
Facebook with my blog? I find that the more I answer “no” to this question, the
|
||||
happier I feel with the output of my work in any given arena, and the more that
|
||||
people who might be interested in what I’m up to can pick and choose how much
|
||||
of the firehose they have to consume.
|
||||
|
||||
This has been an episode of “Tim responds to a comment and ends up
|
||||
pontificating at length about his plans for the year” starring Tim as Tim.
|
||||
|
||||
/ [83]Reply
|
||||
[84]Robin Sloan [85]says…
|
||||
|
||||
My current stock/flow hero (besides A. Madrigal) is [86]Jonathan Harris. Just
|
||||
one photo every day. And each one is great.
|
||||
|
||||
And importantly, as he wanders around & shares this flow of photos, he’s
|
||||
working on generative art projects that end up being totally genre-defining and
|
||||
museum-worthy. Serious stock.
|
||||
|
||||
[87]Alexis Madrigal [88]says…
|
||||
|
||||
And it was you, in fact, who convinced me to unlink my Twitter and Tumblr,
|
||||
which was a fantastic idea. It freed me up to think about my Tumblr as its own
|
||||
thing, not an adjunct to my Twitter flow.
|
||||
|
||||
[89]Adam Rice [90]says…
|
||||
|
||||
This sounds like the stuff that Ben Hammersley has been writing about lately.
|
||||
|
||||
/ [91]Reply
|
||||
Sarah [92]says…
|
||||
|
||||
I was thinking about the same thing yesterday, though not in economic terms,
|
||||
since I was the opposite of an economics major in college. I was feeling a bit
|
||||
worried about the constancy with which we’re all now butting up against the
|
||||
real-time state of our immediate (if virtual) surroundings, and wondering what
|
||||
impact this has on our ability to be truly reflective and to produce writing
|
||||
that represents moments spent *out* of contact with that perpetual flow. We not
|
||||
only need the time to have the realizations that come with distance and
|
||||
reflection, we also need time to examine and articulate them in terms that go
|
||||
beyond the staccato of twitter and tumblr. I don’t generally fall in the camp
|
||||
of people who express an urgent, woeful need to “unplug,” since I don’t like
|
||||
thinking that the majority of my time (during which I’m “plugged in”) is
|
||||
somehow doing me a terrible long-term disservice. However I do think we do
|
||||
ourselves a disservice when we forget to alter our levels of immersion in the
|
||||
real-time networked conversations. It doesn’t have to happen in a cabin in the
|
||||
woods but it’d be awfully sad if it stopped happening altogether.
|
||||
|
||||
/ [93]Reply
|
||||
[94]TheChad [95]says…
|
||||
|
||||
Great post. Your words are invaluable. Finding the right balance between stock
|
||||
and flow is key to being a success and relevant.
|
||||
|
||||
/ [96]Reply
|
||||
[97]JtFaber [98]says…
|
||||
|
||||
Great, pressure is off. I can delegate my tweets to the intern and work on
|
||||
building my… umm… thing, that I do…
|
||||
|
||||
/ [99]Reply
|
||||
[100]Jason Robinson [101]says…
|
||||
|
||||
Really nice post. Extremely relevant when it comes to individuals and small
|
||||
orgs. Although time-consuming (is it in fact cost-beneficial?), balancing stock
|
||||
and flow is clearly a necessary evil in today’s business world.
|
||||
|
||||
What’s also interesting is looking at organizations who facilitate and/or
|
||||
manage stock and flow. The first successful dotcoms created businesses out of
|
||||
“stock” – think Amazon. Twitter and Facebook made huge businesses out of
|
||||
“flow”. Now that I think about it, didn’t Google do this twice – once with
|
||||
indexing a growing number of webpages, the second with YouTube?
|
||||
|
||||
As we look forward, I wonder how many new businesses will make stock out of
|
||||
flow – magazines from blog posts, Google/Bing indexing Twitter feeds. I know
|
||||
this was just a metaphor but I wonder what’s next? The answer could make
|
||||
someone rich.
|
||||
|
||||
/ [102]Reply
|
||||
[103]Dan Conover [104]says…
|
||||
|
||||
I have nothing eloquent to add. I am your geek fanboy. That’s all.
|
||||
|
||||
/ [105]Reply
|
||||
[106]Betty Ann [107]says…
|
||||
|
||||
I would add that in the world of flow and stock a hook (tweetable, quotable,
|
||||
crisp headline, or ? ) embedded in each stock entry gets it into flow.
|
||||
|
||||
/ [108]Reply
|
||||
[109]Robin Sloan [110]says…
|
||||
|
||||
Yes, totally! Designing for flow. Building bridges between stock and flow.
|
||||
|
||||
[111]Tim Maly [112]says…
|
||||
|
||||
I’ve often thought that I’d like Matthew Battles of HILOBROW to write the
|
||||
tweets promoting all my posts. When he does see one worth passing on, his
|
||||
summaries are generally better than mine.
|
||||
|
||||
[113]Saheli [114]says…
|
||||
|
||||
BettyAnn, are you an editor? Because that succinctly summarizes the secret of
|
||||
producing a great magazine that’s also a popular magazine.
|
||||
|
||||
[115]JMO [116]says…
|
||||
|
||||
Thanks for this Robin. It really gets me thinking about what I make and intake.
|
||||
|
||||
I often find myself in the space smack in the middle: I create Flock. I write
|
||||
things. I don’t have the time or discipline to focus and make things that are
|
||||
very durable. Nor do I have the time or discipline to just publish and make a
|
||||
constant Flow. I feel stuck with something that is not good on any front. I
|
||||
write about 1,000 words once a week and nothing seems to stick after hitting
|
||||
publish.
|
||||
|
||||
On top of my day job, I do quite a bit of consuming other people’s Flow and
|
||||
Stock. I value learning and I truly enjoy by daily sit-down with Google Reader.
|
||||
How do you create the balance necessary to have light but constant Flow and
|
||||
solid Stock while still keeping up with everything?
|
||||
|
||||
/ [117]Reply
|
||||
[118]Elizabeth Madrigal [119]says…
|
||||
|
||||
Great piece and I agree, Alexis has got it all.
|
||||
His mom.
|
||||
|
||||
/ [120]Reply
|
||||
[121]Kate [122]says…
|
||||
|
||||
Absolutely brilliant Robin. Thank you, genius person.
|
||||
|
||||
/ [123]Reply
|
||||
[124]Jay [125]says…
|
||||
|
||||
When launching my web design shop’s blog, we divided it along these exact
|
||||
lines. Literally, divided it in half; short, ephemeral posts—i.e. flow—on [126]
|
||||
one side, considered, polished, long-form posts—i.e. stock—on the [127]other
|
||||
side.
|
||||
|
||||
/ [128]Reply
|
||||
[129]Matthew Battles [130]says…
|
||||
|
||||
Coming late to this, feasting on the flow of commentary and its glimmers of
|
||||
great stock beyond. (And thanks for the h/t, Tim—I love tweeting your posts.
|
||||
But my Twitter stream may be even harder to find than Robin’s ;-])
|
||||
|
||||
But I wonder about the analogy a little bit. Because the stock we’re talking
|
||||
about here isn’t exactly like the economist’s stock, is it? I mean, in
|
||||
economics, flow can deplete stock (or add to it, if you’re really lucky). But
|
||||
it seems like our stock kind of feeds on flow—out- as well as in-. Without flow
|
||||
it dies, or fails to thrive, goes dark. If you’ve got your flow on, your stock
|
||||
only grows. And flow’s not a matter of simple exchange, but current, of
|
||||
circuitry. Currency! Flow’s about moving it on down the line.
|
||||
|
||||
You probably know where I’m going with this: “Increase comes to a gift when it
|
||||
moves from second to third party,” writes Lewis Hyde, “not in the simpler
|
||||
passage from first to second. The increase begins when the gift has passed
|
||||
through someone…. Capital earns profit… but gifts that remain gifts do not earn
|
||||
profit, they give increase.”
|
||||
|
||||
It’s like particle and wave, maybe. Increase follows the gift—wavelike, it
|
||||
rides the flow, lighting up everyone’s stock as it goes.
|
||||
|
||||
/ [131]Reply
|
||||
[132]jrome [133]says…
|
||||
|
||||
Stow is flow that’s been stocked.
|
||||
|
||||
/ [134]Reply
|
||||
Kirstin Butler [135]says…
|
||||
|
||||
Hi Robin,
|
||||
|
||||
In just one blog post you defined the heuristic (yup, I wrote that) I’ve been
|
||||
trying to figure out for the last few months. This is proving to be such a
|
||||
difficult balance for me to strike creatively–mostly because the respective
|
||||
returns on stock and flow–dog years vs. immediate–are so different. I find the
|
||||
connection, and dialogue, and real-time feedback around flow to be really
|
||||
addictive.
|
||||
|
||||
I wonder whether there’s a lifelog application that could capture which state
|
||||
you’re in at various points, so that you could review a receipt at the end of
|
||||
the day and then make adjustments.
|
||||
|
||||
Thanks so much for this-
|
||||
Kirstin
|
||||
|
||||
p.s. I thought the blog [136]http://weloveyouso.com/ was a great flow
|
||||
compliment to the stock that is Where the Wild Things Are.
|
||||
|
||||
/ [137]Reply
|
||||
[138]Debbie [139]says…
|
||||
|
||||
Very powerful concepts. You blended economics, about which I know little, with
|
||||
writing, which I’ve been practicing for 36+ years. By doing so, not only did
|
||||
you make economic concepts understandable to me, but palpable. Thank you.
|
||||
|
||||
/ [140]Reply
|
||||
[141]tara - scoutie girl [142]says…
|
||||
|
||||
Spot on. I just adapted the editorial style of my blog to improve my “stock.”
|
||||
Instead of just constantly using a flow of cool stuff to attract page views,
|
||||
I’m concentrating more on stories and people. I think these types of posts
|
||||
automatically have a longer tail.
|
||||
|
||||
I’m also packaging each weeks posts as “issues” so that even the smaller pieces
|
||||
fit into a type of stock.
|
||||
|
||||
Thank you so much for giving me language to explore this idea further!
|
||||
|
||||
/ [143]Reply
|
||||
[144]jane stevens [145]says…
|
||||
|
||||
This is a great way to look at categorizing info, Robin. I think that the best
|
||||
stock is presented in context, in a format where the visual structure adds to
|
||||
the context in the stock. e.g. [146]http://vis.stanford.edu/protovis/ex/
|
||||
jobs.html and many of the other examples on protovis.
|
||||
There’s one more aspect to this that we’ve been working on at LJWorld.com — how
|
||||
to develop a structure for flow & stock so that a local community can use both
|
||||
in an integrated manner to take action to solve local problems.
|
||||
We’re launching a local health site called HealthCommons next month in which
|
||||
we’re integrating social media with journalism in a way that I hope will give
|
||||
the local community the tools to improve community health.
|
||||
|
||||
/ [147]Reply
|
||||
[148]Jen Bekman [149]says…
|
||||
|
||||
Perfect.
|
||||
I think I love you. For your mind, of course.
|
||||
|
||||
/ [150]Reply
|
||||
[151]ToastyKen [152]says…
|
||||
|
||||
I was just thinking that even more fundamental than your stock:flow ratio is
|
||||
your creation:consumption ratio. I spend so much time consuming information and
|
||||
art these days, but not enough time giving back.
|
||||
|
||||
/ [153]Reply
|
||||
[154]Aaron Marshall [155]says…
|
||||
|
||||
If you had a donate button on this post, I would give 20 bucks right now.
|
||||
|
||||
I only heard a verbal summary of it from my friend David ([156]http://
|
||||
designintellection.com) and I was already using “stock and flow” in client
|
||||
meetings.
|
||||
|
||||
BIG thank you.
|
||||
|
||||
/ [157]Reply
|
||||
[158]Alek Tarkowski [159]says…
|
||||
|
||||
hi Robin, I really like the concept of a stock/flow balance. I have two
|
||||
comments on that: 1) it applies not only to production, but also to consumption
|
||||
of content: you need both an intake of flow, and some serious stock; 2) flow
|
||||
can sometimes become stock. have you ever found a new blog and read it from
|
||||
“now” until its beginning, treating it like a one big book? with a good blog,
|
||||
the experience is one of dealing with some serious stock content. Having said
|
||||
that, there’s a limit, I think, to how granular flow can be and still be able
|
||||
to transform into stock – a years worth of twitter stream won’t become stock no
|
||||
matter what (unless you’re a haiku poet). Thanks for this inspiration!
|
||||
|
||||
/ [160]Reply
|
||||
[161]Liz Dorland [162]says…
|
||||
|
||||
Hate to be a nitpicker, but…
|
||||
While I agree that the relationship between the two things is as you describe,
|
||||
one of the words (actually the concept behind the word) doesn’t work.
|
||||
|
||||
The output on twitter and facebook to me much more like a “stream”. The
|
||||
definition that began the piece: “Flow is a rate of change” doesn’t fit. A
|
||||
twitter stream as a whole has no denominator, if you will.
|
||||
|
||||
Using the stream analogy, twitter output is like the water in the stream. There
|
||||
is a quantity of water that passes by, and the total quantity depends on the
|
||||
rate of flow. But the “rate” is not the stream! The scientist in me made me
|
||||
write this post I think. And the late hour. 😉
|
||||
|
||||
Try an electrical analogy. Is the twitter and facebook “stream” measured in
|
||||
amperes, or in coulombs? Ask your favorite physicist. I’m not sure, but I think
|
||||
I vote for coulombs.
|
||||
|
||||
/ [163]Reply
|
||||
[164]Christie Nicholson [165]says…
|
||||
|
||||
Hi Robin, Thought you might be interested in this Globe&Mail article,
|
||||
“Information Rich and Attention Poor” published last fall, that also describes
|
||||
the metaphor of stock and flow.
|
||||
|
||||
[166]http://bit.ly/3oJXjn
|
||||
|
||||
Here’s the relevant p’graph:
|
||||
Knowledge is evolving from a “stock” to a “flow.” Stock and flow – for example,
|
||||
wealth and income – are concepts familiar to accountants and economists. A
|
||||
stock of knowledge may be thought of as a quasi-permanent repository – such as
|
||||
a book or an entire library – whereas the flow is the process of developing the
|
||||
knowledge. The old Encyclopedia Britannica was quintessentially a stock;
|
||||
Wikipedia is the paradigmatic example of flow. Obviously, a stock of knowledge
|
||||
is rarely permanent; it depreciates like any other form of capital. But
|
||||
electronic information technology is profoundly changing the rate of
|
||||
depreciation. By analogy with the 24-hour news cycle (which was an early
|
||||
consequence of the growing abundance of video bandwidth as cable television
|
||||
replaced scarce over-the-air frequencies), there is now the equivalent of a
|
||||
24-hour knowledge cycle – “late-breaking knowledge,” as it were. Knowledge is
|
||||
becoming more like a river than a lake, more and more dominated by the flow
|
||||
than by the stock. What is driving this?
|
||||
|
||||
Then Nicholson goes on to describe the possible (and awesome) drivers behind
|
||||
WHY knowledge has evolved from stock to flow. You say it’s for obvious reasons,
|
||||
but I think the reasons are still quite fascinating and worthwhile.
|
||||
|
||||
(It is an excerpt from a much longer speech he gave at the Fiesole Retreat in
|
||||
Glasgow, Scotland, July ‘09.)
|
||||
|
||||
Interesting stuff!
|
||||
lemme know your thoughts,
|
||||
– christie
|
||||
|
||||
/ [167]Reply
|
||||
Jay [168]says…
|
||||
|
||||
nice post!! i would like to add that it takes time and patience to develop the
|
||||
‘stock’ whereas to develop the ‘flow’ you can start anytime. So one should
|
||||
start working on ‘stock’ asap.
|
||||
I am no economist,so am not sure you’ll agree, but this is what my conclusion
|
||||
is.
|
||||
|
||||
/ [169]Reply
|
||||
[170]Susan Friedmann [171]says…
|
||||
|
||||
Just learned about flow and stock from Dennis Callahan at PodCamp 5. After
|
||||
doing a search I found this post which I absolutely love. It makes so much
|
||||
sense and certainly helps put much of the social media revolution into
|
||||
perspective for me. Thanks!
|
||||
|
||||
/ [172]Reply
|
||||
[173]Arsene Hodali [174]says…
|
||||
|
||||
Hey, just wanted to comment about how much this post inspired me to reflect on
|
||||
my own inner conflicts with media and life.
|
||||
|
||||
I actually wrote about it on my blog in details (1700+ words) and I added my
|
||||
own views to it. Check it out below, see whether or not I’m onto something or
|
||||
just full of crap. And btw, yes this does sound like a shameless self-promotion
|
||||
but…
|
||||
|
||||
–> Stock & Flow: The Hard Part’s The Switch [175]http://ow.ly/34d8q
|
||||
|
||||
/ [176]Reply
|
||||
Jessica [177]says…
|
||||
|
||||
I love this so much. You should know that this idea is still making the
|
||||
conference circuit. I heard about it at the recent Confab content strategy
|
||||
conference. A really helpful analogy – thanks for writing it up so
|
||||
thoughtfully!
|
||||
|
||||
/ [178]Reply
|
||||
Daniel [179]says…
|
||||
|
||||
Briliant, thanks. I like the cornerstone content concept that Copyblogger put
|
||||
together. So it’s the stock, and then the flow is essential. Value content over
|
||||
time.
|
||||
|
||||
/ [180]Reply
|
||||
|
||||
References:
|
||||
|
||||
[1] https://snarkmarket.com/2021/8283#comment-593203
|
||||
[2] https://snarkmarket.com/2010/4890#comment-577756
|
||||
[3] https://snarkmarket.com/2010/4890#comment-571194
|
||||
[4] https://snarkmarket.com/2010/5979#comment-570664
|
||||
[5] https://snarkmarket.com/2010/4890#comment-569688
|
||||
[6] https://snarkmarket.com/2010/4890#comment-569555
|
||||
[7] https://snarkmarket.com/2010/6262#comment-568744
|
||||
[8] https://snarkmarket.com/2011/6811#comment-568743
|
||||
[9] https://snarkmarket.com/2010/4890#comment-552719
|
||||
[10] https://snarkmarket.com/2009/3115#comment-551896
|
||||
[11] https://snarkmarket.com/
|
||||
[12] https://snarkmarket.com/2010/4890/#what
|
||||
[13] https://snarkmarket.com/2010/4890
|
||||
[14] https://snarkmarket.com/author/robin
|
||||
[15] http://twitter.com/alexismadrigal
|
||||
[16] https://www.theatlantic.com/author/alexis-madrigal/
|
||||
[17] http://www.greentechhistory.com/
|
||||
[18] https://snarkmarket.com/2010/4890
|
||||
[19] https://snarkmarket.com/category/greatest-hits
|
||||
[20] https://snarkmarket.com/2010/4890/#comments
|
||||
[21] http://www.joshuadance.com/
|
||||
[22] https://snarkmarket.com/2010/4890#comment-7243
|
||||
[23] https://snarkmarket.com/2010/4890?replytocom=7243#respond
|
||||
[24] http://www.sahelidatta.com/
|
||||
[25] https://snarkmarket.com/2010/4890#comment-7244
|
||||
[26] https://snarkmarket.com/2010/4890?replytocom=7244#respond
|
||||
[27] http://robinsloan.com/
|
||||
[28] https://snarkmarket.com/2010/4890#comment-7245
|
||||
[29] http://pointsofnote.com/
|
||||
[30] https://snarkmarket.com/2010/4890#comment-7246
|
||||
[31] http://www.pp2g.tv/vZ3pwZnM_.aspx
|
||||
[32] https://snarkmarket.com/2010/4890?replytocom=7246#respond
|
||||
[33] http://www.parafovea.com/
|
||||
[34] https://snarkmarket.com/2010/4890#comment-7247
|
||||
[35] https://snarkmarket.com/2010/4890?replytocom=7247#respond
|
||||
[36] http://desparchando.com/
|
||||
[37] https://snarkmarket.com/2010/4890#comment-7248
|
||||
[38] https://snarkmarket.com/2010/4890?replytocom=7248#respond
|
||||
[39] http://stompingintheyard.blogspot.com,milann.blogspot.com/
|
||||
[40] https://snarkmarket.com/2010/4890#comment-7249
|
||||
[41] https://snarkmarket.com/2010/4890?replytocom=7249#respond
|
||||
[42] http://twitter.com/jdotsmith
|
||||
[43] https://snarkmarket.com/2010/4890#comment-7250
|
||||
[44] https://snarkmarket.com/2010/4890?replytocom=7250#respond
|
||||
[45] http://www.frankchimero.com/
|
||||
[46] https://snarkmarket.com/2010/4890#comment-7251
|
||||
[47] https://snarkmarket.com/2010/4890?replytocom=7251#respond
|
||||
[48] http://robinsloan.com/
|
||||
[49] https://snarkmarket.com/2010/4890#comment-7252
|
||||
[50] http://twitter.com/cervus
|
||||
[51] https://snarkmarket.com/2010/4890#comment-7253
|
||||
[52] https://snarkmarket.com/2010/4890?replytocom=7253#respond
|
||||
[53] http://robinsloan.com/
|
||||
[54] https://snarkmarket.com/2010/4890#comment-7262
|
||||
[55] http://deepplaid.com/
|
||||
[56] https://snarkmarket.com/2010/4890#comment-7270
|
||||
[57] https://snarkmarket.com/2010/4890#comment-7254
|
||||
[58] https://snarkmarket.com/2010/4890?replytocom=7254#respond
|
||||
[59] http://robinsloan.com/
|
||||
[60] https://snarkmarket.com/2010/4890#comment-7263
|
||||
[61] http://www.greentechhistory.com/
|
||||
[62] https://snarkmarket.com/2010/4890#comment-7255
|
||||
[63] https://snarkmarket.com/2010/4890?replytocom=7255#respond
|
||||
[64] http://www.sahelidatta.com/
|
||||
[65] https://snarkmarket.com/2010/4890#comment-7276
|
||||
[66] http://robinsloan.com/
|
||||
[67] https://snarkmarket.com/2010/4890#comment-7277
|
||||
[68] http://twitter.com/cervus
|
||||
[69] https://snarkmarket.com/2010/4890#comment-7283
|
||||
[70] https://snarkmarket.com/2010/4890#comment-7256
|
||||
[71] https://snarkmarket.com/2010/4890?replytocom=7256#respond
|
||||
[72] http://trmw.org/
|
||||
[73] https://snarkmarket.com/2010/4890#comment-7257
|
||||
[74] https://snarkmarket.com/2010/4890?replytocom=7257#respond
|
||||
[75] http://uxhero.com/
|
||||
[76] https://snarkmarket.com/2010/4890#comment-7258
|
||||
[77] https://snarkmarket.com/2010/4890?replytocom=7258#respond
|
||||
[78] http://robinsloan.com/
|
||||
[79] https://snarkmarket.com/2010/4890#comment-7261
|
||||
[80] http://twitter.com/robinsloan
|
||||
[81] http://quietbabylon.com/
|
||||
[82] https://snarkmarket.com/2010/4890#comment-7260
|
||||
[83] https://snarkmarket.com/2010/4890?replytocom=7260#respond
|
||||
[84] http://robinsloan.com/
|
||||
[85] https://snarkmarket.com/2010/4890#comment-7264
|
||||
[86] http://www.number27.org/today.php
|
||||
[87] http://www.greentechhistory.com/
|
||||
[88] https://snarkmarket.com/2010/4890#comment-7265
|
||||
[89] http://8stars.org/
|
||||
[90] https://snarkmarket.com/2010/4890#comment-7266
|
||||
[91] https://snarkmarket.com/2010/4890?replytocom=7266#respond
|
||||
[92] https://snarkmarket.com/2010/4890#comment-7267
|
||||
[93] https://snarkmarket.com/2010/4890?replytocom=7267#respond
|
||||
[94] http://thechadblog.com/
|
||||
[95] https://snarkmarket.com/2010/4890#comment-7268
|
||||
[96] https://snarkmarket.com/2010/4890?replytocom=7268#respond
|
||||
[97] http://twitter.com/JtFaber
|
||||
[98] https://snarkmarket.com/2010/4890#comment-7269
|
||||
[99] https://snarkmarket.com/2010/4890?replytocom=7269#respond
|
||||
[100] http://www.planetyou.net/
|
||||
[101] https://snarkmarket.com/2010/4890#comment-7271
|
||||
[102] https://snarkmarket.com/2010/4890?replytocom=7271#respond
|
||||
[103] http://danconover.com/
|
||||
[104] https://snarkmarket.com/2010/4890#comment-7272
|
||||
[105] https://snarkmarket.com/2010/4890?replytocom=7272#respond
|
||||
[106] http://bettyann.tumblr.com/
|
||||
[107] https://snarkmarket.com/2010/4890#comment-7273
|
||||
[108] https://snarkmarket.com/2010/4890?replytocom=7273#respond
|
||||
[109] http://robinsloan.com/
|
||||
[110] https://snarkmarket.com/2010/4890#comment-7275
|
||||
[111] http://quietbabylon.com/
|
||||
[112] https://snarkmarket.com/2010/4890#comment-7278
|
||||
[113] http://www.sahelidatta.com/
|
||||
[114] https://snarkmarket.com/2010/4890#comment-7280
|
||||
[115] http://jmoswalt.com/
|
||||
[116] https://snarkmarket.com/2010/4890#comment-7274
|
||||
[117] https://snarkmarket.com/2010/4890?replytocom=7274#respond
|
||||
[118] http://greenlandlady.com/
|
||||
[119] https://snarkmarket.com/2010/4890#comment-7279
|
||||
[120] https://snarkmarket.com/2010/4890?replytocom=7279#respond
|
||||
[121] http://mccaffery.ca/kate2.0/
|
||||
[122] https://snarkmarket.com/2010/4890#comment-7281
|
||||
[123] https://snarkmarket.com/2010/4890?replytocom=7281#respond
|
||||
[124] http://www.fullstopinteractive.com/
|
||||
[125] https://snarkmarket.com/2010/4890#comment-7282
|
||||
[126] http://www.fullstopinteractive.com/blog/#/full-exposure
|
||||
[127] http://www.fullstopinteractive.com/blog/#/full-disclosure
|
||||
[128] https://snarkmarket.com/2010/4890?replytocom=7282#respond
|
||||
[129] http://hilobrow.com/
|
||||
[130] https://snarkmarket.com/2010/4890#comment-7284
|
||||
[131] https://snarkmarket.com/2010/4890?replytocom=7284#respond
|
||||
[132] http://lessonsinordinary.blogspot.com/
|
||||
[133] https://snarkmarket.com/2010/4890#comment-7285
|
||||
[134] https://snarkmarket.com/2010/4890?replytocom=7285#respond
|
||||
[135] https://snarkmarket.com/2010/4890#comment-7286
|
||||
[136] http://weloveyouso.com/
|
||||
[137] https://snarkmarket.com/2010/4890?replytocom=7286#respond
|
||||
[138] http://breathingcolorintoteal.com/
|
||||
[139] https://snarkmarket.com/2010/4890#comment-7287
|
||||
[140] https://snarkmarket.com/2010/4890?replytocom=7287#respond
|
||||
[141] http://www.scoutiegirl.com/
|
||||
[142] https://snarkmarket.com/2010/4890#comment-7288
|
||||
[143] https://snarkmarket.com/2010/4890?replytocom=7288#respond
|
||||
[144] http://www.rejurno.com/
|
||||
[145] https://snarkmarket.com/2010/4890#comment-7289
|
||||
[146] http://vis.stanford.edu/protovis/ex/jobs.html
|
||||
[147] https://snarkmarket.com/2010/4890?replytocom=7289#respond
|
||||
[148] http://www.personism.com/
|
||||
[149] https://snarkmarket.com/2010/4890#comment-7290
|
||||
[150] https://snarkmarket.com/2010/4890?replytocom=7290#respond
|
||||
[151] http://subjunctive.net/
|
||||
[152] https://snarkmarket.com/2010/4890#comment-7291
|
||||
[153] https://snarkmarket.com/2010/4890?replytocom=7291#respond
|
||||
[154] http://aaronmarshall.co.za/
|
||||
[155] https://snarkmarket.com/2010/4890#comment-7292
|
||||
[156] http://designintellection.com/
|
||||
[157] https://snarkmarket.com/2010/4890?replytocom=7292#respond
|
||||
[158] http://creativecommons.pl/
|
||||
[159] https://snarkmarket.com/2010/4890#comment-7293
|
||||
[160] https://snarkmarket.com/2010/4890?replytocom=7293#respond
|
||||
[161] http://visualization.ning.com/
|
||||
[162] https://snarkmarket.com/2010/4890#comment-7295
|
||||
[163] https://snarkmarket.com/2010/4890?replytocom=7295#respond
|
||||
[164] http://www.christienicholson.com/
|
||||
[165] https://snarkmarket.com/2010/4890#comment-7297
|
||||
[166] http://bit.ly/3oJXjn
|
||||
[167] https://snarkmarket.com/2010/4890?replytocom=7297#respond
|
||||
[168] https://snarkmarket.com/2010/4890#comment-7299
|
||||
[169] https://snarkmarket.com/2010/4890?replytocom=7299#respond
|
||||
[170] http://www.richesinniches.com/
|
||||
[171] https://snarkmarket.com/2010/4890#comment-7300
|
||||
[172] https://snarkmarket.com/2010/4890?replytocom=7300#respond
|
||||
[173] http://www.danceproof.com/
|
||||
[174] https://snarkmarket.com/2010/4890#comment-7301
|
||||
[175] http://ow.ly/34d8q
|
||||
[176] https://snarkmarket.com/2010/4890?replytocom=7301#respond
|
||||
[177] https://snarkmarket.com/2010/4890#comment-7308
|
||||
[178] https://snarkmarket.com/2010/4890?replytocom=7308#respond
|
||||
[179] https://snarkmarket.com/2010/4890#comment-569555
|
||||
[180] https://snarkmarket.com/2010/4890?replytocom=569555#respond
|
||||
Reference in New Issue
Block a user